summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvmallika <vmallika@redhat.com>2015-07-10 13:29:13 +0530
committerKrishnan Parthasarathi <kparthas@redhat.com>2015-07-12 23:53:27 -0700
commit1509f6f2815cb75ecf45abef6d823c8cb30ed47b (patch)
tree7d64fb190f78dd0eb448498543dfd93be150cd74
parent4cd60d5456c2ff0fe0455c8d1d534776bb8269c4 (diff)
quota/marker: fix spurious failure afr-quota-xattr-mdata-heal.t
This is a backport of http://review.gluster.org/#/c/11583 During quota-update process if inode info is present in size-xattr and missing in contri-xattrs, then in function '_mq_get_metadata', we set contri-size as zero (on error -2, which means usage info present, but inode info missing). With this we are calculating wrong delta and updating the same. With this patch we are ignoring errors if inode info in xattrs are missing > Change-Id: I7940a0e299b8bb425b5b43746b1f13f775c7fb92 > BUG: 1241153 > Signed-off-by: vmallika <vmallika@redhat.com> Change-Id: Ie85fa84b5362ae179cc43402bd6a3a6d96a04b81 BUG: 1241831 Signed-off-by: vmallika <vmallika@redhat.com> Reviewed-on: http://review.gluster.org/11614 Tested-by: Gluster Build System <jenkins@build.gluster.com> Tested-by: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
-rw-r--r--cli/src/cli-rpc-ops.c16
-rw-r--r--libglusterfs/src/quota-common-utils.c14
-rw-r--r--libglusterfs/src/quota-common-utils.h3
-rw-r--r--tests/bugs/quota/afr-quota-xattr-mdata-heal.t3
-rw-r--r--tests/bugs/quota/inode-quota.t14
-rw-r--r--tests/volume.rc18
-rw-r--r--xlators/features/marker/src/marker-quota.c12
7 files changed, 48 insertions, 32 deletions
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c
index 57e11fa83fd..dfc5c6b1781 100644
--- a/cli/src/cli-rpc-ops.c
+++ b/cli/src/cli-rpc-ops.c
@@ -3292,16 +3292,12 @@ print_quota_list_from_quotad (call_frame_t *frame, dict_t *rsp_dict)
limits.hl = ntoh64 (size_limits->hl);
limits.sl = ntoh64 (size_limits->sl);
- ret = quota_dict_get_meta (rsp_dict, QUOTA_SIZE_KEY, &used_space);
- if (ret == -2 && type == GF_QUOTA_OPTION_TYPE_LIST) {
- ret = 0;
- /* quota_dict_get_meta returns -2 if metadata for inode
- * quotas is missing.
- * This can happen when glusterfs is upgraded from 3.6 to 3.7
- * and the xattr healing is not completed.
- * We can contiue as success if we are listing only file usage
- */
- }
+ if (type == GF_QUOTA_OPTION_TYPE_LIST)
+ ret = quota_dict_get_meta (rsp_dict, QUOTA_SIZE_KEY,
+ &used_space);
+ else
+ ret = quota_dict_get_inode_meta (rsp_dict, QUOTA_SIZE_KEY,
+ &used_space);
if (ret < 0) {
gf_log ("cli", GF_LOG_WARNING,
diff --git a/libglusterfs/src/quota-common-utils.c b/libglusterfs/src/quota-common-utils.c
index 8c528c8bd3b..0c93303a5ae 100644
--- a/libglusterfs/src/quota-common-utils.c
+++ b/libglusterfs/src/quota-common-utils.c
@@ -57,7 +57,7 @@ out:
}
int32_t
-quota_dict_get_meta (dict_t *dict, char *key, quota_meta_t *meta)
+quota_dict_get_inode_meta (dict_t *dict, char *key, quota_meta_t *meta)
{
int32_t ret = -1;
data_t *data = NULL;
@@ -77,6 +77,18 @@ out:
}
int32_t
+quota_dict_get_meta (dict_t *dict, char *key, quota_meta_t *meta)
+{
+ int32_t ret = -1;
+
+ ret = quota_dict_get_inode_meta (dict, key, meta);
+ if (ret == -2)
+ ret = 0;
+
+ return ret;
+}
+
+int32_t
quota_dict_set_meta (dict_t *dict, char *key, const quota_meta_t *meta,
ia_type_t ia_type)
{
diff --git a/libglusterfs/src/quota-common-utils.h b/libglusterfs/src/quota-common-utils.h
index 2c3632b903c..c930db8e86c 100644
--- a/libglusterfs/src/quota-common-utils.h
+++ b/libglusterfs/src/quota-common-utils.h
@@ -41,6 +41,9 @@ int32_t
quota_data_to_meta (data_t *data, char *key, quota_meta_t *meta);
int32_t
+quota_dict_get_inode_meta (dict_t *dict, char *key, quota_meta_t *meta);
+
+int32_t
quota_dict_get_meta (dict_t *dict, char *key, quota_meta_t *meta);
int32_t
diff --git a/tests/bugs/quota/afr-quota-xattr-mdata-heal.t b/tests/bugs/quota/afr-quota-xattr-mdata-heal.t
index 486b0382d5d..fc47e2401a2 100644
--- a/tests/bugs/quota/afr-quota-xattr-mdata-heal.t
+++ b/tests/bugs/quota/afr-quota-xattr-mdata-heal.t
@@ -15,6 +15,9 @@ TEST mkdir $M0/d
TEST $CLI volume quota $V0 limit-usage /d 1MB
TEST touch $M0/d/a
echo abc > $M0/d/a
+
+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "512Bytes" quota_usage "/"
+
#Set the acl xattrs directly on backend, for some reason on mount it gives error
acl_access_val="0x0200000001000600ffffffff04000400ffffffff10000400ffffffff20000400ffffffff"
acl_file_val="0x0000000400000001ffffffff0006000000000004ffffffff0004000000000010ffffffff0004000000000020ffffffff00040000"
diff --git a/tests/bugs/quota/inode-quota.t b/tests/bugs/quota/inode-quota.t
index 55a26fa0d2b..1b04f4062fb 100644
--- a/tests/bugs/quota/inode-quota.t
+++ b/tests/bugs/quota/inode-quota.t
@@ -4,20 +4,6 @@
. $(dirname $0)/../../volume.rc
. $(dirname $0)/../../nfs.rc
-function quota_list_field () {
- local QUOTA_PATH=$1
- local FIELD=$2
- $CLI volume quota $V0 list $QUOTA_PATH | grep $QUOTA_PATH\
- | awk '{print $FIELD}'
-}
-
-function quota_object_list_field () {
- local QUOTA_PATH=$1
- local FIELD=$2
- $CLI volume quota $V0 list-objects $QUOTA_PATH | grep $QUOTA_PATH\
- | awk '{print $FIELD}'
-}
-
cleanup;
QDD=$(dirname $0)/quota
diff --git a/tests/volume.rc b/tests/volume.rc
index ec77e602fda..1cb37b81ef6 100644
--- a/tests/volume.rc
+++ b/tests/volume.rc
@@ -543,3 +543,21 @@ function get_scrubd_count {
ps auxww | grep glusterfs | grep scrub.pid | grep -v grep | wc -l
}
+function quota_list_field () {
+ local QUOTA_PATH=$1
+ local FIELD=$2
+ $CLI volume quota $V0 list $QUOTA_PATH | grep $QUOTA_PATH\
+ | awk '{print $FIELD}'
+}
+
+function quota_object_list_field () {
+ local QUOTA_PATH=$1
+ local FIELD=$2
+ $CLI volume quota $V0 list-objects $QUOTA_PATH | grep $QUOTA_PATH\
+ | awk '{print $FIELD}'
+}
+
+function quota_usage()
+{
+ quota_list_field $1 4
+}
diff --git a/xlators/features/marker/src/marker-quota.c b/xlators/features/marker/src/marker-quota.c
index 97946f8ec82..c6def62a016 100644
--- a/xlators/features/marker/src/marker-quota.c
+++ b/xlators/features/marker/src/marker-quota.c
@@ -2095,9 +2095,9 @@ _quota_dict_get_meta (xlator_t *this, dict_t *dict, char *key,
priv = this->private;
- ret = quota_dict_get_meta (dict, key, meta);
+ ret = quota_dict_get_inode_meta (dict, key, meta);
if (ret == -2 && (priv->feature_enabled & GF_INODE_QUOTA) == 0) {
- /* quota_dict_get_meta returns -2 if
+ /* quota_dict_get_inode_meta returns -2 if
* inode quota xattrs are not present.
* if inode quota self heal is turned off,
* then we should skip healing inode quotas
@@ -2466,9 +2466,8 @@ _mq_get_metadata (xlator_t *this, loc_t *loc, quota_meta_t *contri,
if (size) {
if (loc->inode->ia_type == IA_IFDIR) {
- ret = _quota_dict_get_meta (this, rsp_dict,
- QUOTA_SIZE_KEY, &meta,
- IA_IFDIR, _gf_true);
+ ret = quota_dict_get_meta (rsp_dict, QUOTA_SIZE_KEY,
+ &meta);
if (ret < 0) {
gf_log (this->name, GF_LOG_ERROR,
"dict_get failed.");
@@ -2486,8 +2485,7 @@ _mq_get_metadata (xlator_t *this, loc_t *loc, quota_meta_t *contri,
}
if (contri && !loc_is_root(loc)) {
- ret = _quota_dict_get_meta (this, rsp_dict, contri_key, &meta,
- loc->inode->ia_type, _gf_false);
+ ret = quota_dict_get_meta (rsp_dict, contri_key, &meta);
if (ret < 0) {
contri->size = 0;
contri->file_count = 0;