diff options
author | Susant Palai <spalai@redhat.com> | 2018-05-21 11:51:47 +0530 |
---|---|---|
committer | N Balachandran <nbalacha@redhat.com> | 2018-05-28 07:30:48 +0000 |
commit | 47440dd83592438840d3b2eb27f71403f6fba7b3 (patch) | |
tree | e22c51dc76ed3bfaee668b099b3858983b5350e5 | |
parent | 3d38e4e47f129bdb36c3fbbd481dabe4ba4413d6 (diff) |
cluster/dht: Increase failure count for lookup failure in remove-brick op
An entry from readdirp might get renamed just before migration leading to
lookup failures. For such lookup failure, remove-brick process does not
see any increment in failure count. Though there is a warning message
after remove-brick commit for the user to check in the decommissioned brick
for any files those are not migrated, it's better to increase the failure count
so that user can check in the decommissioned bricks for files before commit.
Note: This can result in false negative cases for rm -rf interaction with
remove-brick op, where remove-brick shows non-zero failed count, but the
entry was actually deleted by user.
Fixes :bz#1580269
Change-Id: Icd1047ab9edc1d5bfc231a1f417a7801c424917c
fixes: bz#1580269
Signed-off-by: Susant Palai <spalai@redhat.com>
-rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index c99489597df..41a61a50e4b 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -2845,6 +2845,19 @@ gf_defrag_migrate_single_file (void *opaque) DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed: %s lookup failed", entry_loc.path); + + /* Increase failure count only for remove-brick op, so that + * user is warned to check the removed-brick for any files left + * unmigrated + */ + if (conf->decommission_subvols_cnt) { + LOCK (&defrag->lock); + { + defrag->total_failures += 1; + } + UNLOCK (&defrag->lock); + } + ret = 0; goto out; } @@ -3845,8 +3858,11 @@ gf_defrag_fix_layout (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc, DHT_MSG_DIR_LOOKUP_FAILED, "Dir:%s renamed or removed. Skipping", loc->path); - ret = 0; - goto out; + if (conf->decommission_subvols_cnt) { + defrag->total_failures++; + } + ret = 0; + goto out; } else { gf_msg (this->name, GF_LOG_ERROR, -ret, DHT_MSG_DIR_LOOKUP_FAILED, @@ -3867,6 +3883,9 @@ gf_defrag_fix_layout (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc, ret = syncop_opendir (this, loc, fd, NULL, NULL); if (ret) { if (-ret == ENOENT || -ret == ESTALE) { + if (conf->decommission_subvols_cnt) { + defrag->total_failures++; + } ret = 0; goto out; } @@ -3886,6 +3905,9 @@ gf_defrag_fix_layout (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc, { if (ret < 0) { if (-ret == ENOENT || -ret == ESTALE) { + if (conf->decommission_subvols_cnt) { + defrag->total_failures++; + } ret = 0; goto out; } @@ -3991,7 +4013,10 @@ gf_defrag_fix_layout (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc, DHT_MSG_DIR_LOOKUP_FAILED, "Dir:%s renamed or removed. " "Skipping", loc->path); - ret = 0; + ret = 0; + if (conf->decommission_subvols_cnt) { + defrag->total_failures++; + } continue; } else { gf_msg (this->name, GF_LOG_ERROR, -ret, @@ -4054,6 +4079,9 @@ gf_defrag_fix_layout (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc, "Setxattr failed. Dir %s " "renamed or removed", loc->path); + if (conf->decommission_subvols_cnt) { + defrag->total_failures++; + } ret = 0; } else { gf_msg (this->name, GF_LOG_ERROR, -ret, |