Blob Blame History Raw
From a415d682160dbb9cb86fcfd5c0371dc575de22ab Mon Sep 17 00:00:00 2001
From: Gaurav Kumar Garg <ggarg@redhat.com>
Date: Mon, 8 Jun 2015 13:01:44 +0530
Subject: [PATCH 281/304] bitrot/glusterd: gluster volume set command for bitrot should not supported

This patch is backport of: http://review.gluster.org/11118

Currently gluster volume set <VOLNAME> bitrot succeeds. gluster volume
set command for bitrot is not supported.
Gluster should only accept gluster volume bitrot <VOLNAME> * commands.

    >>Change-Id: I5ff4b79f202ad018c76188f19d6311aad0d7c166
    >>BUG: 1229134
    >>Signed-off-by: Gaurav Kumar Garg <ggarg@redhat.com>

BUG: 1228135
Change-Id: I6a9e3d07023021e5f910c8e7f436f9b64d48a277
Signed-off-by: Gaurav Kumar Garg <ggarg@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/55756
Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com>
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Tested-by: Atin Mukherjee <amukherj@redhat.com>
---
 .../bitrot/bug-1229134-bitd-not-support-vol-set.t  |   38 ++++++++++++++
 xlators/mgmt/glusterd/src/glusterd-op-sm.c         |   53 ++++++++++++++++++++
 2 files changed, 91 insertions(+), 0 deletions(-)
 create mode 100644 tests/bugs/bitrot/bug-1229134-bitd-not-support-vol-set.t

diff --git a/tests/bugs/bitrot/bug-1229134-bitd-not-support-vol-set.t b/tests/bugs/bitrot/bug-1229134-bitd-not-support-vol-set.t
new file mode 100644
index 0000000..471471f
--- /dev/null
+++ b/tests/bugs/bitrot/bug-1229134-bitd-not-support-vol-set.t
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+## Test case for bitrot BZ:1229134
+## gluster volume set <VOLNAME> bitrot * command succeeds,
+## which is not supported to enable bitrot.
+
+. $(dirname $0)/../../include.rc
+. $(dirname $0)/../../volume.rc
+. $(dirname $0)/../../cluster.rc
+
+cleanup;
+
+## Start glusterd
+TEST glusterd;
+TEST pidof glusterd;
+
+## Lets create and start the volume
+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2}
+TEST $CLI volume start $V0
+
+## 'gluster volume set <VOLNAME>' command for bitrot should failed.
+TEST ! $CLI volume set $V0 bitrot enable
+TEST ! $CLI volume set $V0 bitrot disable
+TEST ! $CLI volume set $V0 scrub-frequency daily
+TEST ! $CLI volume set $V0 scrub pause
+TEST ! $CLI volume set $V0 scrub-throttle lazy
+
+
+## 'gluster volume bitrot <VOLNAME> *' command for bitrot should succeeds.
+TEST $CLI volume bitrot $V0 enable
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count
+
+TEST $CLI volume bitrot $V0 scrub pause
+TEST $CLI volume bitrot $V0 scrub-frequency daily
+TEST $CLI volume bitrot $V0 scrub-throttle lazy
+
+cleanup;
+
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
index 4b06482..1c8925c 100644
--- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
@@ -447,6 +447,54 @@ glusterd_op_sm_inject_all_acc (uuid_t *txn_id)
 }
 
 static int
+glusterd_check_bitrot_cmd (char *key, char *value, char *errstr, size_t size)
+{
+        int     ret = -1;
+
+        if ((!strncmp (key, "bitrot", strlen ("bitrot"))) ||
+            (!strncmp (key, "features.bitrot", strlen ("features.bitrot")))) {
+                snprintf (errstr, size, " 'gluster volume set <VOLNAME> %s' "
+                          "is invalid command. Use 'gluster volume bitrot "
+                          "<VOLNAME> {enable|disable}' instead.", key);
+                ret = -1;
+                goto out;
+        } else if ((!strncmp (key, "scrub-freq", strlen ("scrub-freq"))) ||
+                   (!strncmp (key, "features.scrub-freq",
+                    strlen ("features.scrub-freq")))) {
+                snprintf (errstr, size, " 'gluster volume "
+                          "set <VOLNAME> %s' is invalid command. Use 'gluster "
+                          "volume bitrot <VOLNAME> scrub-frequency"
+                          " {hourly|daily|weekly|biweekly|monthly}' instead.",
+                          key);
+                ret = -1;
+                goto out;
+        } else if ((!strncmp (key, "scrub", strlen ("scrub"))) ||
+                  (!strncmp (key, "features.scrub",
+                   strlen ("features.scrub")))) {
+                snprintf (errstr, size, " 'gluster volume set <VOLNAME> %s' is "
+                          "invalid command. Use 'gluster volume bitrot "
+                          "<VOLNAME> scrub {pause|resume}' instead.", key);
+                ret = -1;
+                goto out;
+        } else if ((!strncmp (key, "scrub-throttle",
+                     strlen ("scrub-throttle"))) ||
+                   (!strncmp (key, "features.scrub-throttle",
+                     strlen ("features.scrub-throttle")))) {
+                snprintf (errstr, size, " 'gluster volume set <VOLNAME> %s' is "
+                          "invalid command. Use 'gluster volume bitrot "
+                          "<VOLNAME> scrub-throttle {lazy|normal|aggressive}' "
+                          "instead.",
+                          key);
+                ret = -1;
+                goto out;
+        }
+
+        ret = 0;
+out:
+        return ret;
+}
+
+static int
 glusterd_check_quota_cmd (char *key, char *value, char *errstr, size_t size)
 {
         int                ret = -1;
@@ -975,6 +1023,11 @@ glusterd_op_stage_set_volume (dict_t *dict, char **op_errstr)
                         }
                 }
 
+                ret = glusterd_check_bitrot_cmd (key, value, errstr,
+                                                 sizeof (errstr));
+                if (ret)
+                        goto out;
+
                 ret = glusterd_check_quota_cmd (key, value, errstr, sizeof (errstr));
                 if (ret)
                         goto out;
-- 
1.7.1