[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