diff options
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 9 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 3 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-layout.c | 1 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-selfheal.c | 32 | 
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;  	}  | 
