From 91c44b41654ae10a2278ee8c494910a46196077a Mon Sep 17 00:00:00 2001 From: Sunil Kumar Acharya Date: Wed, 21 Jun 2017 16:37:09 +0530 Subject: cluster/ec: Node uuid xattr support update for EC Backport of https://review.gluster.org/17594 Problem: The change in EC to return list of node uuids for GF_XATTR_NODE_UUID_KEY was causing problems with geo-rep. Fix: This patch will allow to get the single node uuid as it was doing before with the key "GF_XATTR_NODE_UUID_KEY", and will also allow to get the list of node uuids by using a new key "GF_XATTR_LIST_NODE_UUIDS_KEY". This will solve the problem with geo-rep and any other features which were depending on this. BUG: 1463250 Change-Id: I2d9214a9658d4a41a3d6de08600884d2bda5f3eb Signed-off-by: Sunil Kumar Acharya Reviewed-on: https://review.gluster.org/17615 Tested-by: Pranith Kumar Karampuri Smoke: Gluster Build System NetBSD-regression: NetBSD Build System Reviewed-by: Xavier Hernandez CentOS-regression: Gluster Build System Reviewed-by: Pranith Kumar Karampuri --- libglusterfs/src/glusterfs.h | 2 ++ xlators/cluster/ec/src/ec-combine.c | 20 +++++++++++++++----- xlators/cluster/ec/src/ec-inode-read.c | 9 ++++++++- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index be1cd6519d4..4db6a8b29a7 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -107,6 +107,8 @@ strlen (x)) == 0)) #define XATTR_IS_NODE_UUID(x) (strncmp (x, GF_XATTR_NODE_UUID_KEY, \ strlen (GF_XATTR_NODE_UUID_KEY)) == 0) +#define XATTR_IS_NODE_UUID_LIST(x) (strncmp (x, GF_XATTR_LIST_NODE_UUIDS_KEY, \ + strlen (GF_XATTR_LIST_NODE_UUIDS_KEY)) == 0) #define XATTR_IS_LOCKINFO(x) (strncmp (x, GF_XATTR_LOCKINFO_KEY, \ strlen (GF_XATTR_LOCKINFO_KEY)) == 0) diff --git a/xlators/cluster/ec/src/ec-combine.c b/xlators/cluster/ec/src/ec-combine.c index e09381b9f8a..4d0cc076680 100644 --- a/xlators/cluster/ec/src/ec-combine.c +++ b/xlators/cluster/ec/src/ec-combine.c @@ -351,7 +351,8 @@ out: static int32_t ec_dict_data_concat(const char *fmt, ec_cbk_data_t *cbk, int32_t which, - char *key, const char *def, gf_boolean_t global, ...) + char *key, char *new_key, const char *def, + gf_boolean_t global, ...) { ec_t *ec = cbk->fop->xl->private; data_t *data[ec->nodes]; @@ -432,6 +433,9 @@ ec_dict_data_concat(const char *fmt, ec_cbk_data_t *cbk, int32_t which, memcpy(str + len, post, postlen + 1); dict = (which == EC_COMBINE_XDATA) ? cbk->xdata : cbk->dict; + if (new_key) { + key = new_key; + } err = dict_set_dynstr(dict, key, str); if (err != 0) { goto out; @@ -677,14 +681,14 @@ int32_t ec_dict_data_combine(dict_t * dict, char * key, data_t * value, (strcmp(key, GF_XATTR_USER_PATHINFO_KEY) == 0)) { return ec_dict_data_concat("( { })", data->cbk, data->which, - key, NULL, _gf_false, + key, NULL, NULL, _gf_false, data->cbk->fop->xl->name); } if (strncmp(key, GF_XATTR_CLRLK_CMD, strlen(GF_XATTR_CLRLK_CMD)) == 0) { return ec_dict_data_concat("{\n}", data->cbk, data->which, key, NULL, - _gf_false); + NULL, _gf_false); } if (strncmp(key, GF_XATTR_LOCKINFO_KEY, @@ -715,8 +719,14 @@ int32_t ec_dict_data_combine(dict_t * dict, char * key, data_t * value, } if (XATTR_IS_NODE_UUID(key)) { - return ec_dict_data_concat("{ }", data->cbk, data->which, key, - UUID0_STR, _gf_true); + if (data->cbk->fop->int32) { + /* List of node uuid is requested */ + return ec_dict_data_concat("{ }", data->cbk, data->which, key, + GF_XATTR_LIST_NODE_UUIDS_KEY, + UUID0_STR, _gf_true); + } else { + return ec_dict_data_uuid(data->cbk, data->which, key); + } } if (fnmatch(GF_XATTR_STIME_PATTERN, key, FNM_NOESCAPE) == 0) diff --git a/xlators/cluster/ec/src/ec-inode-read.c b/xlators/cluster/ec/src/ec-inode-read.c index ddae9bd99f1..d03b4483a67 100644 --- a/xlators/cluster/ec/src/ec-inode-read.c +++ b/xlators/cluster/ec/src/ec-inode-read.c @@ -487,7 +487,14 @@ ec_getxattr (call_frame_t *frame, xlator_t *this, uintptr_t target, } } if (name != NULL) { - fop->str[0] = gf_strdup(name); + /* In case of list-node-uuids xattr, set flag to indicate + * the same and use node-uuid xattr for winding fop */ + if (XATTR_IS_NODE_UUID_LIST(name)) { + fop->int32 = 1; + fop->str[0] = gf_strdup(GF_XATTR_NODE_UUID_KEY); + } else { + fop->str[0] = gf_strdup(name); + } if (fop->str[0] == NULL) { gf_msg (this->name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY, -- cgit