diff options
author | N Balachandran <nbalacha@redhat.com> | 2019-02-06 09:58:55 +0530 |
---|---|---|
committer | N Balachandran <nbalacha@redhat.com> | 2019-04-10 07:51:40 +0000 |
commit | c94acb9efdba4d837f1029cdcbdec051a394447a (patch) | |
tree | 6fb4748a800e1aee8821f11c287c7f8570e19c1f /xlators | |
parent | 34a2347780c2429284f57232f3aabb78547a9795 (diff) |
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#1695399
Signed-off-by: N Balachandran <nbalacha@redhat.com>
(cherry picked from commit 110006bbcd5bb3e814b4cfe7d74cb41891ac3b0c)
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 583875bcbb4..696047ae73f 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -10232,6 +10232,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); @@ -10263,14 +10265,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: |