summaryrefslogtreecommitdiffstats
path: root/xlators/protocol/client/src/client-common.c
diff options
context:
space:
mode:
authorAnuradha Talur <atalur@redhat.com>2016-08-09 21:09:11 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2016-08-17 03:26:05 -0700
commit59186114f9545fda529368ee26c3cd3d88a80751 (patch)
tree37a96322e38a277bd7a4da980a33899ea1c555e0 /xlators/protocol/client/src/client-common.c
parentdd8d93f24a320805f1f67760b2d3266555acf674 (diff)
protocol/client: Unserialize xdata even if lookup fails
Problem: AFR relies on xdata returned by lookup to determine if there are any files that need healing. This info is further used to optimize readdirp. In case of lookups with negative return value, client xlator was sending NULL xdata. Due to absence of xdata, AFR conservatively assumes that there are files that need healing, which is incorrect. Solution: Even in case of unsuccessful lookups, send the xdata received by protocol client so that higher xlators can get the info that they rely on. Change-Id: Id3a1023eb536180888eb2c0b39050000b76f7226 BUG: 1366284 Signed-off-by: Anuradha Talur <atalur@redhat.com> Reviewed-on: http://review.gluster.org/15120 Smoke: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Poornima G <pgurusid@redhat.com> Tested-by: Poornima G <pgurusid@redhat.com> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Ashish Pandey <aspandey@redhat.com> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators/protocol/client/src/client-common.c')
-rw-r--r--xlators/protocol/client/src/client-common.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/xlators/protocol/client/src/client-common.c b/xlators/protocol/client/src/client-common.c
index 51c2d95..05939b8 100644
--- a/xlators/protocol/client/src/client-common.c
+++ b/xlators/protocol/client/src/client-common.c
@@ -1829,6 +1829,7 @@ int
client_post_lookup (xlator_t *this, gfs3_lookup_rsp *rsp, struct iatt *stbuf,
struct iatt *postparent, dict_t **xdata)
{
+ int ret = 0;
if (-1 != rsp->op_ret) {
gf_stat_to_iatt (&rsp->postparent, postparent);
@@ -1836,11 +1837,10 @@ client_post_lookup (xlator_t *this, gfs3_lookup_rsp *rsp, struct iatt *stbuf,
}
GF_PROTOCOL_DICT_UNSERIALIZE (this, *xdata, (rsp->xdata.xdata_val),
- (rsp->xdata.xdata_len), rsp->op_ret,
+ (rsp->xdata.xdata_len), ret,
rsp->op_errno, out);
-
out:
- return rsp->op_ret;
+ return ret;
}
int