2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-25 15:07:05 +00:00

ovsdb-server: Open --listen sockets before detaching.

This prevents a race condition in a command sequence that starts
ovsdb-server and then immediately connects to it with ovsdb-client.
This commit is contained in:
Ben Pfaff
2009-12-03 14:20:33 -08:00
parent ae25e4b6ad
commit 6dea5eaf5c
3 changed files with 21 additions and 18 deletions

View File

@@ -89,23 +89,15 @@ ovsdb_jsonrpc_server_create(struct ovsdb *db)
return server;
}
int
ovsdb_jsonrpc_server_listen(struct ovsdb_jsonrpc_server *svr, const char *name)
void
ovsdb_jsonrpc_server_listen(struct ovsdb_jsonrpc_server *svr,
struct pstream *pstream)
{
struct pstream *pstream;
int error;
error = pstream_open(name, &pstream);
if (error) {
return error;
}
if (svr->n_listeners >= svr->allocated_listeners) {
svr->listeners = x2nrealloc(svr->listeners, &svr->allocated_listeners,
sizeof *svr->listeners);
}
svr->listeners[svr->n_listeners++] = pstream;
return 0;
}
void

View File

@@ -17,11 +17,12 @@
#define OVSDB_JSONRPC_SERVER_H 1
struct ovsdb;
struct pstream;
struct ovsdb_jsonrpc_server *ovsdb_jsonrpc_server_create(struct ovsdb *);
int ovsdb_jsonrpc_server_listen(struct ovsdb_jsonrpc_server *,
const char *name);
void ovsdb_jsonrpc_server_listen(struct ovsdb_jsonrpc_server *,
struct pstream *);
void ovsdb_jsonrpc_server_connect(struct ovsdb_jsonrpc_server *,
const char *name);

View File

@@ -60,6 +60,7 @@ main(int argc, char *argv[])
struct unixctl_server *unixctl;
struct ovsdb_jsonrpc_server *jsonrpc;
struct svec active, passive;
struct pstream **listeners;
struct ovsdb_error *error;
struct ovsdb *db;
const char *name;
@@ -78,6 +79,18 @@ main(int argc, char *argv[])
parse_options(argc, argv, &file_name, &active, &passive, &unixctl_path);
/* Open all the passive sockets before detaching, to avoid race with
* processes that start up later. */
listeners = xmalloc(passive.n * sizeof *listeners);
for (i = 0; i < passive.n; i++) {
int error;
error = pstream_open(passive.names[i], &listeners[i]);
if (error) {
ovs_fatal(error, "failed to listen on \"%s\"", passive.names[i]);
}
}
if (get_detach() && is_chdir_enabled()) {
/* We need to skip chdir("/") in daemonize() and do it later, because
* we need to open the database and possible set up up Unix domain
@@ -101,11 +114,8 @@ main(int argc, char *argv[])
SVEC_FOR_EACH (i, name, &active) {
ovsdb_jsonrpc_server_connect(jsonrpc, name);
}
SVEC_FOR_EACH (i, name, &passive) {
retval = ovsdb_jsonrpc_server_listen(jsonrpc, name);
if (retval) {
ovs_fatal(retval, "failed to listen on %s", name);
}
for (i = 0; i < passive.n; i++) {
ovsdb_jsonrpc_server_listen(jsonrpc, listeners[i]);
}
svec_destroy(&active);
svec_destroy(&passive);