summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVishal Pandey <vishpandey2014@gmail.com>2017-11-02 19:16:26 +0530
committerAmar Tumballi <amarts@redhat.com>2017-11-20 11:41:27 +0000
commitdbd94d5bee93ca9ad4f485147b90b4ccf8a3b61e (patch)
treea45e286ae34fd2f6e03bbebf64455467a9a43fc1
parentc810ea1e2ba5c15b11808e2bd378e95c428b7f96 (diff)
features/worm: new config option to manage deletion of Worm files.
Add a new configuration option worm-files-deletable to file-level Worm in order to control behaviour of Worm files upon deletion. Steps to Test: 1. Add all the configuration options to a volume to activate file-level-worm 2. Option features.worm-files-deletable is set to 1 by default. 3. Create a new file and wait for the retention time to expire. 4. After retention time expires, do an truncate, rename, unlink, link or write to send the file in Worm state. 5. After that do `rm -f filename`. 6. The file is successfully removed. 7. Repeat from step 2 by setting features.worm-files-deletable 0. This time deletion should not be successful. Change-Id: Ibc89861ee296e065330b93a9f9606be5da40af31 BUG: 1508898 Signed-off-by: Vishal Pandey <vishpandey2014@gmail.com>
-rwxr-xr-xtests/features/worm.t8
-rw-r--r--xlators/features/read-only/src/read-only.h1
-rw-r--r--xlators/features/read-only/src/worm-helper.c2
-rw-r--r--xlators/features/read-only/src/worm.c10
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volume-set.c8
5 files changed, 28 insertions, 1 deletions
diff --git a/tests/features/worm.t b/tests/features/worm.t
index c725f5858ec..9766dc1ad2b 100755
--- a/tests/features/worm.t
+++ b/tests/features/worm.t
@@ -64,6 +64,14 @@ TEST `echo "worm 2" >> $M0/file3`
EXPECT 'worm 1' cat $M0/file3
TEST ! rm -f $M0/file3
+## Test for checking if Worm files are undeletable after setting worm-files-deletable as 0.
+TEST $CLI volume set $V0 features.worm-files-deletable 0
+TEST `echo "worm 1" > $M0/file4`
+TEST chmod 0444 $M0/file4
+sleep 10
+TEST `echo "worm 1" >> $M0/file4`
+TEST ! rm -f $M0/file4
+
TEST $CLI volume stop $V0
EXPECT 'Stopped' volinfo_field $V0 'Status'
diff --git a/xlators/features/read-only/src/read-only.h b/xlators/features/read-only/src/read-only.h
index d0263e74179..aae625f5eaf 100644
--- a/xlators/features/read-only/src/read-only.h
+++ b/xlators/features/read-only/src/read-only.h
@@ -28,6 +28,7 @@ typedef struct {
typedef struct {
gf_boolean_t readonly_or_worm_enabled;
gf_boolean_t worm_file;
+ gf_boolean_t worm_files_deletable;
uint64_t reten_period;
uint64_t com_period;
char *reten_mode;
diff --git a/xlators/features/read-only/src/worm-helper.c b/xlators/features/read-only/src/worm-helper.c
index 425e48123b1..0770f9d77c4 100644
--- a/xlators/features/read-only/src/worm-helper.c
+++ b/xlators/features/read-only/src/worm-helper.c
@@ -379,7 +379,7 @@ gf_worm_state_transition (xlator_t *this, gf_boolean_t fop_with_fd,
&reten_state, &stbuf);
}
if (reten_state.worm && !reten_state.retain &&
- op == GF_FOP_UNLINK) {
+ priv->worm_files_deletable && op == GF_FOP_UNLINK) {
op_errno = 0;
goto out;
}
diff --git a/xlators/features/read-only/src/worm.c b/xlators/features/read-only/src/worm.c
index a1474b6bc27..cbe7df8e798 100644
--- a/xlators/features/read-only/src/worm.c
+++ b/xlators/features/read-only/src/worm.c
@@ -542,6 +542,8 @@ init (xlator_t *this)
uint64, out);
GF_OPTION_INIT ("auto-commit-period", priv->com_period, uint64, out);
GF_OPTION_INIT ("retention-mode", priv->reten_mode, str, out);
+ GF_OPTION_INIT ("worm-files-deletable", priv->worm_files_deletable,
+ bool, out);
this->private = priv;
ret = 0;
@@ -569,6 +571,8 @@ reconfigure (xlator_t *this, dict_t *options)
out);
GF_OPTION_RECONF ("auto-commit-period", priv->com_period, options,
uint64, out);
+ GF_OPTION_RECONF ("worm-files-deletable", priv->worm_files_deletable,
+ options, bool, out);
ret = 0;
out:
gf_log (this->name, GF_LOG_DEBUG, "returning %d", ret);
@@ -632,6 +636,12 @@ struct volume_options options[] = {
.description = "When \"on\", activates the file level worm. "
"It is turned \"off\" by default."
},
+ { .key = {"worm-files-deletable"},
+ .type = GF_OPTION_TYPE_BOOL,
+ .default_value = "on",
+ .description = "When \"off\", doesn't allow the Worm files"
+ "to be deleted. It is turned \"on\" by default."
+ },
{ .key = {"default-retention-period"},
.type = GF_OPTION_TYPE_TIME,
.default_value = "120",
diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c
index 4b3b9350ef2..7155228ce81 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c
@@ -2738,6 +2738,14 @@ struct volopt_map_entry glusterd_volopt_map[] = {
.op_version = GD_OP_VERSION_3_8_0,
.flags = VOLOPT_FLAG_CLIENT_OPT | VOLOPT_FLAG_XLATOR_OPT
},
+ { .key = "features.worm-files-deletable",
+ .voltype = "features/worm",
+ .option = "worm-files-deletable",
+ .value = "on",
+ .validate_fn = validate_boolean,
+ .op_version = GD_OP_VERSION_3_13_0,
+ .flags = VOLOPT_FLAG_CLIENT_OPT | VOLOPT_FLAG_XLATOR_OPT
+ },
{ .key = "features.default-retention-period",
.voltype = "features/worm",
.option = "default-retention-period",