From 1ef501b5c526a2dec6592cb8693996a81e5834c4 Mon Sep 17 00:00:00 2001 From: Raghavendra G Date: Mon, 21 Mar 2011 01:54:42 +0000 Subject: cluster/distribute: aggregate quota-sizes in lookup and getxattr. Signed-off-by: Raghavendra G Signed-off-by: Vijay Bellur BUG: 2473 (Support for volume and directory level quota) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2473 --- xlators/cluster/dht/src/dht-common.c | 56 ++++++++++++++++++++++++++++++++++-- xlators/lib/src/libxlator.h | 1 + 2 files changed, 55 insertions(+), 2 deletions(-) (limited to 'xlators') diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index d1b5936b4..5042ad065 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -30,11 +30,52 @@ #include "libxlator.h" #include "dht-common.h" #include "defaults.h" +#include "byte-order.h" #include #include +void +dht_aggregate (dict_t *this, char *key, data_t *value, void *data) +{ + dict_t *dst = NULL; + int64_t *ptr = 0, size = 0; + int32_t ret = -1; + + dst = data; + + if (strncmp (key, GF_XATTR_QUOTA_SIZE_KEY, + strlen (GF_XATTR_QUOTA_SIZE_KEY)) == 0) { + ret = dict_get_bin (dst, key, (void **)&ptr); + if (ret == 0) { + size = ntoh64 (*ptr); + } + + ptr = data_to_bin (value); + + size += ntoh64 (*ptr); + + *ptr = hton64 (*ptr); + ret = dict_set_bin (dst, key, ptr, sizeof (int64_t)); + } + + return; +} + + +void +dht_aggregate_xattr (dict_t *dst, dict_t *src) +{ + if ((dst == NULL) || (src == NULL)) { + goto out; + } + + dict_foreach (src, dht_aggregate, dst); +out: + return; +} + /* TODO: - use volumename in xattr instead of "dht" - use NS locks @@ -147,8 +188,12 @@ dht_lookup_dir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, } local->op_ret = 0; - if (local->xattr == NULL) + if (local->xattr == NULL) { local->xattr = dict_ref (xattr); + } else { + dht_aggregate_xattr (local->xattr, xattr); + } + if (local->inode == NULL) local->inode = inode_ref (inode); @@ -463,8 +508,11 @@ dht_revalidate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (local->loc.parent) local->postparent.ia_ino = local->loc.parent->ino; - if (!local->xattr) + if (!local->xattr) { local->xattr = dict_ref (xattr); + } else if (is_dir) { + dht_aggregate_xattr (local->xattr, xattr); + } } unlock: UNLOCK (&frame->lock); @@ -1884,6 +1932,10 @@ dht_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (!local->xattr) { local->xattr = dict_copy_with_ref (xattr, NULL); } else { + /* first aggregate everything into xattr and then copy into + * local->xattr. + */ + dht_aggregate_xattr (xattr, local->xattr); local->xattr = dict_copy (xattr, local->xattr); } out: diff --git a/xlators/lib/src/libxlator.h b/xlators/lib/src/libxlator.h index c5e564faf..af7eb434a 100644 --- a/xlators/lib/src/libxlator.h +++ b/xlators/lib/src/libxlator.h @@ -22,6 +22,7 @@ #define UUID_SIZE 36 #define MARKER_UUID_TYPE 1 #define MARKER_XTIME_TYPE 2 +#define GF_XATTR_QUOTA_SIZE_KEY "trusted.glusterfs.quota.size" typedef int32_t (*xlator_specf_unwind_t) (call_frame_t *frame, -- cgit