diff options
author | Anuradha Talur <atalur@redhat.com> | 2016-08-09 21:09:11 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2016-08-22 13:18:30 -0700 |
commit | 72af868ba4a0ff7e143adaec78168aaccda473ef (patch) | |
tree | eabfcfeb5a765ad041a8d3b916ee11d61892daf5 /xlators | |
parent | 8519efc5b37bb19192a6337088707335f9a041af (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>
>Signed-off-by: Anuradha Talur <atalur@redhat.com>
Change-Id: Id3a1023eb536180888eb2c0b39050000b76f7226
BUG: 1369187
Signed-off-by: Anuradha Talur <atalur@redhat.com>
Reviewed-on: http://review.gluster.org/15237
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/protocol/client/src/client-common.c | 6 | ||||
-rw-r--r-- | xlators/protocol/client/src/client-rpc-fops.c | 13 |
2 files changed, 13 insertions, 6 deletions
diff --git a/xlators/protocol/client/src/client-common.c b/xlators/protocol/client/src/client-common.c index 51c2d95ea2b..05939b8aa0b 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 diff --git a/xlators/protocol/client/src/client-rpc-fops.c b/xlators/protocol/client/src/client-rpc-fops.c index d35d0e04861..b26c4946d7f 100644 --- a/xlators/protocol/client/src/client-rpc-fops.c +++ b/xlators/protocol/client/src/client-rpc-fops.c @@ -2893,13 +2893,19 @@ client3_3_lookup_cbk (struct rpc_req *req, struct iovec *iov, int count, goto out; } + /* Preserve the op_errno received from the server */ op_errno = gf_error_to_errno (rsp.op_errno); - if (rsp.op_ret == -1) + ret = client_post_lookup (this, &rsp, &stbuf, &postparent, &xdata); + if (ret < 0) { + /* Don't change the op_errno if the fop failed on server */ + if (rsp.op_ret == 0) + op_errno = rsp.op_errno; + rsp.op_ret = -1; goto out; + } - ret = client_post_lookup (this, &rsp, &stbuf, &postparent, &xdata); - if (ret < 0) + if (rsp.op_ret < 0) goto out; if ((!gf_uuid_is_null (inode->gfid)) @@ -2918,6 +2924,7 @@ client3_3_lookup_cbk (struct rpc_req *req, struct iovec *iov, int count, rsp.op_ret = 0; out: + /* Restore the correct op_errno to rsp.op_errno */ rsp.op_errno = op_errno; if (rsp.op_ret == -1) { /* any error other than ENOENT */ |