summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/cluster/dht/src/dht-common.c54
1 files changed, 42 insertions, 12 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
index 434584e1a34..4efc2814729 100644
--- a/xlators/cluster/dht/src/dht-common.c
+++ b/xlators/cluster/dht/src/dht-common.c
@@ -7003,6 +7003,7 @@ dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,
int readdir_optimize = 0;
inode_table_t *itable = NULL;
inode_t *inode = NULL;
+ gf_boolean_t skip_hashed_check = _gf_false;
INIT_LIST_HEAD (&entries.list);
@@ -7015,8 +7016,20 @@ dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,
methods = &(conf->methods);
- if (op_ret <= 0)
+ if (op_ret <= 0) {
goto done;
+ }
+
+ /* Why aren't we skipping DHT entirely in case of a single subvol?
+ * Because if this was a larger volume earlier and all but one subvol
+ * was removed, there might be stale linkto files on the subvol.
+ */
+ if (conf->subvolume_cnt == 1) {
+ /* return all directory and file entries except
+ * linkto files for a single child DHT
+ */
+ skip_hashed_check = _gf_true;
+ }
if (!local->layout)
local->layout = dht_layout_get (this, local->fd->inode);
@@ -7053,6 +7066,18 @@ dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,
continue;
}
+ if (check_is_linkfile (NULL, (&orig_entry->d_stat),
+ orig_entry->dict,
+ conf->link_xattr_name)) {
+ gf_msg_debug (this->name, 0, "%s: %s is a linkto file",
+ prev->name, orig_entry->d_name);
+ continue;
+ }
+
+ if (skip_hashed_check) {
+ goto list;
+ }
+
if (check_is_dir (NULL, (&orig_entry->d_stat), NULL)) {
/*Directory entries filtering :
@@ -7083,14 +7108,6 @@ dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,
goto list;
}
- if (check_is_linkfile (NULL, (&orig_entry->d_stat),
- orig_entry->dict,
- conf->link_xattr_name)) {
- gf_msg_debug (this->name, 0, "%s: %s is a linkto file",
- prev->name, orig_entry->d_name);
- continue;
- }
-
list:
entry = gf_dirent_for_name (orig_entry->d_name);
if (!entry) {
@@ -7286,6 +7303,7 @@ dht_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
xlator_t *subvol = 0;
dht_conf_t *conf = NULL;
dht_methods_t *methods = NULL;
+ gf_boolean_t skip_hashed_check = _gf_false;
INIT_LIST_HEAD (&entries.list);
@@ -7308,6 +7326,13 @@ dht_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
gf_msg_debug (this->name, 0, "Processing entries from %s",
prev->name);
+ if (conf->subvolume_cnt == 1) {
+ /*return everything*/
+ skip_hashed_check = _gf_true;
+ count = op_ret;
+ goto done;
+ }
+
list_for_each_entry (orig_entry, (&orig_entries->list), list) {
next_offset = orig_entry->d_off;
@@ -7379,10 +7404,15 @@ unwind:
if (prev != dht_last_up_subvol (this))
op_errno = 0;
- DHT_STACK_UNWIND (readdir, frame, op_ret, op_errno,
- &entries, NULL);
- gf_dirent_free (&entries);
+ if (!skip_hashed_check) {
+ DHT_STACK_UNWIND (readdir, frame, op_ret, op_errno,
+ &entries, NULL);
+ gf_dirent_free (&entries);
+ } else {
+ DHT_STACK_UNWIND (readdir, frame, op_ret, op_errno,
+ orig_entries, NULL);
+ }
return 0;
}