summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/bugs/bug-1155042-dont-display-deactivated-snapshots.t35
-rwxr-xr-xtests/snapshot.rc6
-rw-r--r--xlators/features/snapview-server/src/snapview-server-helpers.c98
-rw-r--r--xlators/features/snapview-server/src/snapview-server.h5
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-snapshot.c6
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 */