summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/dht/src/dht-common.c
diff options
context:
space:
mode:
authorRaghavendra G <rgowdapp@redhat.com>2016-05-13 11:40:57 +0530
committerRaghavendra G <rgowdapp@redhat.com>2016-05-16 20:13:08 -0700
commita74f8cf4e7edc2ce9f045317a18dacddf25adb8a (patch)
tree72396b45ad1d7fd6a42b6290c8e7a4cb7b2e4e9c /xlators/cluster/dht/src/dht-common.c
parent06f92634d9ad8aa5c56d786e5248016c283e5c5b (diff)
cluster/distribute: heal layout in discover codepath too
BUG: 1334164 Change-Id: I4259d88f2b6e4f9d4ad689bc4e438f1db9cfd177 Signed-off-by: Raghavendra G <rgowdapp@redhat.com> Reviewed-on: http://review.gluster.org/14365 Tested-by: Pranith Kumar Karampuri <pkarampu@redhat.com> Smoke: Gluster Build System <jenkins@build.gluster.com> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Diffstat (limited to 'xlators/cluster/dht/src/dht-common.c')
-rw-r--r--xlators/cluster/dht/src/dht-common.c40
1 files changed, 7 insertions, 33 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
index 21962cd342c..c667266fed8 100644
--- a/xlators/cluster/dht/src/dht-common.c
+++ b/xlators/cluster/dht/src/dht-common.c
@@ -250,7 +250,7 @@ dht_discover_complete (xlator_t *this, call_frame_t *discover_frame)
int heal_path = 0;
int i = 0;
loc_t loc = {0 };
- int8_t is_read_only = 0;
+ int8_t is_read_only = 0, layout_anomalies = 0;
local = discover_frame->local;
layout = local->layout;
@@ -305,26 +305,10 @@ dht_discover_complete (xlator_t *this, call_frame_t *discover_frame)
"(overlaps/holes present: %s, "
"ENOENT errors: %d)", local->loc.path,
(ret < 0) ? "yes" : "no", (ret > 0) ? ret : 0);
- if ((ret > 0) && (ret == conf->subvolume_cnt)) {
- op_errno = ESTALE;
- goto out;
- }
-
- /* For fixing the directory layout, we need to choose
- * the subvolume on which layout will be set first.
- * Because in nameless lookup, we have gfid only,
- * we are dependent on gfid. Therefore if conf->
- * randomize_by_gfid is set, then only we proceed for
- * healing layout of directory otherwise we don't heal.
- */
-
- if (local->inode && conf->randomize_by_gfid &&
- !is_read_only)
- goto selfheal;
- }
-
- if (local->inode)
+ layout_anomalies = 1;
+ } else if (local->inode) {
dht_layout_set (this, local->inode, layout);
+ }
}
if (!conf->vch_forced) {
@@ -344,11 +328,13 @@ dht_discover_complete (xlator_t *this, call_frame_t *discover_frame)
layout->list[i].err == ESTALE) {
heal_path = 1;
}
+
if (source && heal_path)
break;
}
}
- if (source && heal_path) {
+
+ if (source && (heal_path || layout_anomalies)) {
gf_uuid_copy (loc.gfid, local->gfid);
if (gf_uuid_is_null (loc.gfid)) {
goto done;
@@ -403,18 +389,6 @@ out:
NULL);
return ret;
-
-selfheal:
-
- main_frame->local = local;
- discover_frame->local = NULL;
- FRAME_SU_DO (main_frame, dht_local_t);
- gf_uuid_copy (local->loc.gfid, local->gfid);
- ret = dht_selfheal_directory_for_nameless_lookup (main_frame,
- dht_lookup_selfheal_cbk,
- &local->loc, layout);
- return ret;
-
}
int