summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
Diffstat (limited to 'xlators')
-rw-r--r--xlators/cluster/dht/src/dht-common.c9
-rw-r--r--xlators/cluster/dht/src/dht-common.h3
-rw-r--r--xlators/cluster/dht/src/dht-layout.c1
-rw-r--r--xlators/cluster/dht/src/dht-selfheal.c32
4 files changed, 33 insertions, 12 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
index 5e4979e31b0..f121f9f4716 100644
--- a/xlators/cluster/dht/src/dht-common.c
+++ b/xlators/cluster/dht/src/dht-common.c
@@ -573,8 +573,8 @@ dht_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
inode_ctx_put (inode, this, (uint64_t)(long)layout);
- goto out;
- }
+ goto out;
+ }
if (is_linkfile) {
subvol = dht_linkfile_subvol (this, inode, stbuf, xattr);
@@ -2640,7 +2640,6 @@ dht_mkdir_selfheal_cbk (call_frame_t *frame, void *cookie,
return 0;
}
-
int
dht_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int op_ret, int op_errno, inode_t *inode, struct stat *stbuf)
@@ -2672,8 +2671,8 @@ unlock:
this_call_cnt = dht_frame_return (frame);
if (is_last_call (this_call_cnt)) {
local->layout = NULL;
- dht_selfheal_directory (frame, dht_mkdir_selfheal_cbk,
- &local->loc, layout);
+ dht_selfheal_new_directory (frame, dht_mkdir_selfheal_cbk,
+ layout);
}
return 0;
diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h
index 17017381b08..3b05540e290 100644
--- a/xlators/cluster/dht/src/dht-common.h
+++ b/xlators/cluster/dht/src/dht-common.h
@@ -204,6 +204,9 @@ int
dht_selfheal_directory (call_frame_t *frame, dht_selfheal_dir_cbk_t cbk,
loc_t *loc, dht_layout_t *layout);
int
+dht_selfheal_new_directory (call_frame_t *frame, dht_selfheal_dir_cbk_t cbk,
+ dht_layout_t *layout);
+int
dht_selfheal_restore (call_frame_t *frame, dht_selfheal_dir_cbk_t cbk,
loc_t *loc, dht_layout_t *layout);
diff --git a/xlators/cluster/dht/src/dht-layout.c b/xlators/cluster/dht/src/dht-layout.c
index 1ec2e6c2edc..8698df4dc7a 100644
--- a/xlators/cluster/dht/src/dht-layout.c
+++ b/xlators/cluster/dht/src/dht-layout.c
@@ -196,7 +196,6 @@ dht_disk_layout_merge (xlator_t *this, dht_layout_t *layout,
int start_off = 0;
int stop_off = 0;
-
/* TODO: assert disk_layout_ptr is of required length */
cnt = ntoh32 (disk_layout[0]);
diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c
index ee32b2253ed..7bb22b1a758 100644
--- a/xlators/cluster/dht/src/dht-selfheal.c
+++ b/xlators/cluster/dht/src/dht-selfheal.c
@@ -159,9 +159,13 @@ dht_selfheal_dir_xattr (call_frame_t *frame, loc_t *loc, dht_layout_t *layout)
this = frame->this;
for (i = 0; i < layout->cnt; i++) {
- if (layout->list[i].err != -1 || !layout->list[i].stop)
+ if (layout->list[i].err != -1 || !layout->list[i].stop) {
+ /* err != -1 would mean xattr present on the directory
+ * or the directory is itself non existant.
+ * !layout->list[i].stop would mean layout absent
+ */
continue;
- /* attr missing and layout present */
+ }
missing_xattr++;
}
@@ -267,8 +271,8 @@ dht_selfheal_dir_mkdir (call_frame_t *frame, loc_t *loc,
}
void
-dht_selfheal_fix_this_virgin (call_frame_t *frame, loc_t *loc,
- dht_layout_t *layout)
+dht_selfheal_layout_new_directory (call_frame_t *frame, loc_t *loc,
+ dht_layout_t *layout)
{
dht_conf_t *conf = NULL;
xlator_t *this = NULL;
@@ -334,7 +338,7 @@ dht_selfheal_dir_getafix (call_frame_t *frame, loc_t *loc,
holes = local->selfheal.hole_cnt;
if ((missing + down) == conf->subvolume_cnt) {
- dht_selfheal_fix_this_virgin (frame, loc, layout);
+ dht_selfheal_layout_new_directory (frame, loc, layout);
ret = 0;
}
@@ -356,6 +360,22 @@ dht_selfheal_dir_getafix (call_frame_t *frame, loc_t *loc,
return ret;
}
+int
+dht_selfheal_new_directory (call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,
+ dht_layout_t *layout)
+{
+ dht_local_t *local = NULL;
+
+ local = frame->local;
+
+ local->selfheal.dir_cbk = dir_cbk;
+ local->selfheal.layout = layout;
+
+ dht_selfheal_layout_new_directory (frame, &local->loc, layout);
+ dht_selfheal_dir_xattr (frame, &local->loc, layout);
+ return 0;
+}
+
int
dht_selfheal_directory (call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,
@@ -425,7 +445,7 @@ dht_selfheal_directory (call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,
if (ret == -1) {
gf_log (this->name, GF_LOG_ERROR,
- "the directory is not a virgin");
+ "not able to form layout for the directory");
goto sorry_no_fix;
}