summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/bugs/glusterd/bug-1213295-snapd-svc-uninitialized.t26
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-snapd-svc.c11
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-snapshot.c1
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-store.c8
4 files changed, 35 insertions, 11 deletions
diff --git a/tests/bugs/glusterd/bug-1213295-snapd-svc-uninitialized.t b/tests/bugs/glusterd/bug-1213295-snapd-svc-uninitialized.t
new file mode 100644
index 00000000000..1dbfdf8697b
--- /dev/null
+++ b/tests/bugs/glusterd/bug-1213295-snapd-svc-uninitialized.t
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+. $(dirname $0)/../../include.rc
+. $(dirname $0)/../../cluster.rc
+
+cleanup
+
+TEST launch_cluster 2;
+TEST $CLI_1 peer probe $H2;
+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count
+
+TEST $CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0
+TEST $CLI_1 volume start $V0
+
+kill_glusterd 2
+TEST start_glusterd 2
+
+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count
+
+#volume stop should not crash
+TEST $CLI_2 volume stop $V0
+
+# check whether glusterd instance is running on H2 as this is the node which
+# restored the volume configuration after a restart
+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count
+cleanup
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c b/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c
index d1a7da7e0ae..7e63929f28e 100644
--- a/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c
+++ b/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c
@@ -319,17 +319,6 @@ glusterd_snapdsvc_restart ()
GF_ASSERT (conf);
cds_list_for_each_entry (volinfo, &conf->volumes, vol_list) {
- /* Init per volume snapd svc */
- ret = glusterd_snapdsvc_init (volinfo);
- if (ret) {
- gf_log (this->name, GF_LOG_ERROR, "snapd service "
- "initialization failed for volume %s",
- volinfo->volname);
- goto out;
- }
- gf_log (this->name, GF_LOG_DEBUG, "snapd service initialized "
- "for %s", volinfo->volname);
-
/* Start per volume snapd svc */
if (volinfo->status == GLUSTERD_STATUS_STARTED &&
glusterd_is_snapd_enabled (volinfo)) {
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
index 476bfb8e017..7280a12d0cd 100644
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
@@ -6072,6 +6072,7 @@ glusterd_snapshot_clone_commit (dict_t *dict, char **op_errstr,
goto out;
}
ret = glusterd_snapdsvc_init (snap_vol);
+
glusterd_list_add_order (&snap_vol->vol_list, &priv->volumes,
glusterd_compare_volume_name);
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c
index fdf3365056b..0beae3e8bbf 100644
--- a/xlators/mgmt/glusterd/src/glusterd-store.c
+++ b/xlators/mgmt/glusterd/src/glusterd-store.c
@@ -2950,6 +2950,14 @@ glusterd_store_retrieve_volume (char *volname, glusterd_snap_t *snap)
if (snap)
volinfo->is_snap_volume = _gf_true;
+ /* Initialize the snapd service */
+ ret = glusterd_snapdsvc_init (volinfo);
+ if (ret) {
+ gf_log (this->name, GF_LOG_ERROR, "Failed to initialize snapd "
+ "service for volume %s", volinfo->volname);
+ goto out;
+ }
+
ret = glusterd_store_update_volinfo (volinfo);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "Failed to update volinfo "