d1681e
From ed178ad11c75da242d68de5d24d9b0a8faaf9deb Mon Sep 17 00:00:00 2001
d1681e
From: Sunny Kumar <sunkumar@redhat.com>
d1681e
Date: Tue, 3 Jul 2018 16:03:35 +0530
d1681e
Subject: [PATCH 316/325] snapshot : remove stale entry
d1681e
d1681e
        During snap delete after removing brick-path we should remove
d1681e
        snap-path too i.e. /var/run/gluster/snaps/<snap-name>.
d1681e
d1681e
        During snap deactivate also we should remove snap-path.
d1681e
d1681e
>fixes: bz#1597662
d1681e
>Signed-off-by: Sunny Kumar <sunkumar@redhat.com>
d1681e
Upstream Patch : https://review.gluster.org/#/c/20454/
d1681e
Change-Id: Ib80b5d8844d6479d31beafa732e5671b0322248b
d1681e
BUG: 1547903
d1681e
d1681e
Signed-off-by: Sunny Kumar <sunkumar@redhat.com>
d1681e
Change-Id: I93827f4e15a37247bafeb077575dc60658b8851f
d1681e
Reviewed-on: https://code.engineering.redhat.com/gerrit/143814
d1681e
Tested-by: RHGS Build Bot <nigelb@redhat.com>
d1681e
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
d1681e
---
d1681e
 tests/bugs/snapshot/bug-1597662.t             | 57 +++++++++++++++++++++++++++
d1681e
 xlators/mgmt/glusterd/src/glusterd-snapshot.c | 38 ++++++++++++++++++
d1681e
 2 files changed, 95 insertions(+)
d1681e
 create mode 100644 tests/bugs/snapshot/bug-1597662.t
d1681e
d1681e
diff --git a/tests/bugs/snapshot/bug-1597662.t b/tests/bugs/snapshot/bug-1597662.t
d1681e
new file mode 100644
d1681e
index 0000000..dc87d17
d1681e
--- /dev/null
d1681e
+++ b/tests/bugs/snapshot/bug-1597662.t
d1681e
@@ -0,0 +1,57 @@
d1681e
+#!/bin/bash
d1681e
+
d1681e
+. $(dirname $0)/../../include.rc
d1681e
+. $(dirname $0)/../../volume.rc
d1681e
+. $(dirname $0)/../../snapshot.rc
d1681e
+
d1681e
+cleanup;
d1681e
+
d1681e
+TEST init_n_bricks 3;
d1681e
+TEST setup_lvm 3;
d1681e
+TEST glusterd;
d1681e
+TEST pidof glusterd;
d1681e
+
d1681e
+TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;
d1681e
+TEST $CLI volume start $V0;
d1681e
+
d1681e
+snap_path=/var/run/gluster/snaps
d1681e
+
d1681e
+TEST $CLI snapshot create snap1 $V0 no-timestamp;
d1681e
+
d1681e
+$CLI snapshot activate snap1;
d1681e
+
d1681e
+EXPECT 'Started' snapshot_status snap1;
d1681e
+
d1681e
+# This Function will check for entry /var/run/gluster/snaps/<snap-name>
d1681e
+# against snap-name
d1681e
+
d1681e
+function is_snap_path
d1681e
+{
d1681e
+        echo `ls $snap_path | grep snap1 | wc -l`
d1681e
+}
d1681e
+
d1681e
+# snap is active so snap_path should exist
d1681e
+EXPECT "1" is_snap_path
d1681e
+
d1681e
+$CLI snapshot deactivate snap1;
d1681e
+
d1681e
+# snap is deactivated so snap_path should not exist
d1681e
+EXPECT "0" is_snap_path
d1681e
+
d1681e
+# activate snap again
d1681e
+$CLI snapshot activate snap1;
d1681e
+
d1681e
+# snap is active so snap_path should exist
d1681e
+EXPECT "1" is_snap_path
d1681e
+
d1681e
+# delete snap now
d1681e
+TEST $CLI snapshot delete snap1;
d1681e
+
d1681e
+# snap is deleted so snap_path should not exist
d1681e
+EXPECT "0" is_snap_path
d1681e
+
d1681e
+TEST $CLI volume stop $V0;
d1681e
+TEST $CLI volume delete $V0;
d1681e
+
d1681e
+cleanup;
d1681e
+
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
d1681e
index 84335ef..304cef6 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
d1681e
@@ -2945,6 +2945,7 @@ glusterd_lvm_snapshot_remove (dict_t *rsp_dict, glusterd_volinfo_t *snap_vol)
d1681e
         glusterd_brickinfo_t *brickinfo            = NULL;
d1681e
         xlator_t             *this                 = NULL;
d1681e
         char                  brick_dir[PATH_MAX]  = "";
d1681e
+        char                  snap_path[PATH_MAX]  = "";
d1681e
         char                 *tmp                  = NULL;
d1681e
         char                 *brick_mount_path     = NULL;
d1681e
         gf_boolean_t          is_brick_dir_present = _gf_false;
d1681e
@@ -3116,6 +3117,28 @@ remove_brick_path:
d1681e
                                         brick_dir, strerror (errno));
d1681e
                                 goto out;
d1681e
                 }
d1681e
+
d1681e
+                /* After removing brick_dir, fetch and remove snap path
d1681e
+                 * i.e. /var/run/gluster/snaps/<snap-name>.
d1681e
+                 */
d1681e
+                if (!snap_vol->snapshot) {
d1681e
+                        gf_msg (this->name, GF_LOG_WARNING, EINVAL,
d1681e
+                                GD_MSG_INVALID_ENTRY, "snapshot not"
d1681e
+                                "present in snap_vol");
d1681e
+                        ret = -1;
d1681e
+                        goto out;
d1681e
+                }
d1681e
+
d1681e
+                snprintf (snap_path, sizeof (snap_path) - 1, "%s/%s",
d1681e
+                          snap_mount_dir, snap_vol->snapshot->snapname);
d1681e
+                ret = recursive_rmdir (snap_path);
d1681e
+                if (ret) {
d1681e
+                        gf_msg (this->name, GF_LOG_ERROR, errno,
d1681e
+                                GD_MSG_DIR_OP_FAILED, "Failed to remove "
d1681e
+                                "%s directory : error : %s", snap_path,
d1681e
+                                strerror (errno));
d1681e
+                        goto out;
d1681e
+                }
d1681e
         }
d1681e
 
d1681e
         ret = 0;
d1681e
@@ -6260,6 +6283,7 @@ glusterd_snapshot_deactivate_commit (dict_t *dict, char **op_errstr,
d1681e
         glusterd_snap_t          *snap                 = NULL;
d1681e
         glusterd_volinfo_t       *snap_volinfo         = NULL;
d1681e
         xlator_t                 *this                 = NULL;
d1681e
+        char                      snap_path[PATH_MAX]  =  "";
d1681e
 
d1681e
         this = THIS;
d1681e
         GF_ASSERT (this);
d1681e
@@ -6318,6 +6342,20 @@ glusterd_snapshot_deactivate_commit (dict_t *dict, char **op_errstr,
d1681e
                         "Failed to unmounts for %s", snap->snapname);
d1681e
         }
d1681e
 
d1681e
+        /*Remove /var/run/gluster/snaps/<snap-name> entry for deactivated snaps.
d1681e
+         * This entry will be created again during snap activate.
d1681e
+         */
d1681e
+        snprintf (snap_path, sizeof (snap_path) - 1, "%s/%s",
d1681e
+                  snap_mount_dir, snapname);
d1681e
+        ret = recursive_rmdir (snap_path);
d1681e
+        if (ret) {
d1681e
+                gf_msg (this->name, GF_LOG_ERROR, errno,
d1681e
+                        GD_MSG_DIR_OP_FAILED, "Failed to remove "
d1681e
+                        "%s directory : error : %s", snap_path,
d1681e
+                        strerror (errno));
d1681e
+                goto out;
d1681e
+        }
d1681e
+
d1681e
         ret = dict_set_dynstr_with_alloc (rsp_dict, "snapuuid",
d1681e
                                           uuid_utoa (snap->snap_id));
d1681e
         if (ret) {
d1681e
-- 
d1681e
1.8.3.1
d1681e