summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/cluster/dht/src/dht-rebalance.c61
1 files changed, 32 insertions, 29 deletions
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c
index d6718c55489..e20e392ceb0 100644
--- a/xlators/cluster/dht/src/dht-rebalance.c
+++ b/xlators/cluster/dht/src/dht-rebalance.c
@@ -872,7 +872,7 @@ static int
__dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from, loc_t *loc,
struct iatt *stbuf, int flag, dht_conf_t *conf,
gf_boolean_t *target_changed, xlator_t **new_subvol,
- gf_boolean_t *ignore_failure, int *fop_errno)
+ int *fop_errno)
{
struct statvfs src_statfs = {0,};
struct statvfs dst_statfs = {0,};
@@ -882,7 +882,6 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from, loc_t *loc
uint64_t src_statfs_blocks = 1;
uint64_t dst_statfs_blocks = 1;
double post_availspacepercent = 0;
- int i = 0;
xdata = dict_new ();
if (!xdata) {
@@ -1026,21 +1025,7 @@ find_new_subvol:
" with space accomodating the file - %s. Consider adding "
"bricks", loc->path);
- /* For remove-brick case if the source is not one of the
- * removed-brick, do not mark the error as failure */
- if (conf->decommission_subvols_cnt) {
- *ignore_failure = _gf_true;
- for (i = 0; i < conf->subvolume_cnt; i++) {
- if (conf->decommissioned_bricks[i] == from) {
- *ignore_failure = _gf_false;
- break;
- }
- }
- } else {
- *ignore_failure = _gf_false;
- }
-
- *target_changed = _gf_false;
+ *target_changed = _gf_false;
*fop_errno = ENOSPC;
ret = -1;
goto out;
@@ -1500,7 +1485,6 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,
xlator_t *new_target = NULL;
xlator_t *old_target = NULL;
fd_t *linkto_fd = NULL;
- gf_boolean_t ignore_failure = _gf_false;
if (from == to) {
@@ -1652,7 +1636,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,
clean_dst = _gf_true;
ret = __dht_check_free_space (this, to, from, loc, &stbuf, flag, conf,
- &target_changed, &new_target, &ignore_failure, fop_errno);
+ &target_changed, &new_target, fop_errno);
if (target_changed) {
/* Can't handle for hardlinks. Marking this as failure */
if (flag == GF_DHT_MIGRATE_HARDLINK_IN_PROGRESS || stbuf.ia_nlink > 1) {
@@ -1701,9 +1685,6 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,
}
if (ret) {
- if (ignore_failure)
- ret = 0;
-
goto out;
}
@@ -2528,6 +2509,8 @@ gf_defrag_migrate_single_file (void *opaque)
gf_dht_migrate_data_type_t rebal_type = GF_DHT_MIGRATE_DATA;
char value[MAX_REBAL_TYPE_SIZE] = {0,};
struct iatt *iatt_ptr = NULL;
+ gf_boolean_t update_skippedcount = _gf_true;
+ int i = 0;
rebal_entry = (struct dht_container *)opaque;
if (!rebal_entry) {
@@ -2667,11 +2650,32 @@ gf_defrag_migrate_single_file (void *opaque)
gf_msg_debug (this->name, 0, "migrate-data skipped for"
" %s due to space constraints",
entry_loc.path);
- LOCK (&defrag->lock);
- {
- defrag->skipped += 1;
+
+ /* For remove-brick case if the source is not one of the
+ * removed-brick, do not mark the error as failure */
+ if (conf->decommission_subvols_cnt) {
+ for (i = 0; i < conf->subvolume_cnt; i++) {
+ if (conf->decommissioned_bricks[i] == cached_subvol) {
+ LOCK (&defrag->lock);
+ {
+ defrag->total_failures += 1;
+ update_skippedcount = _gf_false;
+ }
+ UNLOCK (&defrag->lock);
+
+ break;
+ }
+ }
}
- UNLOCK (&defrag->lock);
+
+ if (update_skippedcount) {
+ LOCK (&defrag->lock);
+ {
+ defrag->skipped += 1;
+ }
+ UNLOCK (&defrag->lock);
+ }
+
} else if (fop_errno == ENOTSUP) {
gf_msg_debug (this->name, 0, "migrate-data skipped for"
" hardlink %s ", entry_loc.path);
@@ -2701,10 +2705,9 @@ gf_defrag_migrate_single_file (void *opaque)
"migrate-data on %s failed:", entry_loc.path);
} else if (ret == 1) {
ret = 0;
- goto out;
- } else if (ret == -1) {
- goto out;
}
+
+ goto out;
}
LOCK (&defrag->lock);