summaryrefslogtreecommitdiffstats
path: root/glusterfsd/src/glusterfsd-mgmt.c
diff options
context:
space:
mode:
Diffstat (limited to 'glusterfsd/src/glusterfsd-mgmt.c')
-rw-r--r--glusterfsd/src/glusterfsd-mgmt.c65
1 files changed, 43 insertions, 22 deletions
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c
index c47fa3883c9..556b82742cb 100644
--- a/glusterfsd/src/glusterfsd-mgmt.c
+++ b/glusterfsd/src/glusterfsd-mgmt.c
@@ -1903,9 +1903,14 @@ mgmt_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,
switch (event) {
case RPC_CLNT_DISCONNECT:
- GF_LOG_OCCASIONALLY (log_ctr1, "glusterfsd-mgmt", GF_LOG_ERROR,
- "failed to connect with remote-host: %s (%s)",
- ctx->cmd_args.volfile_server, strerror (errno));
+ ctx->cmd_args.connect_attempts++;
+
+ gf_log ("glusterfsd-mgmt", GF_LOG_ERROR,
+ "Connect attempt with remote-host: %s (%s) (%u/%d)",
+ ctx->cmd_args.volfile_server,
+ strerror (errno),
+ ctx->cmd_args.connect_attempts,
+ ctx->cmd_args.max_connect_attempts);
if (!rpc->disabled) {
/*
* Check if dnscache is exhausted for current server
@@ -1916,8 +1921,14 @@ mgmt_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,
break;
}
}
+
+ /* If we run out of servers, AND we attempted to connect
+ * max connect times, then we should return ENOTCONN
+ */
server = ctx->cmd_args.curr_server;
- if (server->list.next == &ctx->cmd_args.volfile_servers) {
+ if ((ctx->cmd_args.connect_attempts >=
+ ctx->cmd_args.max_connect_attempts) &&
+ server->list.next == &ctx->cmd_args.volfile_servers) {
if (!ctx->active)
need_term = 1;
emval = ENOTCONN;
@@ -1926,24 +1937,33 @@ mgmt_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,
"Exhausted all volfile servers");
break;
}
- server = list_entry (server->list.next, typeof(*server), list);
- ctx->cmd_args.curr_server = server;
- ctx->cmd_args.volfile_server = server->volfile_server;
-
- ret = dict_set_str (rpc_trans->options, "remote-host",
- server->volfile_server);
- if (ret != 0) {
- gf_log ("glusterfsd-mgmt", GF_LOG_ERROR,
- "failed to set remote-host: %s",
+
+ /* If we exceed the # of connect attempts, we should
+ * move onto the next server
+ */
+ if (ctx->cmd_args.connect_attempts >=
+ ctx->cmd_args.max_connect_attempts || !server) {
+ server = list_entry (server->list.next,
+ typeof(*server), list);
+ ctx->cmd_args.curr_server = server;
+ ctx->cmd_args.volfile_server = server->volfile_server;
+
+ ret = dict_set_str (rpc_trans->options, "remote-host",
+ server->volfile_server);
+ if (ret != 0) {
+ gf_log ("glusterfsd-mgmt", GF_LOG_ERROR,
+ "failed to set remote-host: %s",
+ server->volfile_server);
+ if (!ctx->active)
+ need_term = 1;
+ emval = ENOTCONN;
+ break;
+ }
+ ctx->cmd_args.connect_attempts = 0;
+ gf_log ("glusterfsd-mgmt", GF_LOG_INFO,
+ "connecting to next volfile server %s",
server->volfile_server);
- if (!ctx->active)
- need_term = 1;
- emval = ENOTCONN;
- break;
}
- gf_log ("glusterfsd-mgmt", GF_LOG_INFO,
- "connecting to next volfile server %s",
- server->volfile_server);
break;
case RPC_CLNT_CONNECT:
rpc_clnt_set_connected (&((struct rpc_clnt*)ctx->mgmt)->conn);
@@ -1960,7 +1980,7 @@ mgmt_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,
}
}
-
+ ctx->cmd_args.connect_attempts = 0;
if (is_mgmt_rpc_reconnect)
glusterfs_mgmt_pmap_signin (ctx);
@@ -2136,7 +2156,8 @@ glusterfs_mgmt_init (glusterfs_ctx_t *ctx)
!strcmp (cmd_args->volfile_server_transport, "unix")) {
ret = rpc_transport_unix_options_build (&options, host, 0);
} else {
- ret = rpc_transport_inet_options_build (&options, host, port);
+ ret = rpc_transport_inet_options_build (&options, host, port,
+ NULL);
}
if (ret)
goto out;