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#1679004
Signed-off-by: N Balachandran <nbalacha@redhat.com>
This commit is contained in:
N Balachandran 2019-02-06 09:58:55 +05:30 committed by Shyamsundar Ranganathan
parent 5c9b2dfb4d
commit 951abf5c53

View File

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