summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvmallika <vmallika@redhat.com>2015-07-08 22:22:50 +0530
committerRaghavendra G <rgowdapp@redhat.com>2015-07-10 01:20:44 -0700
commitc2cd3aeb0d88117f0929a733e9b05aa3e4d392ac (patch)
tree613031a50893c46daa68147e2c114637d8f16059
parent7f9108fc0a5c9543e18ad52759a3ebdf91900a33 (diff)
quota/marker: fix spurious failure afr-quota-xattr-mdata-heal.t
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> Reviewed-on: http://review.gluster.org/11583 Reviewed-by: Raghavendra G <rgowdapp@redhat.com> Tested-by: Raghavendra G <rgowdapp@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.rc20
-rw-r--r--xlators/features/marker/src/marker-quota.c12
7 files changed, 50 insertions, 32 deletions
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c
index bd0d4d8..dd92a15 100644
--- a/cli/src/cli-rpc-ops.c
+++ b/cli/src/cli-rpc-ops.c
@@ -3287,16 +3287,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 8c528c8..0c93303 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 2c3632b..c930db8 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 6aa2d83..82921ff 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 55a26fa..1b04f40 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 02e5aed..8782f46 100644
--- a/tests/volume.rc
+++ b/tests/volume.rc
@@ -555,3 +555,23 @@ function drop_cache() {
;;
esac
}
+
+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 00488c8..a5ef0bb 100644
--- a/xlators/features/marker/src/marker-quota.c
+++ b/xlators/features/marker/src/marker-quota.c
@@ -2090,9 +2090,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
@@ -2461,9 +2461,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.");
@@ -2481,8 +2480,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;