diff options
| author | N Balachandran <nbalacha@redhat.com> | 2017-10-10 21:45:01 +0530 | 
|---|---|---|
| committer | jiffin tony Thottan <jthottan@redhat.com> | 2017-10-12 18:25:29 +0000 | 
| commit | 417088fbac3e44d87802cfc988a51e2ad7968d70 (patch) | |
| tree | ade28a4e592b179bbbefe29d5652460376a8b615 | |
| parent | 08e083ac43f3b35892df808f41d4f9fbe6c2154b (diff) | |
cluster/dht: Don't store the entire uuid for subvols
Comparing the uuid string of the local node against that stored in the
local_subvol information is inefficient, especially as it is
done for every file to be migrated. The code has now been changed
to set the value of info to 1 if the nodeuuid is that of the node
making the comparison so this becomes an integer comparison.
> BUG: 1451434
> Signed-off-by: N Balachandran <nbalacha@redhat.com>
> https://review.gluster.org/#/c/17851
(cherry picked from commit c4a608799a577a4f38139f6bb8a47da8efb0fec3)
Change-Id: I7491d59caad3b71dbf5facc94dcde0cd53962775
BUG: 1500472
Signed-off-by: N Balachandran <nbalacha@redhat.com>
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 20 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 21 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-helper.c | 3 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 18 | 
4 files changed, 45 insertions, 17 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index b8a860d8049..c6944b21c85 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -3033,7 +3033,7 @@ dht_find_local_subvol_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          int           i              = 0;          int           index          = 0;          int           found          = 0; - +        nodeuuid_info_t *tmp_ptr     = NULL;          VALIDATE_OR_GOTO (frame, out);          VALIDATE_OR_GOTO (frame->local, out); @@ -3118,8 +3118,8 @@ dht_find_local_subvol_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  }                  conf->local_nodeuuids[index].count = count; -                conf->local_nodeuuids[index].uuids -                                 = GF_CALLOC (count, sizeof (uuid_t), 1); +                conf->local_nodeuuids[index].elements +                               = GF_CALLOC (count, sizeof (nodeuuid_info_t), 1);                  /* The node-uuids are guaranteed to be returned in the same                   * order as the bricks @@ -3134,9 +3134,15 @@ dht_find_local_subvol_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                       uuid_str = next_uuid_str) {                          next_uuid_str = strtok_r (NULL, " ", &saveptr); -                        gf_uuid_parse (uuid_str, -                                       conf->local_nodeuuids[index].uuids[i]); +                        tmp_ptr = &(conf->local_nodeuuids[index].elements[i]); +                        gf_uuid_parse (uuid_str, tmp_ptr->uuid); + +                        if (!gf_uuid_compare (tmp_ptr->uuid, +                                              conf->defrag->node_uuid)) { +                                tmp_ptr->info = REBAL_NODEUUID_MINE; +                        }                          i++; +                        tmp_ptr = NULL;                  }          } @@ -3156,8 +3162,8 @@ dht_find_local_subvol_cbk (call_frame_t *frame, void *cookie, xlator_t *this,   unwind: -        GF_FREE (conf->local_nodeuuids[index].uuids); -        conf->local_nodeuuids[index].uuids = NULL; +        GF_FREE (conf->local_nodeuuids[index].elements); +        conf->local_nodeuuids[index].elements = NULL;          DHT_STACK_UNWIND (getxattr, frame, -1, local->op_errno, NULL, xdata);   out: diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index d06b7314d8b..60560600a02 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -10,6 +10,7 @@  #include <regex.h>  #include <signal.h> +#include <fnmatch.h>  #include "dht-mem-types.h"  #include "dht-messages.h" @@ -43,6 +44,13 @@  #include <fnmatch.h> +/* Array to hold custom xattr keys +*/ +extern char *xattrs_to_heal[]; + +/* Rebalance nodeuuid flags */ +#define REBAL_NODEUUID_MINE   0x01 +  typedef int (*dht_selfheal_dir_cbk_t) (call_frame_t *frame, void *cookie,                                         xlator_t     *this,                                         int32_t       op_ret, int32_t op_errno, @@ -498,10 +506,15 @@ typedef struct gf_tier_conf {          char                         volname[GD_VOLUME_NAME_MAX + 1];  } gf_tier_conf_t; -typedef struct subvol_nodeuuids { -        uuid_t *uuids; +typedef struct nodeuuid_info { +        char info; /* Set to 1 is this is my node's uuid*/ +        uuid_t uuid; /* Store the nodeuuid as well for debugging*/ +} nodeuuid_info_t; + +typedef struct subvol_nodeuuids_info { +        nodeuuid_info_t *elements;          int count; -} subvol_nodeuuid_t; +} subvol_nodeuuids_info_t;  struct gf_defrag_info_ { @@ -644,7 +657,7 @@ struct dht_conf {          /*local subvol storage for rebalance*/          xlator_t       **local_subvols; -        subvol_nodeuuid_t       *local_nodeuuids; +        subvol_nodeuuids_info_t       *local_nodeuuids;          int32_t          local_subvols_cnt;          /* diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c index 86040705445..cca2bfe3eef 100644 --- a/xlators/cluster/dht/src/dht-helper.c +++ b/xlators/cluster/dht/src/dht-helper.c @@ -1174,7 +1174,8 @@ dht_init_local_subvolumes (xlator_t *this, dht_conf_t *conf)                                          gf_dht_mt_xlator_t);          /* FIX FIX : do this dynamically*/ -        conf->local_nodeuuids = GF_CALLOC (cnt, sizeof (subvol_nodeuuid_t), +        conf->local_nodeuuids = GF_CALLOC (cnt, +                                           sizeof (subvol_nodeuuids_info_t),                                             gf_dht_nodeuuids_t);          if (!conf->local_subvols || !conf->local_nodeuuids) { diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index b81be03404c..941e982b362 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -2450,7 +2450,12 @@ gf_defrag_ctx_subvols_init (dht_dfoffset_ctx_t *offset_var, xlator_t *this) {  /* Return value   * 0 : this node does not migrate the file   * 1 : this node migrates the file + * + * Use the hash value of the gfid to determine which node will migrate files. + * Using the gfid instead of the name also ensures that the same node handles + * all hardlinks.   */ +  int  gf_defrag_should_i_migrate (xlator_t *this, int local_subvol_index, uuid_t gfid)  { @@ -2471,13 +2476,14 @@ gf_defrag_should_i_migrate (xlator_t *this, int local_subvol_index, uuid_t gfid)          }          str = uuid_utoa_r (gfid, buf); -          ret = dht_hash_compute (this, 0, str, &hashval);          if (ret == 0) {                  index = (hashval % conf->local_nodeuuids[i].count); -                if (!gf_uuid_compare (conf->defrag->node_uuid, -                                      conf->local_nodeuuids[i].uuids[index])) +                if (conf->local_nodeuuids[i].elements[index].info +                                 == REBAL_NODEUUID_MINE) { +                        /* Index matches this node's nodeuuid.*/                          ret = 1; +                }          }          return ret;  } @@ -4309,7 +4315,7 @@ gf_defrag_start_crawl (void *data)          xlator_t                *old_THIS               = NULL;          int                      j                      = 0;          gf_boolean_t             fc_thread_started      = _gf_false; - +        uuid_t                  *uuid_ptr               = NULL;          this = data;          if (!this) @@ -4447,10 +4453,12 @@ gf_defrag_start_crawl (void *data)                  for (i = 0 ; i < conf->local_subvols_cnt; i++) {                          gf_msg (this->name, GF_LOG_INFO, 0, 0, "local subvols "                                  "are %s", conf->local_subvols[i]->name); +                          for (j = 0; j < conf->local_nodeuuids[i].count; j++) { +                                uuid_ptr = &(conf->local_nodeuuids[i].elements[j].uuid);                                  gf_msg (this->name, GF_LOG_INFO, 0, 0,                                          "node uuids are %s", -                                  uuid_utoa(conf->local_nodeuuids[i].uuids[j])); +                                        uuid_utoa(*uuid_ptr));                          }                  }  | 
