diff options
author | Ravishankar N <ravishankar@redhat.com> | 2018-01-18 14:21:57 +0530 |
---|---|---|
committer | jiffin tony Thottan <jthottan@redhat.com> | 2018-07-04 04:04:22 +0000 |
commit | 0777b40adebd39286f69c546861748a794333b59 (patch) | |
tree | eb67d64e0aa940394ad8def972e5b6b3861fca55 /xlators/cluster | |
parent | 31228f924b6d6645a8bd2869a8180abe74617375 (diff) |
afr: add quorum checks in post-op
afr relies on pending changelog xattrs to identify source and sinks and the
setting of these xattrs happen in post-op. So if post-op fails, we need to
unwind the write txn with a failure.
Change-Id: I0f019ac03890108324ee7672883d774918b20be1
BUG: 1597120
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
(cherry picked from commit a40a87ec3b226ae86a6ed8f4af25b45965a20cad)
Diffstat (limited to 'xlators/cluster')
-rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index 7e40bba5b53..18d2ded0a86 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -534,6 +534,29 @@ afr_lock_server_count (afr_private_t *priv, afr_transaction_type type) /* {{{ pending */ +gf_boolean_t +afr_post_op_has_quorum (afr_local_t *local, xlator_t *this) +{ + afr_private_t *priv = NULL; + int i = 0; + unsigned char *post_op_children = NULL; + + priv = this->private; + post_op_children = alloca0 (priv->child_count); + + for (i = 0; i < priv->child_count; i++) { + if (!local->transaction.failed_subvols[i]) { + post_op_children[i] = 1; + } + } + + if (afr_has_quorum (post_op_children, this)) { + return _gf_true; + } + + return _gf_false; +} + int afr_changelog_post_op_done (call_frame_t *frame, xlator_t *this) { @@ -545,6 +568,12 @@ afr_changelog_post_op_done (call_frame_t *frame, xlator_t *this) priv = this->private; int_lock = &local->internal_lock; + /* Fail the FOP if post-op did not succeed on quorum no. of bricks. */ + if (!afr_post_op_has_quorum (local, this)) { + local->op_ret = -1; + local->op_errno = ENOTCONN; + } + if (local->transaction.resume_stub) { call_resume (local->transaction.resume_stub); local->transaction.resume_stub = NULL; |