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

Ruoyu liangry at ucweb.com
Mon Jun 30 14:53:36 CEST 2014


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





More information about the sheepdog mailing list