diff options
| author | karthik-us <ksubrahm@redhat.com> | 2017-06-19 19:54:36 +0530 | 
|---|---|---|
| committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2017-06-22 20:54:58 +0000 | 
| commit | 63be8940a73cc92b54e8cee20df5df19bdb9daee (patch) | |
| tree | c48df6efdc9a66d385ba6e8ee3a0e2d97cfb036b | |
| parent | 0aafbacc2b97ab010506d42b8c1f34f5c67bf258 (diff) | |
cluster/afr: Returning single and list of node uuids from AFR
Problem:
The change in afr to return list of node uuids 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 feature which were depending on this.
> Change-Id: I09885dac6dfca127be94b708470c8c2941356f9a
> BUG: 1462790
> Signed-off-by: karthik-us <ksubrahm@redhat.com>
> Reviewed-on: https://review.gluster.org/17576
> Smoke: Gluster Build System <jenkins@build.gluster.org>
> Reviewed-by: Ravishankar N <ravishankar@redhat.com>
> Reviewed-by: Kotresh HR <khiremat@redhat.com>
> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
> Reviewed-by: Jeff Darcy <jeff@pl.atyp.us>
(cherry picked from commit 475ec9928ef96b63a0bfa859a9ae68709275033c)
Change-Id: I6f6e8320a1eb5909ef601e23f8a8d3499807e319
BUG: 1463250
Signed-off-by: karthik-us <ksubrahm@redhat.com>
Reviewed-on: https://review.gluster.org/17602
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Smoke: Gluster Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
| -rw-r--r-- | libglusterfs/src/glusterfs.h | 1 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-inode-read.c | 88 | 
2 files changed, 80 insertions, 9 deletions
diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index 7eaeb0c7dbd..be1cd6519d4 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -83,6 +83,7 @@  #define GF_XATTR_CLRLK_CMD      "glusterfs.clrlk"  #define GF_XATTR_PATHINFO_KEY   "trusted.glusterfs.pathinfo"  #define GF_XATTR_NODE_UUID_KEY  "trusted.glusterfs.node-uuid" +#define GF_XATTR_LIST_NODE_UUIDS_KEY "trusted.glusterfs.list-node-uuids"  #define GF_REBAL_FIND_LOCAL_SUBVOL "glusterfs.find-local-subvol"  #define GF_XATTR_VOL_ID_KEY   "trusted.glusterfs.volume-id"  #define GF_XATTR_LOCKINFO_KEY   "trusted.glusterfs.lockinfo" diff --git a/xlators/cluster/afr/src/afr-inode-read.c b/xlators/cluster/afr/src/afr-inode-read.c index 20446d88c99..ecf94a523db 100644 --- a/xlators/cluster/afr/src/afr-inode-read.c +++ b/xlators/cluster/afr/src/afr-inode-read.c @@ -713,14 +713,64 @@ unwind:          return ret;  } +/** + * node-uuid cbk uses next child querying mechanism + */ +int32_t +afr_getxattr_node_uuid_cbk (call_frame_t *frame, void *cookie, +                            xlator_t *this, int32_t op_ret, int32_t op_errno, +                            dict_t *dict, dict_t *xdata) +{ +        afr_private_t  *priv            = NULL; +        afr_local_t    *local           = NULL; +        xlator_t      **children        = NULL; +        int             unwind          = 1; +        int             curr_call_child = 0; + +        priv = this->private; +        children = priv->children; + +        local = frame->local; + +        if (op_ret == -1) { /** query the _next_ child */ + +                /** +                 * _current_ becomes _next_ +                 * If done with all childs and yet no success; give up ! +                 */ +                curr_call_child = (int) ((long)cookie); +                if (++curr_call_child == priv->child_count) +                        goto unwind; + +                gf_msg_debug (this->name, op_errno, +                              "op_ret (-1): Re-querying afr-child (%d/%d)", +                              curr_call_child, priv->child_count); + +                unwind = 0; +                STACK_WIND_COOKIE (frame, afr_getxattr_node_uuid_cbk, +                                   (void *) (long) curr_call_child, +                                   children[curr_call_child], +                                   children[curr_call_child]->fops->getxattr, +                                   &local->loc, +                                   local->cont.getxattr.name, +                                   local->xdata_req); +        } + + unwind: +        if (unwind) +                AFR_STACK_UNWIND (getxattr, frame, op_ret, op_errno, dict, +                                  xdata); + +        return 0; +}  /** - * node-uuid cbk returns the list of node_uuids for the subvolume. + * list-node-uuids cbk returns the list of node_uuids for the subvolume.   */  int32_t -afr_getxattr_node_uuid_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                            int32_t op_ret, int32_t op_errno, dict_t *dict, -                            dict_t *xdata) +afr_getxattr_list_node_uuids_cbk (call_frame_t *frame, void *cookie, +                                  xlator_t *this, int32_t op_ret, +                                  int32_t op_errno, dict_t *dict, dict_t *xdata)  {          afr_local_t    *local          = NULL;          afr_private_t  *priv           = NULL; @@ -794,7 +844,8 @@ unlock:                          local->op_errno = ENOMEM;                          goto unwind;                  } -                ret = dict_set_dynstr (local->dict, local->cont.getxattr.name, +                ret = dict_set_dynstr (local->dict, +                                       GF_XATTR_LIST_NODE_UUIDS_KEY,                                         xattr_serz);                  if (ret) {                          gf_msg (this->name, GF_LOG_ERROR, @@ -1427,8 +1478,8 @@ afr_is_special_xattr (const char *name, fop_getxattr_cbk_t *cbk,                  *cbk = afr_common_getxattr_stime_cbk;          } else if (strcmp (name, QUOTA_SIZE_KEY) == 0) {                  *cbk = afr_getxattr_quota_size_cbk; -        } else if (!strcmp (name, GF_XATTR_NODE_UUID_KEY)) { -                *cbk = afr_getxattr_node_uuid_cbk; +        } else if (!strcmp (name, GF_XATTR_LIST_NODE_UUIDS_KEY)) { +                *cbk = afr_getxattr_list_node_uuids_cbk;          } else {                  is_spl = _gf_false;          } @@ -1453,15 +1504,20 @@ afr_getxattr_all_subvols (xlator_t *this, call_frame_t *frame,          //local->call_count set in afr_local_init          call_count = local->call_count; +        if (!strcmp (name, GF_XATTR_LIST_NODE_UUIDS_KEY)) { +                GF_FREE (local->cont.getxattr.name); +                local->cont.getxattr.name = gf_strdup (GF_XATTR_NODE_UUID_KEY); +        } +          //If up-children count is 0, afr_local_init would have failed already          //and the call would have unwound so not handling it here. -          for (i = 0; i < priv->child_count; i++) {                  if (local->child_up[i]) {                          STACK_WIND_COOKIE (frame, cbk,                                             (void *) (long) i, priv->children[i],                                             priv->children[i]->fops->getxattr, -                                           loc, name, NULL); +                                           loc, local->cont.getxattr.name, +                                           NULL);                          if (!--call_count)                                  break;                  } @@ -1545,6 +1601,8 @@ afr_getxattr (call_frame_t *frame, xlator_t *this,  {          afr_private_t           *priv         = NULL;          afr_local_t             *local        = NULL; +        xlator_t                **children    = NULL; +        int                     i             = 0;          int32_t                 op_errno      = 0;          int                     ret           = -1;          fop_getxattr_cbk_t      cbk           = NULL; @@ -1556,6 +1614,8 @@ afr_getxattr (call_frame_t *frame, xlator_t *this,          priv     = this->private; +        children = priv->children; +          loc_copy (&local->loc, loc);  	local->op = GF_FOP_GETXATTR; @@ -1596,6 +1656,16 @@ afr_getxattr (call_frame_t *frame, xlator_t *this,                  return 0;          } +        if (XATTR_IS_NODE_UUID (name)) { +                i = 0; +                STACK_WIND_COOKIE (frame, afr_getxattr_node_uuid_cbk, +                                   (void *) (long) i, +                                   children[i], +                                   children[i]->fops->getxattr, +                                   loc, name, xdata); +                return 0; +        } +  no_name:  	afr_read_txn (frame, this, local->loc.inode, afr_getxattr_wind,  | 
