summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorN Balachandran <nbalacha@redhat.com>2017-08-29 21:12:51 +0530
committerRaghavendra G <rgowdapp@redhat.com>2017-08-30 04:48:57 +0000
commit9420022df0962b1fa4f3ea3774249be81bc945cc (patch)
tree299856d99393f10465d76f46c660dee5790b148e
parentb3c068ccd9125ffdfb6fbb3d2728f16ff8dda2eb (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.c13
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)