diff options
| author | Sunny Kumar <sunkumar@redhat.com> | 2018-07-03 16:03:35 +0530 | 
|---|---|---|
| committer | Amar Tumballi <amarts@redhat.com> | 2018-07-12 04:35:58 +0000 | 
| commit | b32ad78516a4edf59a4e9c3ef266e3d69f616b83 (patch) | |
| tree | fca7ff780ba4b26a653d7924bfe86128420e6b90 | |
| parent | e893eb1b23f62477e98e409eaf96941beeb27177 (diff) | |
snapshot : remove stale entry
        During snap delete after removing brick-path we should remove
        snap-path too i.e. /var/run/gluster/snaps/<snap-name>.
        During snap deactivate also we should remove snap-path.
Change-Id: Ib80b5d8844d6479d31beafa732e5671b0322248b
fixes: bz#1597662
Signed-off-by: Sunny Kumar <sunkumar@redhat.com>
| -rw-r--r-- | tests/bugs/snapshot/bug-1597662.t | 57 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 38 | 
2 files changed, 95 insertions, 0 deletions
diff --git a/tests/bugs/snapshot/bug-1597662.t b/tests/bugs/snapshot/bug-1597662.t new file mode 100644 index 00000000000..dc87d17a0ef --- /dev/null +++ b/tests/bugs/snapshot/bug-1597662.t @@ -0,0 +1,57 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../snapshot.rc + +cleanup; + +TEST init_n_bricks 3; +TEST setup_lvm 3; +TEST glusterd; +TEST pidof glusterd; + +TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3; +TEST $CLI volume start $V0; + +snap_path=/var/run/gluster/snaps + +TEST $CLI snapshot create snap1 $V0 no-timestamp; + +$CLI snapshot activate snap1; + +EXPECT 'Started' snapshot_status snap1; + +# This Function will check for entry /var/run/gluster/snaps/<snap-name> +# against snap-name + +function is_snap_path +{ +        echo `ls $snap_path | grep snap1 | wc -l` +} + +# snap is active so snap_path should exist +EXPECT "1" is_snap_path + +$CLI snapshot deactivate snap1; + +# snap is deactivated so snap_path should not exist +EXPECT "0" is_snap_path + +# activate snap again +$CLI snapshot activate snap1; + +# snap is active so snap_path should exist +EXPECT "1" is_snap_path + +# delete snap now +TEST $CLI snapshot delete snap1; + +# snap is deleted so snap_path should not exist +EXPECT "0" is_snap_path + +TEST $CLI volume stop $V0; +TEST $CLI volume delete $V0; + +cleanup; + diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 4be89779465..3d984fa3f57 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -2904,6 +2904,7 @@ glusterd_lvm_snapshot_remove (dict_t *rsp_dict, glusterd_volinfo_t *snap_vol)          glusterd_brickinfo_t *brickinfo            = NULL;          xlator_t             *this                 = NULL;          char                  brick_dir[PATH_MAX]  = ""; +        char                  snap_path[PATH_MAX]  = "";          char                 *tmp                  = NULL;          char                 *brick_mount_path     = NULL;          gf_boolean_t          is_brick_dir_present = _gf_false; @@ -3075,6 +3076,28 @@ remove_brick_path:                                          brick_dir, strerror (errno));                                  goto out;                  } + +                /* After removing brick_dir, fetch and remove snap path +                 * i.e. /var/run/gluster/snaps/<snap-name>. +                 */ +                if (!snap_vol->snapshot) { +                        gf_msg (this->name, GF_LOG_WARNING, EINVAL, +                                GD_MSG_INVALID_ENTRY, "snapshot not" +                                "present in snap_vol"); +                        ret = -1; +                        goto out; +                } + +                snprintf (snap_path, sizeof (snap_path) - 1, "%s/%s", +                          snap_mount_dir, snap_vol->snapshot->snapname); +                ret = recursive_rmdir (snap_path); +                if (ret) { +                        gf_msg (this->name, GF_LOG_ERROR, errno, +                                GD_MSG_DIR_OP_FAILED, "Failed to remove " +                                "%s directory : error : %s", snap_path, +                                strerror (errno)); +                        goto out; +                }          }          ret = 0; @@ -6246,6 +6269,7 @@ glusterd_snapshot_deactivate_commit (dict_t *dict, char **op_errstr,          glusterd_snap_t          *snap                 = NULL;          glusterd_volinfo_t       *snap_volinfo         = NULL;          xlator_t                 *this                 = NULL; +        char                      snap_path[PATH_MAX]  =  "";          this = THIS;          GF_ASSERT (this); @@ -6304,6 +6328,20 @@ glusterd_snapshot_deactivate_commit (dict_t *dict, char **op_errstr,                          "Failed to unmounts for %s", snap->snapname);          } +        /*Remove /var/run/gluster/snaps/<snap-name> entry for deactivated snaps. +         * This entry will be created again during snap activate. +         */ +        snprintf (snap_path, sizeof (snap_path) - 1, "%s/%s", +                  snap_mount_dir, snapname); +        ret = recursive_rmdir (snap_path); +        if (ret) { +                gf_msg (this->name, GF_LOG_ERROR, errno, +                        GD_MSG_DIR_OP_FAILED, "Failed to remove " +                        "%s directory : error : %s", snap_path, +                        strerror (errno)); +                goto out; +        } +          ret = dict_set_dynstr_with_alloc (rsp_dict, "snapuuid",                                            uuid_utoa (snap->snap_id));          if (ret) {  | 
