diff options
Diffstat (limited to 'xlators/cluster/dht/src/dht-common.c')
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 64 | 
1 files changed, 61 insertions, 3 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index fe0dc0d3455..22061ef5682 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -2998,6 +2998,8 @@ dht_vgetxattr_fill_and_set (dht_local_t *local, dict_t **dict, xlator_t *this,   out:          return ret;  } + +  int  dht_find_local_subvol_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                             int op_ret, int op_errno, dict_t *xattr, @@ -3013,6 +3015,11 @@ dht_find_local_subvol_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          char         *next_uuid_str = NULL;          char         *saveptr       = NULL;          uuid_t        node_uuid     = {0,}; +        char         *uuid_list_copy = NULL; +        int           count          = 0; +        int           i              = 0; +        int           index          = 0; +        int           found          = 0;          VALIDATE_OR_GOTO (frame, out); @@ -3022,6 +3029,10 @@ dht_find_local_subvol_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          prev = cookie;          conf = this->private; +        VALIDATE_OR_GOTO (conf->defrag, out); + +        gf_msg_debug (this->name, 0, "subvol %s returned", prev->name); +          LOCK (&frame->lock);          {                  this_call_cnt = --local->call_cnt; @@ -3045,6 +3056,15 @@ dht_find_local_subvol_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                          goto unlock;                  } +                /* As DHT will not know details of its child xlators +                 * we need to parse this twice to get the count first +                 * and allocate memory later. +                 */ +                count = 0; +                index = conf->local_subvols_cnt; + +                uuid_list_copy = gf_strdup (uuid_list); +                  for (uuid_str = strtok_r (uuid_list, " ", &saveptr);                       uuid_str;                       uuid_str = next_uuid_str) { @@ -3054,24 +3074,57 @@ dht_find_local_subvol_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                                  gf_msg (this->name, GF_LOG_ERROR, 0,                                          DHT_MSG_UUID_PARSE_ERROR,                                          "Failed to parse uuid" -                                        " failed for %s", prev->name); +                                        " for %s", prev->name);                                  local->op_ret = -1;                                  local->op_errno = EINVAL;                                  goto unlock;                          } +                        count++;                          if (gf_uuid_compare (node_uuid, conf->defrag->node_uuid)) {                                  gf_msg_debug (this->name, 0, "subvol %s does not"                                                "belong to this node",                                                prev->name);                          } else { + +                                /* handle multiple bricks of the same replica +                                 * on the same node */ +                                if (found) +                                        continue;                                  conf->local_subvols[(conf->local_subvols_cnt)++] -                                        = prev; +                                                = prev; +                                found = 1;                                  gf_msg_debug (this->name, 0, "subvol %s belongs to"                                                " this node", prev->name); -                                break;                          }                  } + +                if (!found) { +                        local->op_ret = 0; +                        goto unlock; +                } + +                conf->local_nodeuuids[index].count = count; +                conf->local_nodeuuids[index].uuids +                                 = GF_CALLOC (count, sizeof (uuid_t), 1); + +                /* The node-uuids are guaranteed to be returned in the same +                 * order as the bricks +                 * A null node-uuid is returned for a brick that is down. +                 */ + +                saveptr = NULL; +                i = 0; + +                for (uuid_str = strtok_r (uuid_list_copy, " ", &saveptr); +                     uuid_str; +                     uuid_str = next_uuid_str) { + +                        next_uuid_str = strtok_r (NULL, " ", &saveptr); +                        gf_uuid_parse (uuid_str, +                                       conf->local_nodeuuids[index].uuids[i]); +                        i++; +                }          }          local->op_ret = 0; @@ -3089,8 +3142,13 @@ dht_find_local_subvol_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          goto out;   unwind: + +        GF_FREE (conf->local_nodeuuids[index].uuids); +        conf->local_nodeuuids[index].uuids = NULL; +          DHT_STACK_UNWIND (getxattr, frame, -1, local->op_errno, NULL, xdata);   out: +        GF_FREE (uuid_list_copy);          return 0;  }  | 
