summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt
diff options
context:
space:
mode:
authorEmmanuel Dreyfus <manu@netbsd.org>2014-08-16 02:32:49 +0200
committerVijay Bellur <vbellur@redhat.com>2014-08-25 23:06:34 -0700
commit4bbaf4615be673dec70fc3e1f127139b6d079869 (patch)
treeef161d12f290e0ba2bf88fe3e77484bd368c19e1 /xlators/mgmt
parentc2a0e3f722583731599785d16f12be5b3472934b (diff)
Fix glustershd detection on volume restart
On NetBSD and FreeBSD, doing a 'gluster volume start $volume force' causes NFS server, quotad, snapd and glustershd to be undetected by glusterd once the volume has restarted. 'gluster volume status' shows the three processes as 'N' in the online column, while they have been launched successfully. This happens because glusterd attempts to connect to its child processes just between the child does a unlink() on the socket in __socket_server_bind() and the time it calls bind() and listen(). Different scheduling policy may explain why the problem does not happen on Linux, but it may pop up some day since we make no guaranteed assumptions here. This patchet works this around by introducing a boolean transport.socket.ignore-enoent option, set by nfs and glustershd, which prevents ENOENT to be fatal and cause glusterd to retry and suceed later. Behavior of other clients is unaffected. BUG: 1129939 Change-Id: Ifdc4d45b2513743ed42ee235a5c61a086321644c Signed-off-by: Emmanuel Dreyfus <manu@netbsd.org> Reviewed-on: http://review.gluster.org/8403 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Niels de Vos <ndevos@redhat.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/mgmt')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-utils.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index 352cf21748e..f84bdbe7208 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -6018,6 +6018,15 @@ glusterd_nodesvc_connect (char *server, char *socketpath)
600);
if (ret)
goto out;
+
+ if (!strcmp(server, "glustershd") ||
+ !strcmp(server, "nfs") ||
+ !strcmp(server, "quotad")) {
+ ret = dict_set_str(options, "transport.socket.ignore-enoent", "on");
+ if (ret)
+ goto out;
+ }
+
ret = glusterd_rpc_create (&rpc, options,
glusterd_nodesvc_rpc_notify,
server);
@@ -13229,6 +13238,11 @@ glusterd_snapd_connect (glusterd_volinfo_t *volinfo, char *socketpath)
if (ret)
goto out;
+ ret = dict_set_str(options,
+ "transport.socket.ignore-enoent", "on");
+ if (ret)
+ goto out;
+
glusterd_volinfo_ref (volinfo);
synclock_unlock (&priv->big_lock);