[sheepdog] [PATCH v3 3/3] journal: new journal flag JF_DELETE_OBJ for deleting object
Hitoshi Mitake
mitake.hitoshi at gmail.com
Sun Apr 14 17:54:19 CEST 2013
Current journal implementation doesn't consider such a case:
1. make new journal for new object creation
2. actual creation of the object
3. delete object
4. crash
After such a sequence, the journaling mechanism recovers the deleted
object. This behavior isn't valid. This patch implements the new
journal flag: JF_DELETE_OBJ. If the journaling mechanism finds an
entry with this flag during recovery process, it deletes an
corresponding object.
Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
---
sheep/journal.c | 29 +++++++++++++++++++++++++++--
sheep/plain_store.c | 3 +++
sheep/sheep_priv.h | 1 +
3 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/sheep/journal.c b/sheep/journal.c
index be1a6b7..aea0115 100644
--- a/sheep/journal.c
+++ b/sheep/journal.c
@@ -53,6 +53,7 @@ struct journal_descriptor {
#define JF_STORE 0
#define JF_EPOCH 1
#define JF_CONFIG 2
+#define JF_DELETE_OBJ 3
static const char *jfile_name[2] = { "journal_file0", "journal_file1", };
static int jfile_fds[2];
@@ -140,10 +141,14 @@ static void journal_get_path(struct journal_descriptor *jd, char *path)
{
switch (jd->flag) {
case JF_STORE:
+ case JF_DELETE_OBJ:
snprintf(path, PATH_MAX, "%s/%016"PRIx64,
get_object_path(jd->oid), jd->oid);
- sd_iprintf("%s, size %"PRIu64", off %"PRIu64", %d",
- path, jd->size, jd->offset, jd->create);
+ if (jd->flag == JF_STORE)
+ sd_iprintf("%s, size %"PRIu64", off %"PRIu64", %d",
+ path, jd->size, jd->offset, jd->create);
+ else
+ sd_iprintf("%s (delete)", path);
break;
case JF_EPOCH:
snprintf(path, PATH_MAX, "%s/%08"PRIu32, epoch_path, jd->epoch);
@@ -154,6 +159,9 @@ static void journal_get_path(struct journal_descriptor *jd, char *path)
snprintf(path, PATH_MAX, "%s", config_path);
sd_iprintf("%s, size %"PRIu64, path, jd->size);
break;
+ default:
+ panic("unknown type of journal flag: %d", jd->flag);
+ break;
}
}
@@ -165,6 +173,12 @@ static int replay_journal_entry(struct journal_descriptor *jd)
void *buf = NULL;
char *p = (char *)jd;
+ if (jd->flag == JF_DELETE_OBJ) {
+ journal_get_path(jd, path);
+ unlink(path);
+ return;
+ }
+
if (jd->create)
flags |= O_CREAT;
@@ -453,3 +467,14 @@ int journal_write_config(const char *buf, size_t size)
};
return journal_file_write(&jd, buf);
}
+
+int journal_delete_object(uint64_t oid)
+{
+ struct journal_descriptor jd = {
+ .magic = JOURNAL_DESC_MAGIC,
+ .flag = JF_DELETE_OBJ,
+ .size = 0,
+ };
+ jd.oid = oid;
+ return journal_file_write(&jd, NULL);
+}
diff --git a/sheep/plain_store.c b/sheep/plain_store.c
index b5bb395..38c5c62 100644
--- a/sheep/plain_store.c
+++ b/sheep/plain_store.c
@@ -452,6 +452,9 @@ int default_remove_object(uint64_t oid)
{
char path[PATH_MAX];
+ if (uatomic_is_true(&sys->use_journal))
+ journal_delete_object(oid);
+
get_obj_path(oid, path);
if (unlink(path) < 0) {
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index a447387..9b3a7ac 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -407,6 +407,7 @@ int
journal_write_store(uint64_t oid, const char *buf, size_t size, off_t, bool);
int journal_write_epoch(const char *buf, size_t size, uint32_t epoch);
int journal_write_config(const char *buf, size_t size);
+int journal_delete_object(uint64_t oid);
/* md.c */
void md_add_disk(char *path);
--
1.7.5.1
More information about the sheepdog
mailing list