[sheepdog] [PATCH] sheep/md: fix guest file system read-only error

Liu Yuan namei.unix at gmail.com
Wed Jul 2 11:36:22 CEST 2014


On Mon, Jun 30, 2014 at 08:53:36PM +0800, Ruoyu wrote:
> If using md, it is easy to re-produce the error when sheepdog is
> doing recovery. The error message is just like as below.
> 
> ERROR [io 30895] md_move_object(630) failed to create
>                  /mnt/sheepdog/obj2/0082aba600000056
> ERROR [io 30895] md_check_and_move(661) move old
>                  /mnt/sheepdog/obj/0082aba600000056 to new
>                  /mnt/sheepdog/obj2/0082aba600000056 failed
> 
> If the above target object is being written unfortunately by other
> thread at that time, atomic_create_and_write return -1, and then,
> md_exist return false so that guest file system catch it.
> 
> Therefore, I think we should check errno if atomic_create_and_write
> is failure. If the temp file exist, in another word, someone is
> writting it, just return success to avoid the error.
> 
> Signed-off-by: Ruoyu <liangry at ucweb.com>
> ---
>  sheep/md.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/sheep/md.c b/sheep/md.c
> index 538f696..a1c950e 100644
> --- a/sheep/md.c
> +++ b/sheep/md.c
> @@ -627,9 +627,11 @@ static int md_move_object(uint64_t oid, const char *old, const char *new)
>  	}
>  
>  	if (atomic_create_and_write(new, buf.buf, buf.len, false) < 0) {
> -		sd_err("failed to create %s", new);
> -		ret = -1;
> -		goto out_close;
> +		if (errno != EEXIST) {
> +			sd_err("failed to create %s", new);
> +			ret = -1;
> +			goto out_close;
> +		}
>  	}
>  	unlink(old);
>  	ret = 0;
> -- 
> 1.8.3.2
> 
> 
> -- 
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog

Applied thanks

Yuan



More information about the sheepdog mailing list