diff options
Diffstat (limited to 'xlators/cluster/dht/src')
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 121 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 5 |
2 files changed, 74 insertions, 52 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 377f44b95..0d0df320d 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -1629,8 +1629,27 @@ fill_layout_info (dht_layout_t *layout, char *buf) } } +void +dht_fill_pathinfo_xattr (xlator_t *this, dht_local_t *local, + char *xattr_buf, int32_t alloc_len, + int flag, char *layout_buf) +{ + if (flag && local->xattr_val) + snprintf (xattr_buf, alloc_len, + "((<"DHT_PATHINFO_HEADER"%s> %s) (%s-layout %s))", + this->name, local->xattr_val, this->name, + layout_buf); + else if (local->xattr_val) + snprintf (xattr_buf, alloc_len, + "(<"DHT_PATHINFO_HEADER"%s> %s)", + this->name, local->xattr_val); + else if (flag) + snprintf (xattr_buf, alloc_len, "(%s-layout %s)", + this->name, layout_buf); +} + int -dht_pathinfo_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +dht_vgetxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, int op_errno, dict_t *xattr) { dht_local_t *local = NULL; @@ -1647,31 +1666,36 @@ dht_pathinfo_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, local = frame->local; if (op_ret != -1) { - ret = dict_get_str (xattr, GF_XATTR_PATHINFO_KEY, &value_got); + ret = dict_get_str (xattr, local->xsel, &value_got); if (!ret) { alloc_len = strlen (value_got); /** - * allocate the buffer:- we allocate 10 bytes extra in case we need to - * append ' Link: ' in the buffer for another STACK_WIND + * allocate the buffer:- we allocate 10 bytes extra in + * case we need to append ' Link: ' in the buffer for + * another STACK_WIND */ - if (!local->pathinfo) { + if (!local->xattr_val) { alloc_len += (strlen (DHT_PATHINFO_HEADER) + 10); - local->pathinfo = GF_CALLOC (alloc_len, sizeof (char), gf_common_mt_char); + local->xattr_val = + GF_CALLOC (alloc_len, + sizeof (char), + gf_common_mt_char); } - if (local->pathinfo) { - plen = strlen (local->pathinfo); + if (local->xattr_val) { + plen = strlen (local->xattr_val); if (plen) { /* extra byte(s) for \0 to be safe */ alloc_len += (plen + 2); - local->pathinfo = GF_REALLOC (local->pathinfo, - alloc_len); - if (!local->pathinfo) + local->xattr_val = + GF_REALLOC (local->xattr_val, + alloc_len); + if (!local->xattr_val) goto out; } - strcat (local->pathinfo, value_got); + strcat (local->xattr_val, value_got); } } } @@ -1687,26 +1711,28 @@ dht_pathinfo_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, dict = dict_new (); - /* we would need max-to-max this many bytes to create pathinfo string */ - alloc_len += (2 * strlen (this->name)) + strlen (layout_buf) + 40; - xattr_buf = GF_CALLOC (alloc_len, sizeof (char), gf_common_mt_char); - - if (flag && local->pathinfo) - snprintf (xattr_buf, alloc_len, "((<"DHT_PATHINFO_HEADER"%s> %s) (%s-layout %s))", - this->name, local->pathinfo, this->name, - layout_buf); - else if (local->pathinfo) - snprintf (xattr_buf, alloc_len, "(<"DHT_PATHINFO_HEADER"%s> %s)", - this->name, local->pathinfo); - else if (flag) - snprintf (xattr_buf, alloc_len, "(%s-layout %s)", - this->name, layout_buf); + /* we would need max this many bytes to create xattr string */ + alloc_len += (2 * strlen (this->name)) + + strlen (layout_buf) + + 40; + xattr_buf = GF_CALLOC (alloc_len, + sizeof (char), gf_common_mt_char); + + if (XATTR_IS_PATHINFO (local->xsel)) { + (void) dht_fill_pathinfo_xattr (this, local, xattr_buf, + alloc_len, flag, + layout_buf); + } else if (XATTR_IS_NODE_UUID (local->xsel)) { + (void) snprintf (xattr_buf, alloc_len, "%s", + local->xattr_val); + } else + gf_log (this->name, GF_LOG_WARNING, + "Unknown local->xsel (%s)", local->xsel); - ret = dict_set_dynstr (dict, GF_XATTR_PATHINFO_KEY, - xattr_buf); + ret = dict_set_dynstr (dict, local->xsel, xattr_buf); - if (local->pathinfo) - GF_FREE (local->pathinfo); + if (local->xattr_val) + GF_FREE (local->xattr_val); DHT_STACK_UNWIND (getxattr, frame, op_ret, op_errno, dict); @@ -1716,19 +1742,24 @@ dht_pathinfo_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, return 0; } - if (local->pathinfo) - strcat (local->pathinfo, " Link: "); + /** + * XXX: We will never reach here as call_cnt will always be 1. + * But code is kept untouched as we may need it when hashed_subvol + * bug is fixed. + */ + if (local->xattr_val) + strcat (local->xattr_val, " Link: "); if (local->hashed_subvol) { /* This will happen if there pending */ - STACK_WIND (frame, dht_pathinfo_getxattr_cbk, local->hashed_subvol, + STACK_WIND (frame, dht_vgetxattr_cbk, local->hashed_subvol, local->hashed_subvol->fops->getxattr, &local->loc, local->key); return 0; } - gf_log ("this->name", GF_LOG_ERROR, "Unable to find hashed_subvol for path" - " %s", local->pathinfo); + gf_log ("this->name", GF_LOG_ERROR, "Unable to find hashed_subvol" + " for path %s", local->xattr_val); DHT_STACK_UNWIND (getxattr, frame, -1, op_errno, dict); return 0; @@ -1852,25 +1883,13 @@ dht_getxattr (call_frame_t *frame, xlator_t *this, } } - if (key && (strcmp (key, GF_XATTR_PATHINFO_KEY) == 0)) { - hashed_subvol = dht_subvol_get_hashed (this, loc); - if (!hashed_subvol) { - gf_log (this->name, GF_LOG_ERROR, - "Failed to get hashed_subvol for %s", - loc->path); - op_errno = EINVAL; - goto err; - } - + if (key && ((strcmp (key, GF_XATTR_PATHINFO_KEY) == 0) + || strcmp (key, GF_XATTR_NODE_UUID_KEY) == 0)) { cached_subvol = local->cached_subvol; + (void) strncpy (local->xsel, key, 256); local->call_cnt = 1; - if (hashed_subvol != cached_subvol) { - local->call_cnt = 2; - local->hashed_subvol = hashed_subvol; - } - - STACK_WIND (frame, dht_pathinfo_getxattr_cbk, cached_subvol, + STACK_WIND (frame, dht_vgetxattr_cbk, cached_subvol, cached_subvol->fops->getxattr, loc, key); return 0; diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 798d5b6d9..3d215ab25 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -144,9 +144,12 @@ struct dht_local { dev_t rdev; /* need for file-info */ - char *pathinfo; + char *xattr_val; char *key; + /* which xattr request? */ + char xsel[256]; + char *newpath; /* gfid related */ |