summaryrefslogtreecommitdiffstats
path: root/xlators/features/marker/src/marker-quota.c
diff options
context:
space:
mode:
authorvmallika <vmallika@redhat.com>2015-10-15 12:41:13 +0530
committerRaghavendra G <rgowdapp@redhat.com>2015-11-02 00:54:35 -0800
commitd90b87eed2fa68df5afcebbc54747e96f6d76cfb (patch)
tree2d514ae4211e29ff42f1e615a4e7d0d45721512b /xlators/features/marker/src/marker-quota.c
parentd3e496cbcd35b9d9b840e328ae109c44f59083ce (diff)
quota: add version to quota xattrs
When a quota is disable and the clean-up process terminated without completely cleaning-up the quota xattrs. Now when quota is enabled again, this can mess-up the accounting A version number is suffixed for all quota xattrs and this version number is specific to marker xaltor, i.e when quota xattrs are requested by quotad/client marker will remove the version suffix in the key before sending the response Change-Id: I1ca2c11460645edba0f6b68db70d476d8d26e1eb BUG: 1272411 Signed-off-by: vmallika <vmallika@redhat.com> Reviewed-on: http://review.gluster.org/12386 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com> Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Manikandan Selvaganesh <mselvaga@redhat.com> Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'xlators/features/marker/src/marker-quota.c')
-rw-r--r--xlators/features/marker/src/marker-quota.c72
1 files changed, 46 insertions, 26 deletions
diff --git a/xlators/features/marker/src/marker-quota.c b/xlators/features/marker/src/marker-quota.c
index 77b0021..39f199b 100644
--- a/xlators/features/marker/src/marker-quota.c
+++ b/xlators/features/marker/src/marker-quota.c
@@ -206,10 +206,12 @@ _quota_dict_get_meta (xlator_t *this, dict_t *dict, char *key,
}
int32_t
-quota_dict_set_size_meta (dict_t *dict, const quota_meta_t *meta)
+quota_dict_set_size_meta (xlator_t *this, dict_t *dict,
+ const quota_meta_t *meta)
{
- int32_t ret = -ENOMEM;
- quota_meta_t *value = NULL;
+ int32_t ret = -ENOMEM;
+ quota_meta_t *value = NULL;
+ char size_key[QUOTA_KEY_MAX] = {0, };
value = GF_CALLOC (2, sizeof (quota_meta_t), gf_common_quota_meta_t);
if (value == NULL) {
@@ -223,7 +225,10 @@ quota_dict_set_size_meta (dict_t *dict, const quota_meta_t *meta)
value[1].file_count = 0;
value[1].dir_count = hton64 (1);
- ret = dict_set_bin (dict, QUOTA_SIZE_KEY, value,
+ GET_SIZE_KEY (this, size_key, ret);
+ if (ret < 0)
+ goto out;
+ ret = dict_set_bin (dict, size_key, value,
(sizeof (quota_meta_t) * 2));
if (ret < 0) {
gf_log_callingfn ("quota", GF_LOG_ERROR, "dict set failed");
@@ -280,7 +285,8 @@ mq_are_xattrs_set (xlator_t *this, loc_t *loc, gf_boolean_t *contri_set,
gf_boolean_t *size_set)
{
int32_t ret = -1;
- char contri_key[CONTRI_KEY_MAX] = {0, };
+ char contri_key[QUOTA_KEY_MAX] = {0, };
+ char size_key[QUOTA_KEY_MAX] = {0, };
quota_meta_t meta = {0, };
struct iatt stbuf = {0,};
dict_t *dict = NULL;
@@ -292,7 +298,7 @@ mq_are_xattrs_set (xlator_t *this, loc_t *loc, gf_boolean_t *contri_set,
goto out;
}
- ret = mq_req_xattr (this, loc, dict, contri_key);
+ ret = mq_req_xattr (this, loc, dict, contri_key, size_key);
if (ret < 0)
goto out;
@@ -311,8 +317,7 @@ mq_are_xattrs_set (xlator_t *this, loc_t *loc, gf_boolean_t *contri_set,
*contri_set = _gf_true;
*size_set = _gf_true;
if (loc->inode->ia_type == IA_IFDIR) {
- ret = quota_dict_get_inode_meta (rsp_dict, QUOTA_SIZE_KEY,
- &meta);
+ ret = quota_dict_get_inode_meta (rsp_dict, size_key, &meta);
if (ret < 0 || meta.dir_count == 0)
*size_set = _gf_false;
}
@@ -356,7 +361,7 @@ mq_create_size_xattrs (xlator_t *this, quota_inode_ctx_t *ctx, loc_t *loc)
goto out;
}
- ret = quota_dict_set_size_meta (dict, &size);
+ ret = quota_dict_set_size_meta (this, dict, &size);
if (ret < 0)
goto out;
@@ -577,7 +582,8 @@ _mq_get_metadata (xlator_t *this, loc_t *loc, quota_meta_t *contri,
{
int32_t ret = -1;
quota_meta_t meta = {0, };
- char contri_key[CONTRI_KEY_MAX] = {0, };
+ char contri_key[QUOTA_KEY_MAX] = {0, };
+ char size_key[QUOTA_KEY_MAX] = {0, };
dict_t *dict = NULL;
dict_t *rsp_dict = NULL;
struct iatt stbuf = {0,};
@@ -595,7 +601,10 @@ _mq_get_metadata (xlator_t *this, loc_t *loc, quota_meta_t *contri,
}
if (size && loc->inode->ia_type == IA_IFDIR) {
- ret = dict_set_int64 (dict, QUOTA_SIZE_KEY, 0);
+ GET_SIZE_KEY (this, size_key, ret);
+ if (ret < 0)
+ goto out;
+ ret = dict_set_int64 (dict, size_key, 0);
if (ret < 0) {
gf_log (this->name, GF_LOG_ERROR, "dict_set failed.");
goto out;
@@ -620,7 +629,7 @@ _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 (rsp_dict, QUOTA_SIZE_KEY,
+ ret = quota_dict_get_meta (rsp_dict, size_key,
&meta);
if (ret < 0) {
gf_log (this->name, GF_LOG_ERROR,
@@ -749,9 +758,9 @@ mq_remove_contri (xlator_t *this, loc_t *loc, quota_inode_ctx_t *ctx,
inode_contribution_t *contri, quota_meta_t *delta)
{
int32_t ret = -1;
- char contri_key[CONTRI_KEY_MAX] = {0, };
+ char contri_key[QUOTA_KEY_MAX] = {0, };
- GET_CONTRI_KEY (contri_key, contri->gfid, ret);
+ GET_CONTRI_KEY (this, contri_key, contri->gfid, ret);
if (ret < 0) {
gf_log (this->name, GF_LOG_ERROR, "get contri_key "
"failed for %s", uuid_utoa(contri->gfid));
@@ -798,7 +807,7 @@ mq_update_contri (xlator_t *this, loc_t *loc, inode_contribution_t *contri,
quota_meta_t *delta)
{
int32_t ret = -1;
- char contri_key[CONTRI_KEY_MAX] = {0, };
+ char contri_key[QUOTA_KEY_MAX] = {0, };
dict_t *dict = NULL;
GF_VALIDATE_OR_GOTO ("marker", loc, out);
@@ -818,7 +827,7 @@ mq_update_contri (xlator_t *this, loc_t *loc, inode_contribution_t *contri,
goto out;
}
- GET_CONTRI_KEY (contri_key, contri->gfid, ret);
+ GET_CONTRI_KEY (this, contri_key, contri->gfid, ret);
if (ret < 0) {
gf_log (this->name, GF_LOG_ERROR, "get contri_key "
"failed for %s", uuid_utoa(contri->gfid));
@@ -884,7 +893,7 @@ mq_update_size (xlator_t *this, loc_t *loc, quota_meta_t *delta)
goto out;
}
- ret = quota_dict_set_size_meta (dict, delta);
+ ret = quota_dict_set_size_meta (this, dict, delta);
if (ret < 0)
goto out;
@@ -1795,12 +1804,13 @@ mq_inspect_directory_xattr (xlator_t *this, quota_inode_ctx_t *ctx,
inode_contribution_t *contribution, loc_t *loc,
dict_t *dict, struct iatt buf)
{
- int32_t ret = 0;
+ int32_t ret = -1;
int8_t dirty = -1;
quota_meta_t size = {0, };
quota_meta_t contri = {0, };
quota_meta_t delta = {0, };
- char contri_key[CONTRI_KEY_MAX] = {0, };
+ char contri_key[QUOTA_KEY_MAX] = {0, };
+ char size_key[QUOTA_KEY_MAX] = {0, };
gf_boolean_t status = _gf_false;
ret = dict_get_int8 (dict, QUOTA_DIRTY_KEY, &dirty);
@@ -1812,13 +1822,16 @@ mq_inspect_directory_xattr (xlator_t *this, quota_inode_ctx_t *ctx,
dirty = 0;
}
- ret = _quota_dict_get_meta (this, dict, QUOTA_SIZE_KEY, &size,
+ GET_SIZE_KEY (this, size_key, ret);
+ if (ret < 0)
+ goto out;
+ ret = _quota_dict_get_meta (this, dict, size_key, &size,
IA_IFDIR, _gf_false);
if (ret < 0)
goto create_xattr;
if (!loc_is_root(loc)) {
- GET_CONTRI_KEY (contri_key, contribution->gfid, ret);
+ GET_CONTRI_KEY (this, contri_key, contribution->gfid, ret);
if (ret < 0)
goto out;
@@ -1883,7 +1896,7 @@ mq_inspect_file_xattr (xlator_t *this, quota_inode_ctx_t *ctx,
quota_meta_t size = {0, };
quota_meta_t contri = {0, };
quota_meta_t delta = {0, };
- char contri_key[CONTRI_KEY_MAX] = {0, };
+ char contri_key[QUOTA_KEY_MAX] = {0, };
gf_boolean_t status = _gf_false;
LOCK (&ctx->lock);
@@ -1898,7 +1911,7 @@ mq_inspect_file_xattr (xlator_t *this, quota_inode_ctx_t *ctx,
}
UNLOCK (&ctx->lock);
- GET_CONTRI_KEY (contri_key, contribution->gfid, ret);
+ GET_CONTRI_KEY (this, contri_key, contribution->gfid, ret);
if (ret < 0)
goto out;
@@ -1975,9 +1988,10 @@ out:
int32_t
mq_req_xattr (xlator_t *this, loc_t *loc, dict_t *dict,
- char *contri_key)
+ char *contri_key, char *size_key)
{
- int32_t ret = -1;
+ int32_t ret = -1;
+ char key[QUOTA_KEY_MAX] = {0, };
GF_VALIDATE_OR_GOTO ("marker", this, out);
GF_VALIDATE_OR_GOTO ("marker", loc, out);
@@ -1990,7 +2004,13 @@ mq_req_xattr (xlator_t *this, loc_t *loc, dict_t *dict,
goto out;
}
- ret = dict_set_uint64 (dict, QUOTA_SIZE_KEY, 0);
+ GET_SIZE_KEY (this, key, ret);
+ if (ret < 0)
+ goto out;
+ if (size_key)
+ strncpy (size_key, key, QUOTA_KEY_MAX);
+
+ ret = dict_set_uint64 (dict, key, 0);
if (ret < 0)
goto out;