diff options
author | N Balachandran <nbalacha@redhat.com> | 2017-08-29 21:12:51 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2017-08-30 04:48:57 +0000 |
commit | 9420022df0962b1fa4f3ea3774249be81bc945cc (patch) | |
tree | 299856d99393f10465d76f46c660dee5790b148e | |
parent | b3c068ccd9125ffdfb6fbb3d2728f16ff8dda2eb (diff) |
cluster/dht: Aggregate xattrs only for dirs in dht_discover_cbk
If dht_discover finds data files on more than one subvol,
racing calls to dht_discover_cbk could end up calling
dht_aggregate_xattr which could delete dictionary data
that is being accessed by higher layer translators.
Fixed to call dht_aggregate_xattr only for directories and
consider only the first file to be found.
Change-Id: I4f3d2a405ec735d4f1bb33a04b7255eb2d179f8a
BUG: 1484709
Signed-off-by: N Balachandran <nbalacha@redhat.com>
Reviewed-on: https://review.gluster.org/18137
Smoke: Gluster Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 9643caa0e17..b8a860d8049 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -639,6 +639,7 @@ dht_discover_cbk (call_frame_t *frame, void *cookie, xlator_t *this, else mkdir/chmod/chown and fix */ + ret = dht_layout_merge (this, layout, prev, op_ret, op_errno, xattr); if (ret) @@ -665,8 +666,14 @@ dht_discover_cbk (call_frame_t *frame, void *cookie, xlator_t *this, } else { local->file_count ++; - if (!is_linkfile) { + if (!is_linkfile && !local->cached_subvol) { /* real file */ + /* Ok, we somehow managed to find a file on + * more than one subvol. ignore this or we + * will end up overwriting information while a + * a thread is potentially unwinding from + * dht_discover_complete + */ local->cached_subvol = prev; attempt_unwind = 1; } else { @@ -679,7 +686,9 @@ dht_discover_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (local->xattr == NULL) { local->xattr = dict_ref (xattr); } else { - dht_aggregate_xattr (local->xattr, xattr); + /* Don't aggregate for files. See BZ#1484113 */ + if (is_dir) + dht_aggregate_xattr (local->xattr, xattr); } if (local->inode == NULL) |