diff options
-rw-r--r-- | tests/bugs/bug-1155042-dont-display-deactivated-snapshots.t | 35 | ||||
-rwxr-xr-x | tests/snapshot.rc | 6 | ||||
-rw-r--r-- | xlators/features/snapview-server/src/snapview-server-helpers.c | 98 | ||||
-rw-r--r-- | xlators/features/snapview-server/src/snapview-server.h | 5 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 6 |
5 files changed, 109 insertions, 41 deletions
diff --git a/tests/bugs/bug-1155042-dont-display-deactivated-snapshots.t b/tests/bugs/bug-1155042-dont-display-deactivated-snapshots.t new file mode 100644 index 00000000000..34c068f6713 --- /dev/null +++ b/tests/bugs/bug-1155042-dont-display-deactivated-snapshots.t @@ -0,0 +1,35 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../snapshot.rc + +cleanup; + +TEST init_n_bricks 2 +TEST setup_lvm 2 +TEST glusterd; + +TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 +TEST $CLI volume start $V0 + +# enable uss and mount the volume +TEST $CLI volume set $V0 features.uss enable +TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0 + +# create 10 snapshots and check if all are being reflected +# in the USS world +for i in {1..10}; do $CLI snapshot create snap$i $V0; done +EXPECT 10 uss_count_snap_displayed $M0 + +# snapshots should not be displayed after deactivation +for i in {1..10}; do $CLI snapshot deactivate snap$i --mode=script; done +EXPECT 0 uss_count_snap_displayed $M0 + +# activate all the snapshots and check if all the activated snapshots +# are displayed again +for i in {1..10}; do $CLI snapshot activate snap$i --mode=script; done +EXPECT 10 uss_count_snap_displayed $M0 + +cleanup; + diff --git a/tests/snapshot.rc b/tests/snapshot.rc index cddbb49584a..6ca276d194b 100755 --- a/tests/snapshot.rc +++ b/tests/snapshot.rc @@ -391,6 +391,12 @@ function check_if_snapd_exist() { if [ -n "$pid" ]; then echo "Y"; else echo "N"; fi } +# returns number of snapshot being displayed in ".snaps" directory +function uss_count_snap_displayed() { + local path=$1 + ls $path/.snaps | wc -l +} + case $OSTYPE in NetBSD) echo "Skip test on LVM which is not available on NetBSD" >&2 diff --git a/xlators/features/snapview-server/src/snapview-server-helpers.c b/xlators/features/snapview-server/src/snapview-server-helpers.c index 0817e145e26..46e7d49a036 100644 --- a/xlators/features/snapview-server/src/snapview-server-helpers.c +++ b/xlators/features/snapview-server/src/snapview-server-helpers.c @@ -395,8 +395,9 @@ out: return; } +/* priv->snaplist_lock should be held before calling this function */ snap_dirent_t * -svs_get_snap_dirent (xlator_t *this, const char *name) +__svs_get_snap_dirent (xlator_t *this, const char *name) { svs_private_t *private = NULL; int i = 0; @@ -404,45 +405,36 @@ svs_get_snap_dirent (xlator_t *this, const char *name) snap_dirent_t *tmp_dirent = NULL; snap_dirent_t *dirent = NULL; - GF_VALIDATE_OR_GOTO ("snapview-server", this, out); - GF_VALIDATE_OR_GOTO (this->name, this->private, out); - GF_VALIDATE_OR_GOTO (this->name, name, out); - private = this->private; - LOCK (&private->snaplist_lock); - { - dirents = private->dirents; - if (!dirents) { - goto unlock; - } + dirents = private->dirents; + if (!dirents) { + goto out; + } - tmp_dirent = dirents; - for (i = 0; i < private->num_snaps; i++) { - if (!strcmp (tmp_dirent->name, name)) { - dirent = tmp_dirent; - break; - } - tmp_dirent++; + tmp_dirent = dirents; + for (i = 0; i < private->num_snaps; i++) { + if (!strcmp (tmp_dirent->name, name)) { + dirent = tmp_dirent; + break; } + tmp_dirent++; } -unlock: - UNLOCK (&private->snaplist_lock); -out: + out: return dirent; } glfs_t * -svs_initialise_snapshot_volume (xlator_t *this, const char *name) +__svs_initialise_snapshot_volume (xlator_t *this, const char *name) { - svs_private_t *priv = NULL; - int32_t ret = -1; - snap_dirent_t *dirent = NULL; - char volname[PATH_MAX] = {0, }; - glfs_t *fs = NULL; - int loglevel = GF_LOG_INFO; - char logfile[PATH_MAX] = {0, }; + svs_private_t *priv = NULL; + int32_t ret = -1; + snap_dirent_t *dirent = NULL; + char volname[PATH_MAX] = {0, }; + glfs_t *fs = NULL; + int loglevel = GF_LOG_INFO; + char logfile[PATH_MAX] = {0, }; GF_VALIDATE_OR_GOTO ("snapview-server", this, out); GF_VALIDATE_OR_GOTO (this->name, this->private, out); @@ -450,10 +442,10 @@ svs_initialise_snapshot_volume (xlator_t *this, const char *name) priv = this->private; - dirent = svs_get_snap_dirent (this, name); + dirent = __svs_get_snap_dirent (this, name); if (!dirent) { - gf_log (this->name, GF_LOG_ERROR, "snap entry for name %s " - "not found", name); + gf_log (this->name, GF_LOG_ERROR, "snap entry for " + "name %s not found", name); goto out; } @@ -466,6 +458,7 @@ svs_initialise_snapshot_volume (xlator_t *this, const char *name) snprintf (volname, sizeof (volname), "/snaps/%s/%s", dirent->name, dirent->snap_volname); + fs = glfs_new (volname); if (!fs) { gf_log (this->name, GF_LOG_ERROR, @@ -483,13 +476,6 @@ svs_initialise_snapshot_volume (xlator_t *this, const char *name) goto out; } - ret = glfs_init (fs); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, "initing the " - "fs for %s failed", dirent->name); - goto out; - } - snprintf (logfile, sizeof (logfile), DEFAULT_SVD_LOG_FILE_DIRECTORY "/%s-%s.log", name, dirent->uuid); @@ -501,6 +487,13 @@ svs_initialise_snapshot_volume (xlator_t *this, const char *name) goto out; } + ret = glfs_init (fs); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "initing the " + "fs for %s failed", dirent->name); + goto out; + } + ret = 0; out: @@ -509,8 +502,33 @@ out: fs = NULL; } - if (fs) + if (fs) { dirent->fs = fs; + } + + return fs; +} + +glfs_t * +svs_initialise_snapshot_volume (xlator_t *this, const char *name) +{ + glfs_t *fs = NULL; + svs_private_t *priv = NULL; + + GF_VALIDATE_OR_GOTO ("snapview-server", this, out); + GF_VALIDATE_OR_GOTO (this->name, this->private, out); + GF_VALIDATE_OR_GOTO (this->name, name, out); + + priv = this->private; + + LOCK (&priv->snaplist_lock); + { + fs = __svs_initialise_snapshot_volume (this, name); + } + UNLOCK (&priv->snaplist_lock); + + +out: return fs; } diff --git a/xlators/features/snapview-server/src/snapview-server.h b/xlators/features/snapview-server/src/snapview-server.h index 47effb19758..6033c0e250f 100644 --- a/xlators/features/snapview-server/src/snapview-server.h +++ b/xlators/features/snapview-server/src/snapview-server.h @@ -214,8 +214,11 @@ svs_get_latest_snapshot (xlator_t *this); glfs_t * svs_initialise_snapshot_volume (xlator_t *this, const char *name); +glfs_t * +__svs_initialise_snapshot_volume (xlator_t *this, const char *name); + snap_dirent_t * -svs_get_snap_dirent (xlator_t *this, const char *name); +__svs_get_snap_dirent (xlator_t *this, const char *name); int svs_mgmt_init (xlator_t *this); diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 99addd165c8..4d4b7df673e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -7443,6 +7443,8 @@ glusterd_snapshot_postvalidate (dict_t *dict, int32_t op_ret, char **op_errstr, break; case GF_SNAP_OPTION_TYPE_ACTIVATE: case GF_SNAP_OPTION_TYPE_DEACTIVATE: + glusterd_fetchsnap_notify (this); + break; case GF_SNAP_OPTION_TYPE_STATUS: case GF_SNAP_OPTION_TYPE_CONFIG: case GF_SNAP_OPTION_TYPE_INFO: @@ -8212,6 +8214,10 @@ glusterd_snapshot_get_volnames_uuids (dict_t *dict, list_for_each_entry_safe (snap_vol, tmp_vol, &volinfo->snap_volumes, snapvol_list) { + + if (GLUSTERD_STATUS_STARTED != snap_vol->status) + continue; + snapcount++; /* Set Snap Name */ |