diff options
| author | Ravishankar N <ravishankar@redhat.com> | 2015-10-26 14:14:18 +0530 | 
|---|---|---|
| committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2015-10-26 05:41:33 -0700 | 
| commit | da9f8bd6e9421209243afeabbad350cc1d70fdc5 (patch) | |
| tree | 9566c64d0fe3d52ba6ceec0f481c62462f07f5b1 | |
| parent | fca25fbd0d24b6eb944415174a67d1774b5d2479 (diff) | |
afr: fixes in transaction code
Backport of http://review.gluster.org/#/c/12368/ and
http://review.gluster.org/#/c/12415/
1. When winding the pre-op, transaction.pre_op[i] is set. If the pre-op
fails, transaction.failed_subvols[i] is set. If if fails on all chidren,
we can directly proceed to unlock (via afr_changelog_post_op_now)
without trying to wind the write, fail and then going to unlock.
2. 'fop_subvols' seems to be an unused variable, hence removing it.
3. Call local->transaction.wind() only on subvols where pre-op succeeded.
Change-Id: I9525628daf48082e979b0093fa0478934495e61f
BUG: 1273334
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-on: http://review.gluster.org/12399
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
| -rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 7 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 12 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.h | 7 | 
3 files changed, 11 insertions, 15 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 1c652f41e88..2ac0f078ffa 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -1204,7 +1204,6 @@ afr_local_transaction_cleanup (afr_local_t *local, xlator_t *this)          }          GF_FREE (local->transaction.eager_lock); -        GF_FREE (local->transaction.fop_subvols);          GF_FREE (local->transaction.failed_subvols);          GF_FREE (local->transaction.basename); @@ -4176,12 +4175,6 @@ afr_transaction_local_init (afr_local_t *local, xlator_t *this)                          goto out;          } -        local->transaction.fop_subvols = GF_CALLOC (sizeof (*local->transaction.fop_subvols), -						    priv->child_count, -						    gf_afr_mt_char); -        if (!local->transaction.fop_subvols) -                goto out; -          local->transaction.failed_subvols = GF_CALLOC (sizeof (*local->transaction.failed_subvols),  						       priv->child_count,  						       gf_afr_mt_char); diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index 915b68ef07d..4c85a4b0d03 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -44,12 +44,16 @@ __afr_txn_write_fop (call_frame_t *frame, xlator_t *this)          afr_local_t *local = NULL;          afr_private_t *priv = NULL;          int call_count = -1; +        unsigned char *failed_subvols = NULL;          int i = 0;          local = frame->local;          priv = this->private; -        call_count = AFR_COUNT (local->transaction.pre_op, priv->child_count); +        failed_subvols = local->transaction.failed_subvols; + +        call_count = priv->child_count - AFR_COUNT (failed_subvols, +                                                    priv->child_count);          if (call_count == 0) {                  local->transaction.resume (frame, this); @@ -59,7 +63,7 @@ __afr_txn_write_fop (call_frame_t *frame, xlator_t *this)          local->call_count = call_count;          for (i = 0; i < priv->child_count; i++) { -                if (local->transaction.pre_op[i]) { +                if (local->transaction.pre_op[i] && !failed_subvols[i]) {  			local->transaction.wind (frame, this, i);                          if (!--call_count) @@ -973,8 +977,10 @@ afr_changelog_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          priv = this->private;          child_index = (long) cookie; -	if (op_ret == -1) +	if (op_ret == -1) { +                local->op_errno = op_errno;  		afr_transaction_fop_failed (frame, this, child_index); +        }          if (priv->arbiter_count == 1 && !op_ret) {                  if (xattr) diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 6a14febec0a..9ee5ae36df0 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -662,11 +662,8 @@ typedef struct _afr_local {                  dict_t **pre_op_xdata;                  unsigned char *pre_op_sources; -		/* @fop_subvols: subvolumes on which FOP will be attempted */ -                unsigned char   *fop_subvols; - -		/* @failed_subvols: subvolumes on which FOP failed. Always -		   a subset of @fop_subvols */ +		/* @failed_subvols: subvolumes on which a pre-op or a +                    FOP failed. */                  unsigned char   *failed_subvols;  		/* @dirtied: flag which indicates whether we set dirty flag  | 
