diff options
| author | N Balachandran <nbalacha@redhat.com> | 2018-05-04 10:34:13 +0530 | 
|---|---|---|
| committer | Raghavendra G <rgowdapp@redhat.com> | 2018-05-09 03:46:36 +0000 | 
| commit | 2d3b44641dc7820043eae37572292b7b3cc26625 (patch) | |
| tree | 1e248b7b3f7ca313e36fe7e6da51a0b80da37cc0 | |
| parent | d3e3b11d38b927cf849d2d7a20460650963fd438 (diff) | |
cluster/dht:  Debug virtual xattrs for dht
Provide a virtual xattr with which to query
the hashed subvol for a file.
Change-Id: Ic7abd031f875da4b9084841ea7c25d6c8a851992
fixes: bz#1574421
Signed-off-by: N Balachandran <nbalacha@redhat.com>
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 95 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 6 | 
2 files changed, 101 insertions, 0 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 679fc8e5bb5..1ad408f0c0d 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -120,6 +120,12 @@ char *xattrs_to_heal[] = {          NULL  }; + +char *dht_dbg_vxattrs[] = { +        DHT_DBG_HASHED_SUBVOL_KEY, +        NULL +}; +  /* Return true if key exists in array  */  static gf_boolean_t @@ -4730,6 +4736,90 @@ dht_marker_populate_args (call_frame_t *frame, int type, int *gauge,          return layout->cnt;  } + +/* Note we already have frame->local initialised here*/ + +int +dht_handle_debug_getxattr (call_frame_t *frame, xlator_t *this, +                           loc_t *loc, const char *key) +{ +        dht_local_t  *local         = NULL; +        int           ret           = -1; +        int           op_errno      = ENODATA; +        ia_type_t     type          = 0; +        char         *value         = NULL; + +        local = frame->local; +        if (!key) { +                op_errno = EINVAL; +                goto out; +        } + +        if (gf_get_index_by_elem (dht_dbg_vxattrs, (char *)key) == -1) { +                goto out; +        } + +        /* getxattr does not set the parent inode*/ +        if (!loc->parent) { +                   loc->parent = +                                inode_parent(local->loc.inode, NULL, NULL); +        } +        if (!loc->parent) { +                op_errno = EINVAL; +                goto out; +        } + +        gf_uuid_copy (loc->pargfid, loc->parent->gfid); + +        if (!loc->name && loc->path) { +                loc->name = strrchr (loc->path, '/'); +                if (loc->name) { +                        ++(loc->name); +                } +        } + +        local->xattr = dict_new (); +        if (!local->xattr) { +                op_errno = ENOMEM; +                goto out; +        } + +        type = loc->inode->ia_type; + +        if (strcmp (key, DHT_DBG_HASHED_SUBVOL_KEY) == 0) { +                if (IA_ISDIR (type)) { +                        op_errno = EINVAL; +                        goto out; +                } + +                local->hashed_subvol = dht_subvol_get_hashed (this, loc); +                if (local->hashed_subvol == NULL) { +                        op_errno = ENODATA; +                        goto out; +                } + +                value = gf_strdup (local->hashed_subvol->name); +                if (!value) { +                        op_errno = ENOMEM; +                        goto out; +                } + +                ret = dict_set_dynstr (local->xattr,  (char *)key, value); +                if (ret < 0) { +                        op_errno = -ret; +                        ret = -1; +                        goto out; +                } +                ret = 0; +                goto out; +        } + +out: +        DHT_STACK_UNWIND (getxattr, frame, ret, op_errno, local->xattr, NULL); +        return 0; +} + +  int  dht_getxattr (call_frame_t *frame, xlator_t *this,                loc_t *loc, const char *key, dict_t *xdata) @@ -4919,6 +5009,11 @@ dht_getxattr (call_frame_t *frame, xlator_t *this,                  return 0;          } +        if (key && (gf_get_index_by_elem (dht_dbg_vxattrs, (char *)key) >= 0)) { +                dht_handle_debug_getxattr (frame, this, loc, key); +                return 0; +        } +          if (cluster_handle_marker_getxattr (frame, loc, key, conf->vol_uuid,                                              dht_getxattr_unwind,                                              dht_marker_populate_args) == 0) diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 999a7874a22..b82d3c4d267 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -45,6 +45,12 @@  #define DHT_DIR_STAT_BLOCKS          8  #define DHT_DIR_STAT_SIZE            4096 + +/* Virtual xattrs for debugging */ + +#define DHT_DBG_HASHED_SUBVOL_KEY         "dht.file.hashed-subvol" + +  /* Array to hold custom xattr keys  */  extern char *xattrs_to_heal[];  | 
