diff options
| author | Raghavendra G <raghavendra@gluster.com> | 2011-06-14 23:55:00 +0000 | 
|---|---|---|
| committer | Anand Avati <avati@gluster.com> | 2011-06-16 22:01:15 -0700 | 
| commit | 7e598e4baa1952d407c1edab329e01634fe719c4 (patch) | |
| tree | a5b75d43955c2eab21b93f132375c2f1f935155d | |
| parent | acbf2d5dd4782c4236373237d73980163936d17c (diff) | |
features/marker-quota: use mutexes while accessing contribution values.
Signed-off-by: Raghavendra G <raghavendra@gluster.com>
Signed-off-by: Anand Avati <avati@gluster.com>
BUG: 2697 (Quota: add-brick creates the size go awkward, though it was perfect earlier)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2697
| -rw-r--r-- | xlators/features/marker/src/marker-quota-helper.c | 2 | ||||
| -rw-r--r-- | xlators/features/marker/src/marker-quota.c | 143 | ||||
| -rw-r--r-- | xlators/features/marker/src/marker-quota.h | 1 | 
3 files changed, 97 insertions, 49 deletions
diff --git a/xlators/features/marker/src/marker-quota-helper.c b/xlators/features/marker/src/marker-quota-helper.c index 9a7310e8ad9..c56f8eac7d5 100644 --- a/xlators/features/marker/src/marker-quota-helper.c +++ b/xlators/features/marker/src/marker-quota-helper.c @@ -178,6 +178,8 @@ __add_new_contribution_node (xlator_t *this, quota_inode_ctx_t *ctx, loc_t *loc)          uuid_copy (contribution->gfid, loc->parent->gfid); +	LOCK_INIT (&contribution->lock); +          list_add_tail (&contribution->contri_list, &ctx->contribution_head);  out: diff --git a/xlators/features/marker/src/marker-quota.c b/xlators/features/marker/src/marker-quota.c index fdcd22bc79d..3d42df04fad 100644 --- a/xlators/features/marker/src/marker-quota.c +++ b/xlators/features/marker/src/marker-quota.c @@ -180,7 +180,11 @@ mark_inode_undirty (call_frame_t *frame, void *cookie, xlator_t *this,          if (ret)                  goto wind; -        local->ctx->size = ntoh64 (*size); +	LOCK (&local->ctx->lock); +	{ +	  local->ctx->size = ntoh64 (*size); +	} +	UNLOCK (&local->ctx->lock);  wind:          newdict = dict_new (); @@ -1106,7 +1110,11 @@ quota_update_parent_size (call_frame_t *frame,                  goto err;          } -        local->contri->contribution += local->delta; +	LOCK (&local->contri->lock); +	{ +	  local->contri->contribution += local->delta; +	} +	UNLOCK (&local->contri->lock);          gf_log (this->name, GF_LOG_DEBUG, "%s %"PRId64 "%"PRId64,                  local->loc.path, local->ctx->size, @@ -1163,7 +1171,7 @@ quota_update_inode_contribution (call_frame_t *frame, void *cookie,                                   struct iatt *postparent)  {          int32_t               ret              = -1; -        int64_t              *size             = NULL; +        int64_t              *size             = NULL, size_int = 0, contri_int = 0;          int64_t              *contri           = NULL;          int64_t              *delta            = NULL;          char                  contri_key [512] = {0, }; @@ -1205,24 +1213,32 @@ quota_update_inode_contribution (call_frame_t *frame, void *cookie,                  } else                          ctx->size = buf->ia_blocks * 512; -                ret = dict_get_bin (dict, contri_key, (void **) &contri); -                if (ret < 0) -                        contribution->contribution = 0; -                else -                        contribution->contribution = ntoh64 (*contri); +		size_int = ctx->size; +	} + unlock: +	UNLOCK  (&ctx->lock); -                ret = 0; -        } -unlock: -        UNLOCK (&ctx->lock); +	if (ret < 0) { +	  goto err; +	} -        if (ret < 0) -                goto err; +	ret = dict_get_bin (dict, contri_key, (void **) &contri); + +	LOCK (&contribution->lock); +	{ +	  if (ret < 0) +	    contribution->contribution = 0; +	  else +	    contribution->contribution = ntoh64 (*contri); + +	  contri_int = contribution->contribution; +        } +	UNLOCK (&contribution->lock);          gf_log (this->name, GF_LOG_DEBUG, "%s %"PRId64 "%"PRId64, -                local->loc.path, ctx->size, contribution->contribution); +                local->loc.path, size_int, contri_int); -        local->delta = ctx->size - contribution->contribution; +        local->delta = size_int - contri_int;          if (local->delta == 0) {                  quota_mark_undirty (frame, NULL, this, 0, 0, NULL); @@ -1499,17 +1515,16 @@ out:  } -int32_t -validate_inode_size_contribution (xlator_t *this, -                                  loc_t *loc, -                                  quota_inode_ctx_t *ctx, -                                  inode_contribution_t *contribution) -{ -        if (ctx->size != contribution->contribution) -                initiate_quota_txn (this, loc); +/* int32_t */ +/* validate_inode_size_contribution (xlator_t *this, loc_t *loc, int64_t size, */ +/* 				  int64_t contribution) */ +/* { */ +/*   if (size != contribution) { */ +/*     initiate_quota_txn (this, loc); */ +/*   } */ -        return 0; -} +/*   return 0; */ +/* } */  int32_t @@ -1520,8 +1535,8 @@ inspect_directory_xattr (xlator_t *this,  {          int32_t               ret                 = 0;          int8_t                dirty               = -1; -        int64_t              *size                = NULL; -        int64_t              *contri              = NULL; +        int64_t              *size                = NULL, size_int = 0; +        int64_t              *contri              = NULL, contri_int = 0;          char                  contri_key [512]    = {0, };          marker_conf_t        *priv                = NULL;          gf_boolean_t          not_root            = _gf_false; @@ -1567,21 +1582,29 @@ inspect_directory_xattr (xlator_t *this,                  if (ret < 0)                          goto out; -                contribution->contribution = ntoh64 (*contri); +		LOCK (&contribution->lock); +		{ +		  contribution->contribution = ntoh64 (*contri); +		  contri_int = contribution->contribution; +		} +		UNLOCK (&contribution->lock);          } -        ctx->size = ntoh64 (*size); +	LOCK (&ctx->lock); +	{ +	  ctx->size = ntoh64 (*size); +	  ctx->dirty = dirty; +	  size_int = ctx->size; +	} +	UNLOCK (&ctx->lock);          gf_log (this->name, GF_LOG_DEBUG, "size=%"PRId64 -                " contri=%"PRId64, ctx->size, -                contribution?contribution->contribution:0); +                " contri=%"PRId64, size_int, contri_int); -        ctx->dirty = dirty; -        if (ctx->dirty == 1) { -                update_dirty_inode (this, loc, ctx, contribution); -        } else if (not_root == _gf_true && -                   ctx->size != contribution->contribution) { -                initiate_quota_txn (this, loc); +        if (dirty) { +	  update_dirty_inode (this, loc, ctx, contribution); +	} else if ((not_root == _gf_true) && (size_int != contri_int)) { +	  initiate_quota_txn (this, loc);          }          ret = 0; @@ -1599,7 +1622,7 @@ inspect_file_xattr (xlator_t *this,                      struct iatt buf)  {          int32_t               ret              = -1; -        uint64_t              contri_int       = 0; +        uint64_t              contri_int       = 0, size = 0;          int64_t              *contri_ptr       = NULL;          char                  contri_key [512] = {0, };          marker_conf_t        *priv             = NULL; @@ -1626,6 +1649,7 @@ inspect_file_xattr (xlator_t *this,          LOCK (&ctx->lock);          {                  ctx->size = 512 * buf.ia_blocks; +		size = ctx->size;          }          UNLOCK (&ctx->lock); @@ -1639,14 +1663,19 @@ inspect_file_xattr (xlator_t *this,                  if (ret == 0) {                          contri_ptr = (int64_t *)(unsigned long)contri_int; -                        contribution->contribution = ntoh64 (*contri_ptr); +			LOCK (&contribution->lock); +			{ +			  contribution->contribution = ntoh64 (*contri_ptr); +			  contri_int = contribution->contribution; +			} +			UNLOCK (&contribution->lock);                          gf_log (this->name, GF_LOG_DEBUG, -                                "size=%"PRId64 " contri=%"PRId64, ctx->size, -                                contribution->contribution); +                                "size=%"PRId64 " contri=%"PRId64, size, contri_int); -                        ret = validate_inode_size_contribution -                                (this, loc, ctx, contribution); +			if (size != contri_int) { +			  initiate_quota_txn (this, loc); +			}                  } else                          initiate_quota_txn (this, loc);          } @@ -1764,6 +1793,7 @@ mq_inode_remove_done (call_frame_t *frame, void *cookie, xlator_t *this,          struct gf_flock    lock  = {0, };          quota_inode_ctx_t *ctx   = NULL;          quota_local_t     *local = NULL; +	int64_t contribution = 0;          local = frame->local;          if (op_ret == -1) @@ -1771,11 +1801,26 @@ mq_inode_remove_done (call_frame_t *frame, void *cookie, xlator_t *this,          ret = quota_inode_ctx_get (local->parent_loc.inode, this, &ctx); -        if (local->contri->contribution == local->size) { -                if (ret == 0) -                        ctx->size -= local->contri->contribution; +	LOCK (&local->contri->lock); +	{ +	  contribution = local->contri->contribution; +	} +	UNLOCK (&local->contri->lock); -                local->contri->contribution = 0; +        if (contribution == local->size) { +	  if (ret == 0) { +	    LOCK (&ctx->lock); +	    { +	      ctx->size -= contribution; +	    } +	    UNLOCK (&ctx->lock); + +	    LOCK (&local->contri->lock); +	    { +	      local->contri->contribution = 0; +	    } +	    UNLOCK (&local->contri->lock); +	  }          }          lock.l_type   = F_UNLCK; @@ -1793,7 +1838,7 @@ mq_inode_remove_done (call_frame_t *frame, void *cookie, xlator_t *this,          return 0;  } -static int32_t +int32_t  mq_reduce_parent_size_xattr (call_frame_t *frame, void *cookie,                               xlator_t *this, int32_t op_ret, int32_t op_errno)  { diff --git a/xlators/features/marker/src/marker-quota.h b/xlators/features/marker/src/marker-quota.h index 5535aa04c70..10fffc73071 100644 --- a/xlators/features/marker/src/marker-quota.h +++ b/xlators/features/marker/src/marker-quota.h @@ -108,6 +108,7 @@ struct inode_contribution {          struct list_head contri_list;          int64_t          contribution;          uuid_t           gfid; +  gf_lock_t lock;  };  typedef struct inode_contribution inode_contribution_t;  | 
