diff options
author | N Balachandran <nbalacha@redhat.com> | 2018-04-06 16:06:51 +0530 |
---|---|---|
committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2018-04-18 13:21:54 +0000 |
commit | 281a019e03342537345e98548a0062b96a8e1539 (patch) | |
tree | 80db69168d87745bf5373e315c86b2e59322d88d /xlators | |
parent | deb81726437d6a62a4e6b1ebb4dabe394e84446e (diff) |
cluster/dht: Handle file migrations when brick down
The decision as to which node would migrate a file
was based on the gfid of the file. Files were divided
among the nodes for the replica/disperse set. However,
if a brick was down when rebalance started, the nodeuuids
would be saved as NULL and a set of files would not be migrated.
Now, if the nodeuuid is NULL, the first non-null entry in
the set is the node responsible for migrating the file.
Change-Id: I72554c107792c7d534e0f25640654b6f8417d373
fixes: bz#1566822
Signed-off-by: N Balachandran <nbalacha@redhat.com>
(cherry picked from commit 1f0765242a689980265c472646c64473a92d94c0)
Change-Id: I3072ca1f2975eb7ad3c38798e65d60d2312fd057
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 56 |
1 files changed, 51 insertions, 5 deletions
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 8c6480bcc3a..4580e16e1c1 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -2587,6 +2587,27 @@ gf_defrag_ctx_subvols_init (dht_dfoffset_ctx_t *offset_var, xlator_t *this) { } +static int +dht_get_first_non_null_index (subvol_nodeuuids_info_t *entry) +{ + int i = 0; + int index = 0; + + for (i = 0; i < entry->count; i++) { + if (!gf_uuid_is_null (entry->elements[i].uuid)) { + index = i; + goto out; + } + } + + if (i == entry->count) { + index = -1; + } +out: + return index; +} + + /* Return value * 0 : this node does not migrate the file * 1 : this node migrates the file @@ -2603,28 +2624,53 @@ gf_defrag_should_i_migrate (xlator_t *this, int local_subvol_index, uuid_t gfid) int i = local_subvol_index; char *str = NULL; uint32_t hashval = 0; - int32_t index = 0; + int32_t index = 0; dht_conf_t *conf = NULL; char buf[UUID_CANONICAL_FORM_LEN + 1] = {0, }; + subvol_nodeuuids_info_t *entry = NULL; + conf = this->private; - /* Pure distribute */ + /* Pure distribute. A subvol in this case + will be handled by only one node */ - if (conf->local_nodeuuids[i].count == 1) { + entry = &(conf->local_nodeuuids[i]); + if (entry->count == 1) { return 1; } 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 (conf->local_nodeuuids[i].elements[index].info + index = (hashval % entry->count); + if (entry->elements[index].info == REBAL_NODEUUID_MINE) { /* Index matches this node's nodeuuid.*/ ret = 1; + goto out; + } + + /* Brick down - some other node has to migrate these files*/ + if (gf_uuid_is_null (entry->elements[index].uuid)) { + /* Fall back to the first non-null index */ + index = dht_get_first_non_null_index (entry); + + if (index == -1) { + /* None of the bricks in the subvol are up. + * CHILD_DOWN will kill the process soon */ + + return 0; + } + + if (entry->elements[index].info == REBAL_NODEUUID_MINE) { + /* Index matches this node's nodeuuid.*/ + ret = 1; + goto out; + } } } +out: return ret; } |