Even if journal files are broken, we can do nothing for recoverying
it. It is better to inform it as log messages and continue the
initialization process.

Signed-off-by: Hitoshi Mitake <[email protected]>
---
v3: handle empty journal files

 sheep/journal.c |   26 +++++++++++++++++---------
 1 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/sheep/journal.c b/sheep/journal.c
index 2e1d21f..92a005e 100644
--- a/sheep/journal.c
+++ b/sheep/journal.c
@@ -207,6 +207,16 @@ static int do_recover(int fd)
                return -1;
        }
 
+       if (!st.st_size) {
+               /*
+                * An empty journal file can be produced when sheep crashes
+                * between ftruncate() and prealloc() of commit_data().
+                * Such a file should be ignored simply.
+                */
+               close(fd);
+               return 0;
+       }
+
        map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
        close(fd);
        if (map == MAP_FAILED) {
@@ -245,31 +255,29 @@ skip:
  * we actually only recover one jfile, the other would be empty. This process
  * is fast with buffered IO that only take several secends at most.
  */
-static int check_recover_journal_file(const char *p)
+static void check_recover_journal_file(const char *p)
 {
        int old = 0, new = 0;
 
        if (get_old_new_jfile(p, &old, &new) < 0)
-               return -1;
+               return;
 
        /* No journal file found */
        if (old == 0)
-               return 0;
+               return;
 
        if (do_recover(old) < 0)
-               return -1;
+               panic("recoverying from journal file (old) failed");
        if (do_recover(new) < 0)
-               return -1;
-
-       return 0;
+               panic("recoverying from journal file (new) failed");
 }
 
 int journal_file_init(const char *path, size_t size, bool skip)
 {
        int fd;
 
-       if (!skip && check_recover_journal_file(path) < 0)
-               return -1;
+       if (!skip)
+               check_recover_journal_file(path);
 
        jfile_size = (size * 1024 * 1024) / 2;
 
-- 
1.7.5.1

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to