From 110006bbcd5bb3e814b4cfe7d74cb41891ac3b0c Mon Sep 17 00:00:00 2001 From: N Balachandran Date: Wed, 6 Feb 2019 09:58:55 +0530 Subject: cluster/dht: Request linkto xattrs in dht_rmdir opendir If parallel-readdir is enabled, the rda xlator is loaded below dht in the graph and proactively lists and caches entries when an opendir is performed. dht_rmdir checks if the directory being deleted contains stale linkto files by performing a readdirp on its child subvols. However, as the entries are actually read in during the opendir operation which does not request the linkto xattr,no linkto xattrs are present for the entries causing dht to incorrectly identify them as data files and fail the rmdir operation with ENOTEMPTY. DHT now always adds the linkto xattr in the list of xattrs requested in the opendir. Change-Id: I0711198e66c59146282eb8b88084170bedfb4018 fixes: bz#1672851 Signed-off-by: N Balachandran --- xlators/cluster/dht/src/dht-common.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'xlators') diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index cc409c9103d..367548f5b38 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -10373,6 +10373,8 @@ dht_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, dht_conf_t *conf = NULL; int op_errno = -1; int i = -1; + int ret = -1; + dict_t *xattr_req = NULL; VALIDATE_OR_GOTO(frame, err); VALIDATE_OR_GOTO(this, err); @@ -10404,14 +10406,37 @@ dht_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, if (flags) { return dht_rmdir_do(frame, this); } + if (xdata) { + xattr_req = dict_ref(xdata); + } else { + xattr_req = dict_new(); + } + if (xattr_req) { + ret = dict_set_uint32(xattr_req, conf->link_xattr_name, 256); + /* If parallel-readdir is enabled, this is required + * to handle stale linkto files in the directory + * being deleted. If this fails, log an error but + * do not prevent the operation. + */ + if (ret) { + gf_msg(this->name, GF_LOG_ERROR, 0, 0, "%s: failed to set key %s", + loc->path, conf->link_xattr_name); + } + } else { + gf_msg(this->name, GF_LOG_ERROR, 0, 0, "%s: failed to set key %s", + loc->path, conf->link_xattr_name); + } for (i = 0; i < conf->subvolume_cnt; i++) { STACK_WIND_COOKIE(frame, dht_rmdir_opendir_cbk, conf->subvolumes[i], conf->subvolumes[i], conf->subvolumes[i]->fops->opendir, loc, local->fd, - NULL); + xattr_req); } + if (xattr_req) { + dict_unref(xattr_req); + } return 0; err: -- cgit