summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--glusterfsd/src/glusterfsd.c7
-rw-r--r--libglusterfs/src/run.c12
-rw-r--r--rpc/rpc-lib/src/rpcsvc.c61
-rw-r--r--rpc/rpc-transport/socket/src/socket.c4
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-messages.h11
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-utils.c22
-rw-r--r--xlators/protocol/server/src/server.c3
7 files changed, 71 insertions, 49 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c
index 09ba9cd8086..81bc15b8b28 100644
--- a/glusterfsd/src/glusterfsd.c
+++ b/glusterfsd/src/glusterfsd.c
@@ -1316,7 +1316,7 @@ cleanup_and_exit (int signum)
trav = trav->next;
}
- exit(0);
+ exit(signum);
}
@@ -2196,6 +2196,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) {
@@ -2232,7 +2233,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 70ebcc54fb6..c625a5b99de 100644
--- a/libglusterfs/src/run.c
+++ b/libglusterfs/src/run.c
@@ -339,13 +339,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;
}
@@ -359,7 +359,7 @@ runner_end_reuse (runner_t *runner)
}
}
- return ret;
+ return -ret;
}
int
@@ -388,8 +388,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 f4cff12762f..05d269609c5 100644
--- a/rpc/rpc-lib/src/rpcsvc.c
+++ b/rpc/rpc-lib/src/rpcsvc.c
@@ -1580,43 +1580,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)
{
@@ -1654,9 +1617,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;
}
@@ -1759,7 +1736,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 8301f79c5dc..8cdec00f642 100644
--- a/rpc/rpc-transport/socket/src/socket.c
+++ b/rpc/rpc-transport/socket/src/socket.c
@@ -878,6 +878,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;
}
}
@@ -3349,7 +3351,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() */
sys_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 b49d87da1bf..61ba7bd3179 100644
--- a/xlators/mgmt/glusterd/src/glusterd-messages.h
+++ b/xlators/mgmt/glusterd/src/glusterd-messages.h
@@ -41,7 +41,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 */
@@ -4641,6 +4641,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 5f04cba15db..c6d2dd52ebd 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -1808,6 +1808,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) {
@@ -1899,6 +1901,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 75b208c98c0..99874acae72 100644
--- a/xlators/protocol/server/src/server.c
+++ b/xlators/protocol/server/src/server.c
@@ -1059,7 +1059,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,