diff options
| author | Sunil Kumar Acharya <sheggodu@redhat.com> | 2017-06-21 16:37:09 +0530 | 
|---|---|---|
| committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2017-06-23 02:56:35 +0000 | 
| commit | 0c0bc42ddfef4f05b50c3d1510e93ef3ec292a56 (patch) | |
| tree | d27ab6f043d3d4d9aebaceb87a2cdc12fed840c3 | |
| parent | b27e60a0cbdb42755cd7d4ee3c7e62b57d5881ba (diff) | |
cluster/ec: Node uuid xattr support update for EC
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: 1462790
Change-Id: I2d9214a9658d4a41a3d6de08600884d2bda5f3eb
Signed-off-by: Sunil Kumar Acharya <sheggodu@redhat.com>
Reviewed-on: https://review.gluster.org/17594
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Xavier Hernandez <xhernandez@datalab.es>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
| -rw-r--r-- | libglusterfs/src/glusterfs.h | 2 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-combine.c | 20 | ||||
| -rw-r--r-- | 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 20edd7d76cc..08ab754d398 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -109,6 +109,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("(<EC:%s> { })", 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,  | 
