diff options
author | Ashish Pandey <aspandey@redhat.com> | 2015-04-21 17:22:40 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2015-05-06 14:02:53 -0700 |
commit | 50063ea7f4182ed30b86f38a716d03464e07b8c6 (patch) | |
tree | 8d6c8bdd3112781062206a5a0513df4a0fff1f18 /xlators/cluster/ec/src/ec-helpers.c | |
parent | b054985d2f7db9ab72759c988db11feb855a1b5e (diff) |
cluster/ec: add separate versions for data/entry, metadata
Adding 64 bits in "version" key of extended attributes. First 64 bits (Left)
represents Data version. Last 64 bits (right) represents Meta Data version.
Note: 3.7 and 3.6 version ec can't co-exist with this change because xattrop in
3.6 will fail with ERANGE as the buffer passed to it will be '8' bytes where as
the value will be 16 bytes in 3.7. Where as 3.7 version clients can work with
old version files. For upgrades we need to tell users to complete heals and
then upgrade
BUG: 1215265
Change-Id: Ib85114680cb7e75b8371c984d9f7b6401c1ffb93
Signed-off-by: Ashish Pandey <aspandey@redhat.com>
Reviewed-on: http://review.gluster.org/10312
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Tested-by: NetBSD Build System
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators/cluster/ec/src/ec-helpers.c')
-rw-r--r-- | xlators/cluster/ec/src/ec-helpers.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/xlators/cluster/ec/src/ec-helpers.c b/xlators/cluster/ec/src/ec-helpers.c index 65deba63959..e9d842fcfa9 100644 --- a/xlators/cluster/ec/src/ec-helpers.c +++ b/xlators/cluster/ec/src/ec-helpers.c @@ -157,6 +157,52 @@ size_t ec_iov_copy_to(void * dst, struct iovec * vector, int32_t count, return total; } +int32_t ec_dict_set_array(dict_t *dict, char *key, uint64_t value[], + int32_t size) +{ + uint64_t *ptr = NULL; + int32_t vindex; + if (value == NULL) + return -1; + ptr = GF_MALLOC(sizeof(uint64_t) * size, gf_common_mt_char); + if (ptr == NULL) { + return -1; + } + for (vindex = 0; vindex < size; vindex++) { + ptr[vindex] = hton64(value[vindex]); + } + return dict_set_bin(dict, key, ptr, sizeof(uint64_t) * size); +} + + +int32_t ec_dict_del_array(dict_t *dict, char *key, uint64_t value[], + int32_t size) +{ + void *ptr; + int32_t len; + int32_t vindex; + + if ((dict == NULL) || (dict_get_ptr_and_len(dict, key, &ptr, &len) != 0)) { + return -1; + } + + if (len > (size * sizeof(uint64_t)) || + (len % sizeof (uint64_t))) + return -1; + + memset (value, 0, size * sizeof(uint64_t)); + /* 3.6 version ec would have stored version in 64 bit. In that case treat + * metadata versions as 0*/ + size = min (size, len/sizeof(uint64_t)); + for (vindex = 0; vindex < size; vindex++) { + value[vindex] = ntoh64(*((uint64_t *)ptr + vindex)); + } + dict_del(dict, key); + + return 0; +} + + int32_t ec_dict_set_number(dict_t * dict, char * key, uint64_t value) { uint64_t * ptr; |