d1681e
From cbdc0b38c18583852fc9b2ca79ea5fdfa92c6ed5 Mon Sep 17 00:00:00 2001
d1681e
From: Sunny Kumar <sunkumar@redhat.com>
d1681e
Date: Mon, 27 Nov 2017 14:24:55 +0530
d1681e
Subject: [PATCH 085/128] snapshot: Issue with other processes accessing the
d1681e
 mounted brick
d1681e
d1681e
Added code for unmount of activated snapshot brick during snapshot
d1681e
deactivation process which make sense as mount point for deactivated
d1681e
bricks should not exist.
d1681e
d1681e
Removed code for mounting newly created snapshot, as newly created
d1681e
snapshots should not mount until it is activated.
d1681e
d1681e
Added code for mount point creation and snapshot mount during snapshot
d1681e
activation.
d1681e
d1681e
Added validation during glusterd init for mounting only those snapshot
d1681e
whose status is either STARTED or RESTORED.
d1681e
d1681e
During snapshot restore, mount point for stopped snap should exist as
d1681e
it is required to set extended attribute.
d1681e
d1681e
During handshake, after getting updates from friend mount point for
d1681e
activated snapshot should exist and should not for deactivated
d1681e
snapshot.
d1681e
d1681e
While getting snap status we should show relevent information for
d1681e
deactivated snapshots, after this pathch 'gluster snap status' command
d1681e
will show output like-
d1681e
d1681e
Snap Name : snap1
d1681e
Snap UUID : snap-uuid
d1681e
d1681e
	Brick Path        :   server1:/run/gluster/snaps/snap-vol-name/brick
d1681e
	Volume Group      :   N/A (Deactivated Snapshot)
d1681e
	Brick Running     :   No
d1681e
	Brick PID         :   N/A
d1681e
	Data Percentage   :   N/A
d1681e
	LV Size           :   N/A
d1681e
d1681e
Fixes: #276
d1681e
d1681e
>BUG: 1482023
d1681e
>Signed-off-by: Sunny Kumar <sunkumar@redhat.com>
d1681e
upstream patch : https://review.gluster.org/18047
d1681e
d1681e
Change-Id: I65783488e35fac43632615ce1b8ff7b8e84834dc
d1681e
BUG: 1464150
d1681e
Signed-off-by: Sunny Kumar <sunkumar@redhat.com>
d1681e
Reviewed-on: https://code.engineering.redhat.com/gerrit/124305
d1681e
Tested-by: RHGS Build Bot <nigelb@redhat.com>
d1681e
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
d1681e
---
d1681e
 .../bug-1322772-real-path-fix-for-snapshot.t       |   1 +
d1681e
 ...e-with-other-processes-accessing-mounted-path.t | 114 ++++++++++++++++
d1681e
 .../mgmt/glusterd/src/glusterd-snapshot-utils.c    |  85 ++++++++++++
d1681e
 .../mgmt/glusterd/src/glusterd-snapshot-utils.h    |   3 +
d1681e
 xlators/mgmt/glusterd/src/glusterd-snapshot.c      | 145 ++++++++++++++++-----
d1681e
 xlators/mgmt/glusterd/src/glusterd-store.c         |  25 ++--
d1681e
 xlators/mgmt/glusterd/src/glusterd-store.h         |   4 +
d1681e
 7 files changed, 333 insertions(+), 44 deletions(-)
d1681e
 create mode 100644 tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t
d1681e
d1681e
diff --git a/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t b/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t
d1681e
index bf625ec..488bd46 100644
d1681e
--- a/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t
d1681e
+++ b/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t
d1681e
@@ -26,6 +26,7 @@ EXPECT 'Started' volinfo_field $V0 'Status'
d1681e
 TEST $CLI volume start $V1
d1681e
 EXPECT 'Started' volinfo_field $V1 'Status'
d1681e
 
d1681e
+TEST $CLI snapshot config activate-on-create enable
d1681e
 TEST $CLI snapshot create ${V0}_snap $V0 no-timestamp
d1681e
 TEST $CLI snapshot create ${V1}_snap $V1 no-timestamp
d1681e
 
d1681e
diff --git a/tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t b/tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t
d1681e
new file mode 100644
d1681e
index 0000000..c5a0088
d1681e
--- /dev/null
d1681e
+++ b/tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t
d1681e
@@ -0,0 +1,114 @@
d1681e
+#!/bin/bash
d1681e
+
d1681e
+. $(dirname $0)/../../volume.rc
d1681e
+. $(dirname $0)/../../snapshot.rc
d1681e
+. $(dirname $0)/../../include.rc
d1681e
+. $(dirname $0)/../../cluster.rc
d1681e
+
d1681e
+function create_snapshots() {
d1681e
+        $CLI_1 snapshot create ${V0}_snap ${V0} no-timestamp &
d1681e
+        PID_1=$!
d1681e
+
d1681e
+        $CLI_1 snapshot create ${V1}_snap ${V1} no-timestamp &
d1681e
+        PID_2=$!
d1681e
+
d1681e
+        wait $PID_1 $PID_2
d1681e
+}
d1681e
+
d1681e
+function activate_snapshots() {
d1681e
+        $CLI_1 snapshot activate ${V0}_snap &
d1681e
+        PID_1=$!
d1681e
+
d1681e
+        $CLI_1 snapshot activate ${V1}_snap &
d1681e
+        PID_2=$!
d1681e
+
d1681e
+        wait $PID_1 $PID_2
d1681e
+}
d1681e
+
d1681e
+function deactivate_snapshots() {
d1681e
+        $CLI_1 snapshot deactivate ${V0}_snap &
d1681e
+        PID_1=$!
d1681e
+
d1681e
+        $CLI_1 snapshot deactivate ${V1}_snap &
d1681e
+        PID_2=$!
d1681e
+
d1681e
+        wait $PID_1 $PID_2
d1681e
+}
d1681e
+cleanup;
d1681e
+
d1681e
+TEST verify_lvm_version;
d1681e
+# Create cluster with 3 nodes
d1681e
+TEST launch_cluster 3;
d1681e
+TEST setup_lvm 3
d1681e
+
d1681e
+TEST $CLI_1 peer probe $H2;
d1681e
+TEST $CLI_1 peer probe $H3;
d1681e
+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count;
d1681e
+
d1681e
+# Create volumes
d1681e
+TEST $CLI_1 volume create $V0 $H1:$L1
d1681e
+TEST $CLI_2 volume create $V1 $H2:$L2 $H3:$L3
d1681e
+
d1681e
+# Start volumes
d1681e
+TEST $CLI_1 volume start $V0
d1681e
+TEST $CLI_2 volume start $V1
d1681e
+
d1681e
+TEST $CLI_1 snapshot config activate-on-create enable
d1681e
+
d1681e
+# Snapshot Operations
d1681e
+create_snapshots
d1681e
+
d1681e
+EXPECT 'Started' snapshot_status ${V0}_snap;
d1681e
+EXPECT 'Started' snapshot_status ${V1}_snap;
d1681e
+
d1681e
+deactivate_snapshots
d1681e
+
d1681e
+EXPECT 'Stopped' snapshot_status ${V0}_snap;
d1681e
+EXPECT 'Stopped' snapshot_status ${V1}_snap;
d1681e
+
d1681e
+activate_snapshots
d1681e
+
d1681e
+EXPECT 'Started' snapshot_status ${V0}_snap;
d1681e
+EXPECT 'Started' snapshot_status ${V1}_snap;
d1681e
+
d1681e
+# This Function will get snap id form snap info command and will
d1681e
+# check for mount point in system against snap id.
d1681e
+function mounted_snaps
d1681e
+{
d1681e
+        snap_id=`$CLI_1 snap info $1_snap | grep "Snap Volume Name" |
d1681e
+                  awk -F ":" '{print $2}'`
d1681e
+        echo `mount | grep $snap_id | wc -l`
d1681e
+}
d1681e
+
d1681e
+EXPECT "1" mounted_snaps ${V0}
d1681e
+EXPECT "2" mounted_snaps ${V1}
d1681e
+
d1681e
+deactivate_snapshots
d1681e
+
d1681e
+EXPECT "0" mounted_snaps ${V0}
d1681e
+EXPECT "0" mounted_snaps ${V1}
d1681e
+
d1681e
+# This part of test is designed to validate that updates are properly being
d1681e
+# handled during handshake.
d1681e
+
d1681e
+activate_snapshots
d1681e
+kill_glusterd 2
d1681e
+deactivate_snapshots
d1681e
+TEST start_glusterd 2
d1681e
+
d1681e
+# Updates form friend should reflect as snap was deactivated while glusterd
d1681e
+# process was inactive and mount point should also not exist.
d1681e
+
d1681e
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" mounted_snaps ${V0}
d1681e
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" mounted_snaps ${V1}
d1681e
+
d1681e
+kill_glusterd 2
d1681e
+activate_snapshots
d1681e
+TEST start_glusterd 2
d1681e
+
d1681e
+# Updates form friend should reflect as snap was activated while glusterd
d1681e
+# process was inactive and mount point should exist.
d1681e
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" mounted_snaps ${V0}
d1681e
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" mounted_snaps ${V1}
d1681e
+
d1681e
+cleanup;
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
d1681e
index 2a0d321..3f03d2b 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
d1681e
@@ -1678,7 +1678,21 @@ glusterd_import_friend_snap (dict_t *peer_data, int32_t snap_count,
d1681e
                                 "for snap %s", peer_snap_name);
d1681e
                         goto out;
d1681e
                 }
d1681e
+                /* During handshake, after getting updates from friend mount
d1681e
+                 * point for activated snapshot should exist and should not
d1681e
+                 * for deactivated snapshot.
d1681e
+                 */
d1681e
                 if (glusterd_is_volume_started (snap_vol)) {
d1681e
+                        ret = glusterd_recreate_vol_brick_mounts (this,
d1681e
+                                                                  snap_vol);
d1681e
+                        if (ret) {
d1681e
+                                gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
+                                        GD_MSG_BRK_MNT_RECREATE_FAIL,
d1681e
+                                        "Failed to recreate brick mounts"
d1681e
+                                        " for %s", snap->snapname);
d1681e
+                                goto out;
d1681e
+                        }
d1681e
+
d1681e
                         (void) glusterd_start_bricks (snap_vol);
d1681e
                         ret = glusterd_store_volinfo
d1681e
                                                (snap_vol,
d1681e
@@ -1692,6 +1706,13 @@ glusterd_import_friend_snap (dict_t *peer_data, int32_t snap_count,
d1681e
                         }
d1681e
                 } else {
d1681e
                         (void) glusterd_stop_bricks(snap_vol);
d1681e
+                        ret = glusterd_snap_unmount(this, snap_vol);
d1681e
+                        if (ret) {
d1681e
+                                gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
+                                        GD_MSG_GLUSTERD_UMOUNT_FAIL,
d1681e
+                                        "Failed to unmounts for %s",
d1681e
+                                        snap->snapname);
d1681e
+                        }
d1681e
                 }
d1681e
 
d1681e
                 ret = glusterd_import_quota_conf (peer_data, i,
d1681e
@@ -3347,6 +3368,70 @@ out:
d1681e
         return ret;
d1681e
 }
d1681e
 
d1681e
+/* This function will do unmount for snaps.
d1681e
+ */
d1681e
+int32_t
d1681e
+glusterd_snap_unmount (xlator_t  *this, glusterd_volinfo_t *volinfo)
d1681e
+{
d1681e
+        char                    *brick_mount_path    = NULL;
d1681e
+        glusterd_brickinfo_t    *brickinfo           = NULL;
d1681e
+        int32_t                  ret                 = -1;
d1681e
+        int                      retry_count         = 0;
d1681e
+
d1681e
+        GF_ASSERT (this);
d1681e
+        GF_ASSERT (volinfo);
d1681e
+
d1681e
+        cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) {
d1681e
+                /* If the brick is not of this node, we continue */
d1681e
+                if (gf_uuid_compare (brickinfo->uuid, MY_UUID)) {
d1681e
+                        continue;
d1681e
+                }
d1681e
+                /* If snapshot is pending, we continue */
d1681e
+                if  (brickinfo->snap_status == -1) {
d1681e
+                        continue;
d1681e
+                }
d1681e
+
d1681e
+                /* Fetch the brick mount path from the brickinfo->path */
d1681e
+                ret = glusterd_get_brick_root (brickinfo->path,
d1681e
+                                               &brick_mount_path);
d1681e
+                if (ret) {
d1681e
+                        gf_msg (this->name, GF_LOG_INFO, 0,
d1681e
+                                GD_MSG_BRICK_PATH_UNMOUNTED,
d1681e
+                                "Failed to find brick_mount_path for %s",
d1681e
+                                brickinfo->path);
d1681e
+                        /* There is chance that brick path is already
d1681e
+                         * unmounted. */
d1681e
+                        ret = 0;
d1681e
+                        goto out;
d1681e
+                }
d1681e
+                /* unmount cannot be done when the brick process is still in
d1681e
+                 * the process of shutdown, so give three re-tries
d1681e
+                 */
d1681e
+                retry_count = 0;
d1681e
+                while (retry_count <= 2) {
d1681e
+                        retry_count++;
d1681e
+                        /* umount2 system call doesn't cleanup mtab entry
d1681e
+                         * after un-mount, using external umount command.
d1681e
+                         */
d1681e
+                        ret = glusterd_umount(brick_mount_path);
d1681e
+                        if (!ret)
d1681e
+                                break;
d1681e
+                        gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
+                                GD_MSG_GLUSTERD_UMOUNT_FAIL, "umount failed "
d1681e
+                                "for path %s (brick: %s): %s. Retry(%d)",
d1681e
+                                 brick_mount_path, brickinfo->path,
d1681e
+                                 strerror (errno), retry_count);
d1681e
+                        sleep (3);
d1681e
+               }
d1681e
+        }
d1681e
+
d1681e
+out:
d1681e
+        if (brick_mount_path)
d1681e
+                GF_FREE(brick_mount_path);
d1681e
+
d1681e
+        return ret;
d1681e
+}
d1681e
+
d1681e
 int32_t
d1681e
 glusterd_umount (const char *path)
d1681e
 {
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h
d1681e
index e050166..814bf4a 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h
d1681e
@@ -76,6 +76,9 @@ int32_t
d1681e
 glusterd_umount (const char *path);
d1681e
 
d1681e
 int32_t
d1681e
+glusterd_snap_unmount (xlator_t  *this, glusterd_volinfo_t *volinfo);
d1681e
+
d1681e
+int32_t
d1681e
 glusterd_add_snapshots_to_export_dict (dict_t *peer_data);
d1681e
 
d1681e
 int32_t
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
d1681e
index c38d2ff..275abe3 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
d1681e
@@ -872,6 +872,17 @@ glusterd_snapshot_restore (dict_t *dict, char **op_errstr, dict_t *rsp_dict)
d1681e
                                 goto out;
d1681e
                         }
d1681e
                 }
d1681e
+                /* During snapshot restore, mount point for stopped snap
d1681e
+                 * should exist as it is required to set extended attribute.
d1681e
+                 */
d1681e
+                ret = glusterd_recreate_vol_brick_mounts (this, snap_volinfo);
d1681e
+                if (ret) {
d1681e
+                        gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
+                                GD_MSG_BRK_MNT_RECREATE_FAIL,
d1681e
+                                "Failed to recreate brick mounts for %s",
d1681e
+                                snap->snapname);
d1681e
+                                goto out;
d1681e
+                }
d1681e
 
d1681e
                 ret = gd_restore_snap_volume (dict, rsp_dict, parent_volinfo,
d1681e
                                               snap_volinfo, volcount);
d1681e
@@ -5195,13 +5206,17 @@ glusterd_take_brick_snapshot (dict_t *dict, glusterd_volinfo_t *snap_vol,
d1681e
         char                   *origin_brick_path   = NULL;
d1681e
         char                    key[PATH_MAX]       = "";
d1681e
         int32_t                 ret                 = -1;
d1681e
+        gf_boolean_t            snap_activate       = _gf_false;
d1681e
         xlator_t               *this                = NULL;
d1681e
+        glusterd_conf_t        *priv                = NULL;
d1681e
 
d1681e
         this = THIS;
d1681e
+        priv = this->private;
d1681e
         GF_ASSERT (this);
d1681e
         GF_ASSERT (dict);
d1681e
         GF_ASSERT (snap_vol);
d1681e
         GF_ASSERT (brickinfo);
d1681e
+        GF_ASSERT (priv);
d1681e
 
d1681e
         if (strlen(brickinfo->device_path) == 0) {
d1681e
                 gf_msg (this->name, GF_LOG_ERROR, EINVAL,
d1681e
@@ -5245,16 +5260,23 @@ glusterd_take_brick_snapshot (dict_t *dict, glusterd_volinfo_t *snap_vol,
d1681e
                  */
d1681e
         }
d1681e
 
d1681e
-        /* create the complete brick here */
d1681e
-        ret = glusterd_snap_brick_create (snap_vol, brickinfo,
d1681e
-                                          brick_count, clone);
d1681e
-        if (ret) {
d1681e
-                gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
-                        GD_MSG_BRICK_CREATION_FAIL, "not able to"
d1681e
-                        " create the brick for the snap %s"
d1681e
-                        ", volume %s", snap_vol->snapshot->snapname,
d1681e
-                        snap_vol->volname);
d1681e
-                goto out;
d1681e
+        /* create the complete brick here in case of clone and
d1681e
+         * activate-on-create configuration.
d1681e
+         */
d1681e
+        snap_activate = dict_get_str_boolean (priv->opts,
d1681e
+                                              GLUSTERD_STORE_KEY_SNAP_ACTIVATE,
d1681e
+                                              _gf_false);
d1681e
+        if (clone || snap_activate) {
d1681e
+                ret = glusterd_snap_brick_create (snap_vol, brickinfo,
d1681e
+                                                  brick_count, clone);
d1681e
+                if (ret) {
d1681e
+                        gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
+                                GD_MSG_BRICK_CREATION_FAIL, "not able to "
d1681e
+                                "create the brick for the snap %s, volume %s",
d1681e
+                                snap_vol->snapshot->snapname,
d1681e
+                                snap_vol->volname);
d1681e
+                        goto out;
d1681e
+                }
d1681e
         }
d1681e
 
d1681e
 out:
d1681e
@@ -6126,8 +6148,10 @@ glusterd_snapshot_activate_commit (dict_t *dict, char **op_errstr,
d1681e
         char                     *snapname             = NULL;
d1681e
         glusterd_snap_t          *snap                 = NULL;
d1681e
         glusterd_volinfo_t       *snap_volinfo         = NULL;
d1681e
+        glusterd_brickinfo_t     *brickinfo            = NULL;
d1681e
         xlator_t                 *this                 = NULL;
d1681e
-        int                      flags                 = 0;
d1681e
+        int                       flags                = 0;
d1681e
+        int                       brick_count          = -1;
d1681e
 
d1681e
         this = THIS;
d1681e
         GF_ASSERT (this);
d1681e
@@ -6178,6 +6202,24 @@ glusterd_snapshot_activate_commit (dict_t *dict, char **op_errstr,
d1681e
                         goto out;
d1681e
         }
d1681e
 
d1681e
+        /* create the complete brick here */
d1681e
+        cds_list_for_each_entry (brickinfo, &snap_volinfo->bricks,
d1681e
+                                 brick_list) {
d1681e
+                brick_count++;
d1681e
+                if (gf_uuid_compare (brickinfo->uuid, MY_UUID))
d1681e
+                        continue;
d1681e
+                ret = glusterd_snap_brick_create (snap_volinfo, brickinfo,
d1681e
+                                                  brick_count, _gf_false);
d1681e
+                if (ret) {
d1681e
+                        gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
+                                GD_MSG_BRICK_CREATION_FAIL, "not able to "
d1681e
+                                "create the brick for the snap %s, volume %s",
d1681e
+                                snap_volinfo->snapshot->snapname,
d1681e
+                                snap_volinfo->volname);
d1681e
+                        goto out;
d1681e
+                }
d1681e
+        }
d1681e
+
d1681e
         ret = glusterd_start_volume (snap_volinfo, flags, _gf_true);
d1681e
 
d1681e
         if (ret) {
d1681e
@@ -6263,6 +6305,13 @@ glusterd_snapshot_deactivate_commit (dict_t *dict, char **op_errstr,
d1681e
                 goto out;
d1681e
         }
d1681e
 
d1681e
+        ret = glusterd_snap_unmount(this, snap_volinfo);
d1681e
+        if (ret) {
d1681e
+                gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
+                        GD_MSG_GLUSTERD_UMOUNT_FAIL,
d1681e
+                        "Failed to unmounts for %s", snap->snapname);
d1681e
+        }
d1681e
+
d1681e
         ret = dict_set_dynstr_with_alloc (rsp_dict, "snapuuid",
d1681e
                                           uuid_utoa (snap->snap_id));
d1681e
         if (ret) {
d1681e
@@ -6907,6 +6956,7 @@ glusterd_snapshot_create_commit (dict_t *dict, char **op_errstr,
d1681e
         int64_t                 i                       = 0;
d1681e
         int64_t                 volcount                = 0;
d1681e
         int32_t                 snap_activate           = 0;
d1681e
+        int32_t                 flags                   = 0;
d1681e
         char                    *snapname               = NULL;
d1681e
         char                    *volname                = NULL;
d1681e
         char                    *tmp_name               = NULL;
d1681e
@@ -6915,7 +6965,6 @@ glusterd_snapshot_create_commit (dict_t *dict, char **op_errstr,
d1681e
         glusterd_snap_t         *snap                   = NULL;
d1681e
         glusterd_volinfo_t      *origin_vol             = NULL;
d1681e
         glusterd_volinfo_t      *snap_vol               = NULL;
d1681e
-        glusterd_brickinfo_t    *brickinfo              = NULL;
d1681e
         glusterd_conf_t         *priv                   = NULL;
d1681e
 
d1681e
         this = THIS;
d1681e
@@ -7054,30 +7103,21 @@ glusterd_snapshot_create_commit (dict_t *dict, char **op_errstr,
d1681e
                 goto out;
d1681e
         }
d1681e
 
d1681e
-        cds_list_for_each_entry (snap_vol, &snap->volumes, vol_list) {
d1681e
-                cds_list_for_each_entry (brickinfo, &snap_vol->bricks,
d1681e
-                                         brick_list) {
d1681e
-                        ret = glusterd_brick_start (snap_vol, brickinfo,
d1681e
-                                                    _gf_false);
d1681e
-                        if (ret) {
d1681e
-                                gf_msg (this->name, GF_LOG_WARNING, 0,
d1681e
-                                        GD_MSG_BRICK_DISCONNECTED, "starting "
d1681e
-                                        "the brick %s:%s for the snap %s "
d1681e
-                                        "(volume: %s) failed",
d1681e
-                                        brickinfo->hostname, brickinfo->path,
d1681e
-                                        snap_vol->snapshot->snapname,
d1681e
-                                        snap_vol->volname);
d1681e
-                                goto out;
d1681e
-                        }
d1681e
-                }
d1681e
+        /* Activate created bricks in case of activate-on-create config. */
d1681e
+        ret = dict_get_int32 (dict, "flags", &flags);
d1681e
+        if (ret) {
d1681e
+                gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
+                        GD_MSG_DICT_GET_FAILED, "Unable to get flags");
d1681e
+                goto out;
d1681e
+        }
d1681e
 
d1681e
-                snap_vol->status = GLUSTERD_STATUS_STARTED;
d1681e
-                ret = glusterd_store_volinfo (snap_vol,
d1681e
-                                             GLUSTERD_VOLINFO_VER_AC_INCREMENT);
d1681e
+        cds_list_for_each_entry (snap_vol, &snap->volumes, vol_list) {
d1681e
+                ret = glusterd_start_volume (snap_vol, flags, _gf_true);
d1681e
                 if (ret) {
d1681e
                         gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
-                                GD_MSG_VOLINFO_SET_FAIL, "Failed to store "
d1681e
-                                 "snap volinfo %s", snap_vol->volname);
d1681e
+                                GD_MSG_SNAP_ACTIVATE_FAIL,
d1681e
+                                "Failed to activate snap volume %s of the "
d1681e
+                                "snap %s", snap_vol->volname, snap->snapname);
d1681e
                         goto out;
d1681e
                 }
d1681e
         }
d1681e
@@ -7619,6 +7659,30 @@ glusterd_get_single_brick_status (char **op_errstr, dict_t *rsp_dict,
d1681e
         if (ret < 0) {
d1681e
                 goto out;
d1681e
         }
d1681e
+        /* While getting snap status we should show relevent information
d1681e
+         * for deactivated snaps.
d1681e
+         */
d1681e
+        if (snap_volinfo->status == GLUSTERD_STATUS_STOPPED) {
d1681e
+                /* Setting vgname as "Deactivated Snapshot" */
d1681e
+                value = gf_strdup ("N/A (Deactivated Snapshot)");
d1681e
+                if (!value) {
d1681e
+                        ret = -1;
d1681e
+                        goto out;
d1681e
+                }
d1681e
+
d1681e
+                snprintf (key, sizeof (key), "%s.brick%d.vgname",
d1681e
+                          keyprefix, index);
d1681e
+                ret = dict_set_dynstr (rsp_dict, key, value);
d1681e
+                if (ret) {
d1681e
+                        gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
+                                GD_MSG_DICT_SET_FAILED,
d1681e
+                                "Could not save vgname ");
d1681e
+                        goto out;
d1681e
+                }
d1681e
+
d1681e
+                ret = 0;
d1681e
+                goto out;
d1681e
+        }
d1681e
 
d1681e
         ret = glusterd_get_brick_lvm_details (rsp_dict, brickinfo,
d1681e
                                               snap_volinfo->volname,
d1681e
@@ -9200,6 +9264,19 @@ glusterd_snapshot_restore_postop (dict_t *dict, int32_t op_ret,
d1681e
                                 snap->snapname);
d1681e
                         goto out;
d1681e
                 }
d1681e
+
d1681e
+                /* After restore fails, we have to remove mount point for
d1681e
+                 * deactivated snaps which was created at start of restore op.
d1681e
+                 */
d1681e
+                if (volinfo->status == GLUSTERD_STATUS_STOPPED) {
d1681e
+                        ret = glusterd_snap_unmount(this, volinfo);
d1681e
+                        if (ret) {
d1681e
+                                gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
+                                        GD_MSG_GLUSTERD_UMOUNT_FAIL,
d1681e
+                                        "Failed to unmounts for %s",
d1681e
+                                        snap->snapname);
d1681e
+                        }
d1681e
+                }
d1681e
         }
d1681e
 
d1681e
         ret = 0;
d1681e
@@ -9965,7 +10042,7 @@ gd_restore_snap_volume (dict_t *dict, dict_t *rsp_dict,
d1681e
         glusterd_conf_t         *conf           = NULL;
d1681e
         glusterd_volinfo_t      *temp_volinfo   = NULL;
d1681e
         glusterd_volinfo_t      *voliter        = NULL;
d1681e
-        gf_boolean_t             conf_present   = _gf_false;
d1681e
+        gf_boolean_t            conf_present    = _gf_false;
d1681e
 
d1681e
         this = THIS;
d1681e
         GF_ASSERT (this);
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c
d1681e
index 42bb8ce..e35fcde 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd-store.c
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd-store.c
d1681e
@@ -3519,7 +3519,7 @@ out:
d1681e
         return ret;
d1681e
 }
d1681e
 
d1681e
-static int32_t
d1681e
+int32_t
d1681e
 glusterd_recreate_vol_brick_mounts (xlator_t  *this,
d1681e
                                     glusterd_volinfo_t *volinfo)
d1681e
 {
d1681e
@@ -4501,17 +4501,22 @@ glusterd_recreate_all_snap_brick_mounts (xlator_t  *this)
d1681e
                 }
d1681e
         }
d1681e
 
d1681e
-        /* Recreate bricks of snapshot volumes */
d1681e
+        /* Recreate bricks of snapshot volumes
d1681e
+         * We are not creating brick mounts for stopped snaps.
d1681e
+         */
d1681e
         cds_list_for_each_entry (snap, &priv->snapshots, snap_list) {
d1681e
                 cds_list_for_each_entry (volinfo, &snap->volumes, vol_list) {
d1681e
-                        ret = glusterd_recreate_vol_brick_mounts (this,
d1681e
-                                                                  volinfo);
d1681e
-                        if (ret) {
d1681e
-                                gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
-                                        GD_MSG_BRK_MNT_RECREATE_FAIL,
d1681e
-                                        "Failed to recreate brick mounts "
d1681e
-                                        "for %s", snap->snapname);
d1681e
-                                goto out;
d1681e
+                        if (volinfo->status != GLUSTERD_STATUS_STOPPED) {
d1681e
+                                ret = glusterd_recreate_vol_brick_mounts
d1681e
+                                                           (this, volinfo);
d1681e
+                                if (ret) {
d1681e
+                                        gf_msg (this->name, GF_LOG_ERROR, 0,
d1681e
+                                                GD_MSG_BRK_MNT_RECREATE_FAIL,
d1681e
+                                                "Failed to recreate brick "
d1681e
+                                                "mounts for %s",
d1681e
+                                                snap->snapname);
d1681e
+                                        goto out;
d1681e
+                                }
d1681e
                         }
d1681e
                 }
d1681e
         }
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.h b/xlators/mgmt/glusterd/src/glusterd-store.h
d1681e
index bf504e0..383a475 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd-store.h
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd-store.h
d1681e
@@ -203,4 +203,8 @@ glusterd_quota_conf_write_header (int fd);
d1681e
 int32_t
d1681e
 glusterd_quota_conf_write_gfid (int fd, void *buf, char type);
d1681e
 
d1681e
+int32_t
d1681e
+glusterd_recreate_vol_brick_mounts (xlator_t  *this,
d1681e
+                                    glusterd_volinfo_t *volinfo);
d1681e
+
d1681e
 #endif
d1681e
-- 
d1681e
1.8.3.1
d1681e