diff options
-rw-r--r-- | glusterfsd/src/glusterfsd.c | 7 | ||||
-rw-r--r-- | libglusterfs/src/run.c | 12 | ||||
-rw-r--r-- | rpc/rpc-lib/src/rpcsvc.c | 61 | ||||
-rw-r--r-- | rpc/rpc-transport/socket/src/socket.c | 4 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-messages.h | 11 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 22 | ||||
-rw-r--r-- | xlators/protocol/server/src/server.c | 3 |
7 files changed, 71 insertions, 49 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index a9561224b72..ac2dcf1c2fe 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -1305,7 +1305,7 @@ cleanup_and_exit (int signum) } } - exit(0); + exit(signum); } @@ -2185,6 +2185,7 @@ glusterfs_process_volfp (glusterfs_ctx_t *ctx, FILE *fp) glusterfs_graph_t *graph = NULL; int ret = -1; xlator_t *trav = NULL; + int err = 0; graph = glusterfs_graph_construct (fp); if (!graph) { @@ -2221,7 +2222,9 @@ out: if (ret && !ctx->active) { glusterfs_graph_destroy (graph); /* there is some error in setting up the first graph itself */ - cleanup_and_exit (0); + err = -ret; + sys_write (ctx->daemon_pipe[1], (void *) &err, sizeof (err)); + cleanup_and_exit (err); } return ret; diff --git a/libglusterfs/src/run.c b/libglusterfs/src/run.c index 7c237b35fa0..17da3ad1201 100644 --- a/libglusterfs/src/run.c +++ b/libglusterfs/src/run.c @@ -338,13 +338,13 @@ int runner_end_reuse (runner_t *runner) { int i = 0; - int ret = -1; + int ret = 1; int chstat = 0; if (runner->chpid > 0) { if (waitpid (runner->chpid, &chstat, 0) == runner->chpid) { if (WIFEXITED(chstat)) { - ret = -WEXITSTATUS(chstat); + ret = WEXITSTATUS(chstat); } else { ret = chstat; } @@ -358,7 +358,7 @@ runner_end_reuse (runner_t *runner) } } - return ret; + return -ret; } int @@ -387,8 +387,12 @@ runner_run_generic (runner_t *runner, int (*rfin)(runner_t *runner)) int ret = 0; ret = runner_start (runner); + if (ret) + goto out; + ret = rfin (runner); - return -(rfin (runner) || ret); +out: + return ret; } int diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c index daf1932b90d..b0eea194347 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -1584,43 +1584,6 @@ rpcsvc_transport_peeraddr (rpc_transport_t *trans, char *addrstr, int addrlen, sasize); } - -rpc_transport_t * -rpcsvc_transport_create (rpcsvc_t *svc, dict_t *options, char *name) -{ - int ret = -1; - rpc_transport_t *trans = NULL; - - trans = rpc_transport_load (svc->ctx, options, name); - if (!trans) { - gf_log (GF_RPCSVC, GF_LOG_WARNING, "cannot create listener, " - "initing the transport failed"); - goto out; - } - - ret = rpc_transport_listen (trans); - if (ret == -1) { - gf_log (GF_RPCSVC, GF_LOG_WARNING, - "listening on transport failed"); - goto out; - } - - ret = rpc_transport_register_notify (trans, rpcsvc_notify, svc); - if (ret == -1) { - gf_log (GF_RPCSVC, GF_LOG_WARNING, "registering notify failed"); - goto out; - } - - ret = 0; -out: - if ((ret == -1) && (trans)) { - rpc_transport_disconnect (trans); - trans = NULL; - } - - return trans; -} - rpcsvc_listener_t * rpcsvc_listener_alloc (rpcsvc_t *svc, rpc_transport_t *trans) { @@ -1658,9 +1621,23 @@ rpcsvc_create_listener (rpcsvc_t *svc, dict_t *options, char *name) goto out; } - trans = rpcsvc_transport_create (svc, options, name); + trans = rpc_transport_load (svc->ctx, options, name); if (!trans) { - /* LOG TODO */ + gf_log (GF_RPCSVC, GF_LOG_WARNING, "cannot create listener, " + "initing the transport failed"); + goto out; + } + + ret = rpc_transport_listen (trans); + if (ret == -EADDRINUSE || ret == -1) { + gf_log (GF_RPCSVC, GF_LOG_WARNING, + "listening on transport failed"); + goto out; + } + + ret = rpc_transport_register_notify (trans, rpcsvc_notify, svc); + if (ret == -1) { + gf_log (GF_RPCSVC, GF_LOG_WARNING, "registering notify failed"); goto out; } @@ -1763,7 +1740,11 @@ out: GF_FREE (transport_name); - return count; + if (count > 0) { + return count; + } else { + return ret; + } } diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c index 74b9dd26681..0752fee9575 100644 --- a/rpc/rpc-transport/socket/src/socket.c +++ b/rpc/rpc-transport/socket/src/socket.c @@ -883,6 +883,8 @@ __socket_server_bind (rpc_transport_t *this) if (errno == EADDRINUSE) { gf_log (this->name, GF_LOG_ERROR, "Port is already in use"); + + ret = -EADDRINUSE; } } @@ -3354,7 +3356,7 @@ socket_listen (rpc_transport_t *this) ret = __socket_server_bind (this); - if (ret == -1) { + if ((ret == -EADDRINUSE) || (ret == -1)) { /* logged inside __socket_server_bind() */ close (priv->sock); priv->sock = -1; diff --git a/xlators/mgmt/glusterd/src/glusterd-messages.h b/xlators/mgmt/glusterd/src/glusterd-messages.h index cfcd114749b..83e3e16fd20 100644 --- a/xlators/mgmt/glusterd/src/glusterd-messages.h +++ b/xlators/mgmt/glusterd/src/glusterd-messages.h @@ -46,7 +46,7 @@ #define GLUSTERD_COMP_BASE GLFS_MSGID_GLUSTERD -#define GLFS_NUM_MESSAGES 573 +#define GLFS_NUM_MESSAGES 575 #define GLFS_MSGID_END (GLUSTERD_COMP_BASE + GLFS_NUM_MESSAGES + 1) /* Messaged with message IDs */ @@ -4646,6 +4646,15 @@ */ #define GD_MSG_FILE_NOT_FOUND (GLUSTERD_COMP_BASE + 574) +/*! + * @messageid 106575 + * @diagnosis Brick failed to start with given port, hence it gets a fresh port + * on its own and try to restart the brick with a new port + * @recommendedaction Ensure the new port is not blocked by firewall + */ + +#define GD_MSG_RETRY_WITH_NEW_PORT (GLUSTERD_COMP_BASE + 575) + /*------------*/ #define glfs_msg_end_x GLFS_MSGID_END, "Invalid: End of messages" #endif /* !_GLUSTERD_MESSAGES_H_ */ diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 7d9333feb7a..43a4898536b 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1745,6 +1745,8 @@ glusterd_volume_start_glusterfs (glusterd_volinfo_t *volinfo, writing the valgrind log to the same file. */ GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, exp_path); + +retry: runinit (&runner); if (priv->valgrind) { @@ -1836,6 +1838,26 @@ glusterd_volume_start_glusterfs (glusterd_volinfo_t *volinfo, ret = runner_run (&runner); synclock_lock (&priv->big_lock); + if (ret == -EADDRINUSE) { + /* retry after getting a new port */ + gf_msg (this->name, GF_LOG_WARNING, -ret, + GD_MSG_SRC_BRICK_PORT_UNAVAIL, + "Port %d is used by other process", port); + + port = pmap_registry_alloc (this); + if (!port) { + gf_msg (this->name, GF_LOG_CRITICAL, 0, + GD_MSG_NO_FREE_PORTS, + "Couldn't allocate a port"); + ret = -1; + goto out; + } + gf_msg (this->name, GF_LOG_NOTICE, 0, + GD_MSG_RETRY_WITH_NEW_PORT, + "Retrying to start brick %s with new port %d", + brickinfo->path, port); + goto retry; + } } else { ret = runner_run_nowait (&runner); } diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c index 347a5fb5814..3d0440e7167 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -1072,7 +1072,8 @@ init (xlator_t *this) gf_msg (this->name, GF_LOG_WARNING, 0, PS_MSG_RPCSVC_LISTENER_CREATE_FAILED, "creation of listener failed"); - ret = -1; + if (ret != -EADDRINUSE) + ret = -1; goto out; } else if (ret < total_transport) { gf_msg (this->name, GF_LOG_ERROR, 0, |