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 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,  | 
