From 124eac4e46cb52e4dc7e47ce4e01adddc4ff44fd Mon Sep 17 00:00:00 2001 From: vmallika Date: Tue, 22 Dec 2015 16:32:49 +0530 Subject: quota: handle quota xattr removal when quota is enabled again This is a backport of http://review.gluster.org/#/c/13065/ When a quota is disable and enabled again before completing the cleanup operation, this can remove the new xattrs and quota accounting can become wrong Remove removing the xattr, check if quota enabled again and the xattr is new > Change-Id: Idda216f1e7346a9b843dbc112ea3e6faa9c47483 > BUG: 1293601 > Signed-off-by: vmallika Change-Id: Ia9e3002229427f811d6a35eabf21541f4fa057af BUG: 1294609 Signed-off-by: vmallika Reviewed-on: http://review.gluster.org/13109 Tested-by: NetBSD Build System Tested-by: Gluster Build System Reviewed-by: Raghavendra G --- tests/bugs/quota/bug-1293601.t | 35 +++++++++++++++++++++++++++++++++++ xlators/features/marker/src/marker.c | 27 +++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 tests/bugs/quota/bug-1293601.t diff --git a/tests/bugs/quota/bug-1293601.t b/tests/bugs/quota/bug-1293601.t new file mode 100644 index 00000000000..9b8a13a61e5 --- /dev/null +++ b/tests/bugs/quota/bug-1293601.t @@ -0,0 +1,35 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; +TESTS_EXPECTED_IN_LOOP=1044 + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4} +TEST $CLI volume start $V0 +TEST $CLI volume quota $V0 enable +TEST $CLI volume quota $V0 limit-usage / 2MB + +TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0; + +for i in {1..1024}; do + TEST_IN_LOOP dd if=/dev/zero of=$M0/f$i bs=1k count=1 +done + +EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "1.0MB" quotausage "/" + +for i in {1..10}; do + TEST_IN_LOOP $CLI volume quota $V0 disable + TEST_IN_LOOP $CLI volume quota $V0 enable +done + +TEST $CLI volume quota $V0 limit-usage / 2MB +EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "1.0MB" quotausage "/" + +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 +cleanup; diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c index 313ca737091..5504cf55c1f 100644 --- a/xlators/features/marker/src/marker.c +++ b/xlators/features/marker/src/marker.c @@ -2296,10 +2296,29 @@ out: int remove_quota_keys (dict_t *dict, char *k, data_t *v, void *data) { - call_frame_t *frame = data; - marker_local_t *local = frame->local; - xlator_t *this = frame->this; - int ret = -1; + call_frame_t *frame = data; + marker_local_t *local = frame->local; + xlator_t *this = frame->this; + marker_conf_t *priv = NULL; + char ver_str[NAME_MAX] = {0,}; + char *dot = NULL; + int ret = -1; + + priv = this->private; + + /* If quota is enabled immediately after disable. + * quota healing starts creating new xattrs + * before completing the cleanup operation. + * So we should check if the xattr is the new. + * Do not remove xattr if its xattr + * version is same as current version + */ + if ((priv->feature_enabled & GF_QUOTA) && priv->version > 0) { + snprintf (ver_str, sizeof (ver_str), ".%d", priv->version); + dot = strrchr (k, '.'); + if (dot && !strcmp(dot, ver_str)) + return 0; + } ret = syncop_removexattr (FIRST_CHILD (this), &local->loc, k, 0, NULL); if (ret) { -- cgit