diff options
| -rw-r--r-- | tests/bugs/distribute/bug-1247563.t | 5 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 25 | 
2 files changed, 25 insertions, 5 deletions
diff --git a/tests/bugs/distribute/bug-1247563.t b/tests/bugs/distribute/bug-1247563.t index f7f92582e04..a2fc722896f 100644 --- a/tests/bugs/distribute/bug-1247563.t +++ b/tests/bugs/distribute/bug-1247563.t @@ -30,6 +30,7 @@ TEST glusterfs --acl -s $H0 --volfile-id $V0 $M0  TEST mkdir $M0/dir1  echo "Testing pacls on rebalance" > $M0/dir1/FILE1 +  FPATH1=`find $B0/ -name FILE1`  # Rename the file to create a linkto, for rebalance to @@ -55,3 +56,7 @@ COUNT=`getfacl $FPATH2 |grep -c "user:root:rwx"`  EXPECT "0" echo $COUNT  cleanup; + + +#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000 +#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000 diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 23383c528bc..f48ba19cc3d 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -891,8 +891,10 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from,          dht_layout_t   *layout     = NULL;          uint64_t        src_statfs_blocks = 1;          uint64_t        dst_statfs_blocks = 1; -        double          post_availspacepercent = 0; +        double          dst_post_availspacepercent = 0; +        double          src_post_availspacepercent = 0;          uint64_t        file_blocks = 0; +        uint64_t        src_total_blocks = 0;          uint64_t        dst_total_blocks = 0;          xdata = dict_new (); @@ -953,6 +955,10 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from,                             (dst_statfs.f_frsize /                             GF_DISK_SECTOR_SIZE); +        src_total_blocks = src_statfs.f_blocks * +                           (src_statfs.f_frsize / +                           GF_DISK_SECTOR_SIZE); +          /* if force option is given, do not check for space @ dst.           * Check only if space is avail for the file */          if (flag != GF_DHT_MIGRATE_DATA) @@ -964,6 +970,9 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from,             subvol gains certain 'blocks' of free space. A valid check is             necessary here to avoid errorneous move to destination where             the space could be scantily available. +           With heterogenous brick support, an actual space comparison could +           prevent any files being migrated to newly added bricks if they are +           smaller then the free space available on the existing bricks.           */          if (stbuf) {                  if (!conf->use_fallocate) { @@ -977,7 +986,13 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from,                          }                  } -                if (dst_statfs_blocks <= src_statfs_blocks) { +                src_post_availspacepercent = +                        ((src_statfs_blocks + file_blocks) * 100) / src_total_blocks; + +                dst_post_availspacepercent = +                        (dst_statfs_blocks * 100) / dst_total_blocks; + +                if (dst_post_availspacepercent < src_post_availspacepercent) {                          gf_msg (this->name, GF_LOG_WARNING, 0,                                  DHT_MSG_MIGRATE_FILE_FAILED,                                  "data movement of file " @@ -998,15 +1013,15 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from,  check_avail_space:          if (conf->disk_unit == 'p' && dst_statfs.f_blocks) { -                post_availspacepercent = +                dst_post_availspacepercent =                          (dst_statfs_blocks * 100) / dst_total_blocks;                  gf_msg_debug (this->name, 0, "file : %s, post_availspacepercent"                                " : %lf f_bavail : %lu min-free-disk: %lf", -                              loc->path, post_availspacepercent, +                              loc->path, dst_post_availspacepercent,                                dst_statfs.f_bavail, conf->min_free_disk); -                if (post_availspacepercent < conf->min_free_disk) { +                if (dst_post_availspacepercent < conf->min_free_disk) {                          gf_msg (this->name, GF_LOG_WARNING, 0, 0,                                  "Write will cross min-free-disk for "                                  "file - %s on subvol - %s. Looking "  | 
