[Sheepdog] [PATCH] sheep: recover objects atomically
MORITA Kazutaka
morita.kazutaka at lab.ntt.co.jp
Tue Dec 28 10:43:52 CET 2010
Node failure could happen during object recovery, so it should be done
atomically. This patch supports atomic object recovery with
rename(2).
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
sheep/store.c | 22 +++++++++++++++++++++-
1 files changed, 21 insertions(+), 1 deletions(-)
diff --git a/sheep/store.c b/sheep/store.c
index 69da41a..e93f44d 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -1159,7 +1159,20 @@ next:
rsp = (struct sd_obj_rsp *)&hdr;
if (rsp->result == SD_RES_SUCCESS) {
- fd = ob_open(epoch, oid, O_CREAT, &ret);
+ char path[PATH_MAX], tmp_path[PATH_MAX];
+ int flags = O_SYNC | O_RDWR | O_CREAT;
+
+ snprintf(path, sizeof(path), "%s%08u/%016" PRIx64, obj_path,
+ epoch, oid);
+ snprintf(tmp_path, sizeof(tmp_path), "%s%08u/%016" PRIx64 ".tmp",
+ obj_path, epoch, oid);
+
+ fd = open(tmp_path, flags, def_fmode);
+ if (fd < 0) {
+ eprintf("failed to open %s, %s\n", tmp_path, strerror(errno));
+ return -1;
+ }
+
ret = write(fd, buf, rlen);
if (ret != rlen) {
eprintf("failed to write object\n");
@@ -1174,6 +1187,13 @@ next:
}
close(fd);
+
+ dprintf("rename %s to %s\n", tmp_path, path);
+ ret = rename(tmp_path, path);
+ if (ret < 0) {
+ eprintf("failed to rename %s to %s, %m\n", tmp_path, path);
+ return -1;
+ }
dprintf("recovered oid %"PRIx64" to epoch %"PRIu32"\n", oid, epoch);
return 0;
}
--
1.5.6.5
More information about the sheepdog
mailing list