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>
This commit is contained in:
N Balachandran 2017-08-29 21:12:51 +05:30 committed by Raghavendra G
parent b3c068ccd9
commit 9420022df0

View File

@ -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)