path: root/xlators/features
diff options
authorKrutika Dhananjay <>2014-05-21 17:47:03 +0530
committerVijay Bellur <>2014-06-02 03:56:46 -0700
commitdb022ef7ecca77cbecbcc4c046b6d3aafd2cb86f (patch)
tree0abb9a8bfb99ef814d1f994a60826d2a1c63b64c /xlators/features
parent0d26de1b0a4a0fbf7e33dab8bc46c38c179e8645 (diff)
cluster/dht: Fix min-free-disk calculations when quota-deem-statfs is on
PROBLEM: As part of file creation, DHT sends a statfs call to all of its sub-volumes and expects in return the local space consumption and availability on each one of them. This information is used by DHT to ensure that atleast min-free-disk amount of space is left on each sub-volume in the event that there ARE other sub-volumes with more space available. But when quota-deem-statfs is enabled, quota xlator on every brick unwinds the statfs call with volume-wide consumption of disk space. This leads to miscalculation in min-free-disk algo, thereby misleading DHT at some point, into thinking all sub-volumes have equal available space, in which case DHT keeps sending new file creates to subvol-0, causing it to become 100% full at some point although there ARE other subvols with ample space available. FIX: The fix is to make quota_statfs() behave as if quota xlator weren't enabled, thereby making every brick return only its local consumption and disk space availability. Change-Id: I211371a1eddb220037bd36a128973938ea8124c2 BUG: 1099890 Signed-off-by: Krutika Dhananjay <> Reviewed-on: Tested-by: Gluster Build System <> Reviewed-by: Raghavendra G <> Reviewed-by: Vijay Bellur <>
Diffstat (limited to 'xlators/features')
1 files changed, 12 insertions, 4 deletions
diff --git a/xlators/features/quota/src/quota.c b/xlators/features/quota/src/quota.c
index c3e730bd1fd..06ef9615a19 100644
--- a/xlators/features/quota/src/quota.c
+++ b/xlators/features/quota/src/quota.c
@@ -3808,16 +3808,24 @@ out:
quota_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
- quota_local_t *local = NULL;
- int op_errno = 0;
- int ret = -1;
- quota_priv_t *priv = NULL;
+ int op_errno = 0;
+ int ret = -1;
+ int8_t ignore_deem_statfs = 0;
+ quota_priv_t *priv = NULL;
+ quota_local_t *local = NULL;
priv = this->private;
GF_ASSERT (loc);
WIND_IF_QUOTAOFF (priv->is_quota_on, off);
+ ret = dict_get_int8 (xdata, GF_INTERNAL_IGNORE_DEEM_STATFS,
+ &ignore_deem_statfs);
+ ret = 0;
+ if (ignore_deem_statfs)
+ goto off;
if (priv->consider_statfs && loc->inode) {
local = quota_local_new ();
if (!local) {