diff options
| -rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 61 | 
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);  | 
