[sheepdog] [PATCH v2 1/2] dog: fix cluster-wide snapshot inconsistency due to vdi deleted

Ruoyu liangry at ucweb.com
Mon Sep 1 04:08:14 CEST 2014


Hi Yuan,

Do you have time to review this series?


On 2014年08月20日 18:06, Ruoyu wrote:
> Once vdi snapshot is deleted before executing 'dog cluster snapshot
> save', error messsage just like as below is seen.
>
> Failed to read object 807c2b2500000000 No object found
> Failed to read inode header
>
> Once a vdi is deleted, cluster snapshot save will not backup it to
> farm so that cluster snapshot load cannot restore it to new cluster.
> However, the vdi id is marked as in use for safety, vdi list
> will try to read all vdis in use. Therefore, dog cannot read the object.
>
> The solution is saving the deleted vdi object too. To achieve it,
> a parameter, no_deleted, is added to the function parse_vdi.
> The default value is true. But for cluster snapshot save, it is false.
>
> Reported-by: Valerio Pachera <sirio81 at gmail.com>
> Cc: Liu Yuan <namei.unix at gmail.com>
> Signed-off-by: Ruoyu <liangry at ucweb.com>
> ---
> v2:
>   - use no_deleted instead of include_deleted, advised by Yuan.
>
> Signed-off-by: Ruoyu <liangry at ucweb.com>
> ---
>   dog/cluster.c |  5 +++--
>   dog/common.c  |  6 ++++--
>   dog/dog.h     |  3 ++-
>   dog/node.c    |  2 +-
>   dog/vdi.c     | 19 +++++++++++--------
>   5 files changed, 21 insertions(+), 14 deletions(-)
>
> diff --git a/dog/cluster.c b/dog/cluster.c
> index 9cf96a8..7c4856d 100644
> --- a/dog/cluster.c
> +++ b/dog/cluster.c
> @@ -419,7 +419,8 @@ static int save_snapshot(int argc, char **argv)
>   
>   	opt.count = argc - optind;
>   	opt.name = argv + optind;
> -	if (parse_vdi(fill_object_tree, SD_INODE_SIZE, &opt) != SD_RES_SUCCESS)
> +	if (parse_vdi(fill_object_tree, SD_INODE_SIZE,
> +			&opt, false) != SD_RES_SUCCESS)
>   		goto out;
>   
>   	if (object_tree_size() == 0) {
> @@ -657,7 +658,7 @@ static void cluster_check_cb(uint32_t vid, const char *name, const char *tag,
>   
>   static int cluster_check(int argc, char **argv)
>   {
> -	if (parse_vdi(cluster_check_cb, SD_INODE_SIZE, NULL) < 0)
> +	if (parse_vdi(cluster_check_cb, SD_INODE_SIZE, NULL, true) < 0)
>   		return EXIT_SYSFAIL;
>   
>   	return EXIT_SUCCESS;
> diff --git a/dog/common.c b/dog/common.c
> index 2335e14..3c4f6f5 100644
> --- a/dog/common.c
> +++ b/dog/common.c
> @@ -128,7 +128,8 @@ int dog_write_object(uint64_t oid, uint64_t cow_oid, void *data,
>   
>   #define FOR_EACH_VDI(nr, vdis) FOR_EACH_BIT(nr, vdis, SD_NR_VDIS)
>   
> -int parse_vdi(vdi_parser_func_t func, size_t size, void *data)
> +int parse_vdi(vdi_parser_func_t func, size_t size, void *data,
> +		bool no_deleted)
>   {
>   	int ret;
>   	unsigned long nr;
> @@ -163,7 +164,8 @@ int parse_vdi(vdi_parser_func_t func, size_t size, void *data)
>   			continue;
>   		}
>   
> -		if (i->name[0] == '\0') /* this VDI has been deleted */
> +		/* this VDI has been deleted, and no need to handle it */
> +		if (no_deleted && i->name[0] == '\0')
>   			continue;
>   
>   		if (size > SD_INODE_HEADER_SIZE) {
> diff --git a/dog/dog.h b/dog/dog.h
> index 9b53b3f..80becc6 100644
> --- a/dog/dog.h
> +++ b/dog/dog.h
> @@ -72,7 +72,8 @@ typedef void (*vdi_parser_func_t)(uint32_t vid, const char *name,
>   				  const char *tag, uint32_t snapid,
>   				  uint32_t flags,
>   				  const struct sd_inode *i, void *data);
> -int parse_vdi(vdi_parser_func_t func, size_t size, void *data);
> +int parse_vdi(vdi_parser_func_t func, size_t size, void *data,
> +			bool no_deleted);
>   int dog_read_object(uint64_t oid, void *data, unsigned int datalen,
>   		    uint64_t offset, bool direct);
>   int dog_write_object(uint64_t oid, uint64_t cow_oid, void *data,
> diff --git a/dog/node.c b/dog/node.c
> index 3912496..a4e9142 100644
> --- a/dog/node.c
> +++ b/dog/node.c
> @@ -87,7 +87,7 @@ static int node_info(int argc, char **argv)
>   	}
>   
>   	if (parse_vdi(cal_total_vdi_size, SD_INODE_HEADER_SIZE,
> -			&total_vdi_size) < 0)
> +			&total_vdi_size, true) < 0)
>   		return EXIT_SYSFAIL;
>   
>   	printf(raw_output ? "Total %s %s %s %d%% %s\n"
> diff --git a/dog/vdi.c b/dog/vdi.c
> index 84715b3..9ca4171 100644
> --- a/dog/vdi.c
> +++ b/dog/vdi.c
> @@ -288,7 +288,7 @@ static int vdi_list(int argc, char **argv)
>   		struct get_vdi_info info;
>   		memset(&info, 0, sizeof(info));
>   		info.name = vdiname;
> -		if (parse_vdi(print_vdi_list, SD_INODE_SIZE, &info) < 0)
> +		if (parse_vdi(print_vdi_list, SD_INODE_SIZE, &info, true) < 0)
>   			return EXIT_SYSFAIL;
>   		return EXIT_SUCCESS;
>   	}
> @@ -297,12 +297,12 @@ static int vdi_list(int argc, char **argv)
>   		if (!is_data_obj(vdi_cmd_data.oid))
>   			return EXIT_FAILURE;
>   		if (parse_vdi(print_obj_ref, SD_INODE_SIZE,
> -					&vdi_cmd_data.oid) < 0)
> +					&vdi_cmd_data.oid, true) < 0)
>   			return EXIT_SYSFAIL;
>   		return EXIT_SUCCESS;
>   	}
>   
> -	if (parse_vdi(print_vdi_list, SD_INODE_SIZE, NULL) < 0)
> +	if (parse_vdi(print_vdi_list, SD_INODE_SIZE, NULL, true) < 0)
>   		return EXIT_SYSFAIL;
>   	return EXIT_SUCCESS;
>   }
> @@ -310,7 +310,7 @@ static int vdi_list(int argc, char **argv)
>   static int vdi_tree(int argc, char **argv)
>   {
>   	init_tree();
> -	if (parse_vdi(print_vdi_tree, SD_INODE_HEADER_SIZE, NULL) < 0)
> +	if (parse_vdi(print_vdi_tree, SD_INODE_HEADER_SIZE, NULL, true) < 0)
>   		return EXIT_SYSFAIL;
>   	dump_tree();
>   
> @@ -324,7 +324,7 @@ static int vdi_graph(int argc, char **argv)
>   	printf("  node [shape = \"box\", fontname = \"Courier\"];\n\n");
>   	printf("  \"0\" [shape = \"ellipse\", label = \"root\"];\n\n");
>   
> -	if (parse_vdi(print_vdi_graph, SD_INODE_HEADER_SIZE, NULL) < 0)
> +	if (parse_vdi(print_vdi_graph, SD_INODE_HEADER_SIZE, NULL, true) < 0)
>   		return EXIT_SYSFAIL;
>   
>   	/* print a footer */
> @@ -2611,7 +2611,8 @@ static bool is_vdi_standalone(uint32_t vid, const char *name)
>   	struct vdi_tree *vdi;
>   
>   	init_tree();
> -	if (parse_vdi(construct_vdi_tree, SD_INODE_HEADER_SIZE, NULL) < 0)
> +	if (parse_vdi(construct_vdi_tree, SD_INODE_HEADER_SIZE,
> +			NULL, true) < 0)
>   		return EXIT_SYSFAIL;
>   
>   	vdi = find_vdi_from_root(vid, name);
> @@ -2746,7 +2747,8 @@ retry:
>   	}
>   
>   	init_tree();
> -	if (parse_vdi(construct_vdi_tree, SD_INODE_HEADER_SIZE, NULL) < 0)
> +	if (parse_vdi(construct_vdi_tree, SD_INODE_HEADER_SIZE,
> +			NULL, true) < 0)
>   		return EXIT_SYSFAIL;
>   
>   	count = rsp->data_length / sizeof(*vs);
> @@ -2801,7 +2803,8 @@ static int lock_force_unlock(int argc, char **argv)
>   	struct vdi_tree *vdi;
>   
>   	init_tree();
> -	if (parse_vdi(construct_vdi_tree, SD_INODE_HEADER_SIZE, NULL) < 0)
> +	if (parse_vdi(construct_vdi_tree, SD_INODE_HEADER_SIZE,
> +			NULL, true) < 0)
>   		return EXIT_SYSFAIL;
>   
>   	vdi = find_vdi_from_root_by_name(vdiname);





More information about the sheepdog mailing list