diff options
| author | Ravishankar N <ravishankar@redhat.com> | 2015-06-25 00:22:41 +0530 |
|---|---|---|
| committer | Vijay Bellur <vbellur@redhat.com> | 2015-06-26 19:30:33 -0700 |
| commit | 0104b5869d89ac58cb13e10417626455c8ba2143 (patch) | |
| tree | 5db665e349e5787e308487f8474652cd346df93a /xlators/cluster/afr/src/afr-read-txn.c | |
| parent | b335fbe14e0afbec3cf50409707f3c8df5d5c01d (diff) | |
afr: Block fops when file is in split-brain
For directories, block metadata FOPS.
For non-directories, block data and metadata FOPS.
Do not block entry FOPS.
Change-Id: Id7f656f4a513b9d33c457dd7f2d58028dbef8e61
BUG: 1235007
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-on: http://review.gluster.org/11371
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Diffstat (limited to 'xlators/cluster/afr/src/afr-read-txn.c')
| -rw-r--r-- | xlators/cluster/afr/src/afr-read-txn.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/xlators/cluster/afr/src/afr-read-txn.c b/xlators/cluster/afr/src/afr-read-txn.c index 6121108872f..6e545497108 100644 --- a/xlators/cluster/afr/src/afr-read-txn.c +++ b/xlators/cluster/afr/src/afr-read-txn.c @@ -52,6 +52,9 @@ afr_read_txn_next_subvol (call_frame_t *frame, xlator_t *this) local->op_ret = ret; \ local->op_errno = errnum; \ read_subvol = index; \ + gf_msg (this->name, GF_LOG_ERROR, EIO, AFR_MSG_SPLIT_BRAIN,\ + "Failing %s on gfid %s: split-brain observed.",\ + gf_fop_list[local->op], uuid_utoa (inode->gfid));\ goto label; \ } while (0) @@ -59,7 +62,6 @@ int afr_read_txn_refresh_done (call_frame_t *frame, xlator_t *this, int err) { afr_local_t *local = NULL; - afr_private_t *priv = NULL; int read_subvol = 0; int event_generation = 0; inode_t *inode = NULL; @@ -68,27 +70,19 @@ afr_read_txn_refresh_done (call_frame_t *frame, xlator_t *this, int err) local = frame->local; inode = local->inode; - priv = frame->this->private; if (err) AFR_READ_TXN_SET_ERROR_AND_GOTO (-1, -err, -1, readfn); - ret = afr_inode_read_subvol_type_get (inode, this, local->readable, - &event_generation, - local->transaction.type); + ret = afr_inode_get_readable (frame, inode, this, local->readable, + &event_generation, + local->transaction.type); if (ret == -1 || !event_generation) /* Even after refresh, we don't have a good read subvolume. Time to bail */ AFR_READ_TXN_SET_ERROR_AND_GOTO (-1, EIO, -1, readfn); - /* For directories in split-brain, we need to allow all fops - * except (f)getxattr and access. */ - if (!AFR_COUNT(local->readable, priv->child_count) && - local->transaction.type == AFR_DATA_TRANSACTION && - inode->ia_type == IA_IFDIR) - memcpy (local->readable, local->child_up, priv->child_count); - read_subvol = afr_read_subvol_select_by_policy (inode, this, local->readable, NULL); if (read_subvol == -1) @@ -237,8 +231,8 @@ afr_read_txn (call_frame_t *frame, xlator_t *this, inode_t *inode, if (read_subvol < 0 || read_subvol > priv->child_count) { gf_msg (this->name, GF_LOG_WARNING, 0, AFR_MSG_SPLIT_BRAIN, "Unreadable subvolume %d found with event generation " - "%d. (Possible split-brain)", - read_subvol, event_generation); + "%d for gfid %s. (Possible split-brain)", + read_subvol, event_generation, uuid_utoa(inode->gfid)); goto refresh; } |
