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 /xlators | |
| 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>
Diffstat (limited to 'xlators')
| -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)  | 
