diff options
Diffstat (limited to 'xlators')
-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 |
3 files changed, 34 insertions, 2 deletions
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, |