diff options
author | Anuradha Talur <atalur@redhat.com> | 2015-08-03 17:09:13 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2015-08-25 10:32:49 -0700 |
commit | 36349fa250ace6109002dfa41305d9dcd54ce0a9 (patch) | |
tree | ef9c181a2e165d3ac8255915f384b2bfb4e06ded /xlators/cluster/afr/src/afr-read-txn.c | |
parent | f3c7e6eaa9b14b89c1d58c0edcb5664f28914437 (diff) |
cluster/afr : Examine data/metadata readable for read-subvol
During lookup and discover, currently read_subvol is based
only on data_readable. read_subvol should be decided based
on both data_readable and metadata_readable.
Credits to Ravishankar N for the logic of afr_first_up_child
from http://review.gluster.org/10905/ .
Change-Id: I98580b23c278172ee2902be08eeaafb6722e830c
BUG: 1240244
Signed-off-by: Anuradha Talur <atalur@redhat.com>
Reviewed-on: http://review.gluster.org/11551
Reviewed-by: Ravishankar N <ravishankar@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Krutika Dhananjay <kdhananj@redhat.com>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators/cluster/afr/src/afr-read-txn.c')
-rw-r--r-- | xlators/cluster/afr/src/afr-read-txn.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/xlators/cluster/afr/src/afr-read-txn.c b/xlators/cluster/afr/src/afr-read-txn.c index 1b2faf31eea..a70565c37a1 100644 --- a/xlators/cluster/afr/src/afr-read-txn.c +++ b/xlators/cluster/afr/src/afr-read-txn.c @@ -193,12 +193,16 @@ afr_read_txn (call_frame_t *frame, xlator_t *this, inode_t *inode, { afr_local_t *local = NULL; afr_private_t *priv = NULL; + unsigned char *data = NULL; + unsigned char *metadata = NULL; int read_subvol = -1; int event_generation = 0; int ret = -1; priv = this->private; local = frame->local; + data = alloca0 (priv->child_count); + metadata = alloca0 (priv->child_count); afr_read_txn_wipe (frame, this); @@ -213,10 +217,16 @@ afr_read_txn (call_frame_t *frame, xlator_t *this, inode_t *inode, goto read; } - local->transaction.type = type; - ret = afr_inode_read_subvol_type_get (inode, this, local->readable, - &event_generation, type); + if (local->op == GF_FOP_FSTAT || local->op == GF_FOP_STAT) { + ret = afr_inode_read_subvol_get (inode, this, data, metadata, + &event_generation); + AFR_INTERSECT (local->readable, data, metadata, + priv->child_count); + } else { + ret = afr_inode_read_subvol_type_get (inode, this, local->readable, + &event_generation, type); + } if (ret == -1) /* very first transaction on this inode */ goto refresh; |