[sheepdog] [PATCH v5 3/7] sheep: teach journal file to handle epoch and config write

Liu Yuan namei.unix at gmail.com
Fri Apr 5 12:32:29 CEST 2013


From: Liu Yuan <tailai.ly at taobao.com>

journal_write_epoch and journal_write_config is a placeholder for later patch.

Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
 sheep/journal_file.c |  100 +++++++++++++++++++++++++++++++++++++++-----------
 sheep/plain_store.c  |    7 ++--
 sheep/sheep_priv.h   |    5 ++-
 3 files changed, 87 insertions(+), 25 deletions(-)

diff --git a/sheep/journal_file.c b/sheep/journal_file.c
index 4ae0e4b..d20798e 100644
--- a/sheep/journal_file.c
+++ b/sheep/journal_file.c
@@ -30,8 +30,12 @@ struct journal_file {
 
 struct journal_descriptor {
 	uint32_t magic;
-	uint32_t reserved;
-	uint64_t oid;
+	uint16_t flag;
+	uint16_t reserved;
+	union {
+		uint32_t epoch;
+		uint64_t oid;
+	};
 	uint64_t offset;
 	uint64_t size;
 	uint8_t create;
@@ -46,6 +50,10 @@ struct journal_descriptor {
 
 #define JOURNAL_END_MARKER 0xdeadbeef
 
+#define JF_STORE 0
+#define JF_EPOCH 1
+#define JF_CONFI 2
+
 static const char *jfile_name[2] = { "journal_file0", "journal_file1", };
 static int jfile_fds[2];
 static size_t jfile_size;
@@ -128,28 +136,46 @@ static bool journal_entry_full_write(struct journal_descriptor *jd)
 	return true;
 }
 
+static void journal_get_path(struct journal_descriptor *jd, char *path)
+{
+	switch (jd->flag) {
+	case JF_STORE:
+		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);
+		break;
+	case JF_EPOCH:
+		snprintf(path, PATH_MAX, "%s/%08"PRIu32, epoch_path, jd->epoch);
+		sd_iprintf("%s, %"PRIu32" size %"PRIu64,
+			   path, jd->epoch, jd->size);
+		break;
+	case JF_CONFI:
+		snprintf(path, PATH_MAX, "%s", config_path);
+		sd_iprintf("%s, size %"PRIu64, path, jd->size);
+		break;
+	}
+}
+
 static int replay_journal_entry(struct journal_descriptor *jd)
 {
 	char path[PATH_MAX];
 	ssize_t size;
 	int fd, flags = O_WRONLY, ret = 0;
-	void *buf;
+	void *buf = NULL;
 	char *p = (char *)jd;
 
-	sd_dprintf("%"PRIx64", size %"PRIu64", off %"PRIu64", %d", jd->oid,
-		   jd->size, jd->offset, jd->create);
-
 	if (jd->create)
 		flags |= O_CREAT;
-	snprintf(path, sizeof(path), "%s/%016" PRIx64, get_object_path(jd->oid),
-		 jd->oid);
+
+	journal_get_path(jd, path);
 	fd = open(path, flags, def_fmode);
 	if (fd < 0) {
 		sd_eprintf("open %m");
 		return -1;
 	}
 
-	if (jd->create) {
+	if (jd->create && jd->flag == JF_STORE) {
 		ret = prealloc(fd, get_objsize(jd->oid));
 		if (ret < 0)
 			goto out;
@@ -164,6 +190,7 @@ static int replay_journal_entry(struct journal_descriptor *jd)
 		goto out;
 	}
 out:
+	free(buf);
 	close(fd);
 	return ret;
 }
@@ -315,22 +342,15 @@ retry:
 		panic("%s", strerror(err));
 }
 
-int journal_file_write(uint64_t oid, const char *buf, size_t size,
-		       off_t offset, bool create)
+static int journal_file_write(struct journal_descriptor *jd, const char *buf)
 {
 	uint32_t marker = JOURNAL_END_MARKER;
 	int ret = SD_RES_SUCCESS;
+	uint64_t size = jd->size;
 	ssize_t written, rusize = roundup(size, SECTOR_SIZE),
 		wsize = JOURNAL_META_SIZE + rusize;
 	off_t woff;
 	char *wbuffer, *p;
-	struct journal_descriptor jd = {
-		.magic = JOURNAL_DESC_MAGIC,
-		.offset = offset,
-		.size = size,
-		.oid = oid,
-		.create = create,
-	};
 
 	pthread_spin_lock(&jfile_lock);
 	if (!jfile_enough_space(wsize))
@@ -340,7 +360,7 @@ int journal_file_write(uint64_t oid, const char *buf, size_t size,
 	pthread_spin_unlock(&jfile_lock);
 
 	p = wbuffer = xvalloc(wsize);
-	memcpy(p, &jd, JOURNAL_DESC_SIZE);
+	memcpy(p, jd, JOURNAL_DESC_SIZE);
 	p += JOURNAL_DESC_SIZE;
 	memcpy(p, buf, size);
 	p += size;
@@ -349,8 +369,6 @@ int journal_file_write(uint64_t oid, const char *buf, size_t size,
 		p += rusize - size;
 	}
 	memcpy(p, &marker, JOURNAL_MARKER_SIZE);
-
-	sd_dprintf("oid %lx, pos %zu, wsize %zu", oid, jfile.pos, wsize);
 	/*
 	 * Concurrent writes with the same FD is okay because we don't have any
 	 * critical sections that need lock inside kernel write path, since we
@@ -369,3 +387,43 @@ out:
 	free(wbuffer);
 	return ret;
 }
+
+int journal_write_store(uint64_t oid, const char *buf, size_t size,
+			off_t offset, bool create)
+{
+	struct journal_descriptor jd = {
+		.magic = JOURNAL_DESC_MAGIC,
+		.flag = JF_STORE,
+		.offset = offset,
+		.size = size,
+		.create = create,
+	};
+	/* We have to explicitly do assignment to get all GCC compatible */
+	jd.oid = oid;
+	return journal_file_write(&jd, buf);
+}
+
+int journal_write_epoch(const char *buf, size_t size, uint32_t epoch)
+{
+	struct journal_descriptor jd = {
+		.magic = JOURNAL_DESC_MAGIC,
+		.flag = JF_EPOCH,
+		.offset = 0,
+		.size = size,
+		.create = true,
+	};
+	jd.epoch = epoch;
+	return journal_file_write(&jd, buf);
+}
+
+int journal_write_config(const char *buf, size_t size)
+{
+	struct journal_descriptor jd = {
+		.magic = JOURNAL_DESC_MAGIC,
+		.flag = JF_CONFI,
+		.offset = 0,
+		.size = size,
+		.create = true,
+	};
+	return journal_file_write(&jd, buf);
+}
diff --git a/sheep/plain_store.c b/sheep/plain_store.c
index 1352dc4..b5bb395 100644
--- a/sheep/plain_store.c
+++ b/sheep/plain_store.c
@@ -96,8 +96,8 @@ int default_write(uint64_t oid, const struct siocb *iocb)
 	get_obj_path(oid, path);
 
 	if (uatomic_is_true(&sys->use_journal) &&
-	    journal_file_write(oid, iocb->buf, iocb->length, iocb->offset,
-			       false)
+	    journal_write_store(oid, iocb->buf, iocb->length, iocb->offset,
+				false)
 	    != SD_RES_SUCCESS) {
 		sd_eprintf("turn off journaling");
 		uatomic_set_false(&sys->use_journal);
@@ -292,7 +292,8 @@ int default_create_and_write(uint64_t oid, const struct siocb *iocb)
 	get_tmp_obj_path(oid, tmp_path);
 
 	if (uatomic_is_true(&sys->use_journal) &&
-	    journal_file_write(oid, iocb->buf, iocb->length, iocb->offset, true)
+	    journal_write_store(oid, iocb->buf, iocb->length,
+				iocb->offset, true)
 	    != SD_RES_SUCCESS) {
 		sd_eprintf("turn off journaling");
 		uatomic_set_false(&sys->use_journal);
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index a067347..5cde361 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -408,7 +408,10 @@ bool sheep_need_retry(uint32_t epoch);
 
 /* journal_file.c */
 int journal_file_init(const char *path, size_t size, bool skip);
-int journal_file_write(uint64_t oid, const char *buf, size_t size, off_t, bool);
+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);
 
 /* md.c */
 void md_add_disk(char *path);
-- 
1.7.9.5




More information about the sheepdog mailing list