[sheepdog] [PATCH 1/3] sheep: use qemu cache option to use writeback/writethrough mode

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Thu Aug 30 11:02:56 CEST 2012


When writeback is enabled, SD_FLAG_CMD_CACHE flag is set to I/O
requests.  This patch uses it for write mode.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 sheep/object_cache.c |   83 ++++++++++++-------------------------------------
 sheep/request.c      |    2 +-
 sheep/sheep.c        |   13 +------
 sheep/sheep_priv.h   |    1 -
 4 files changed, 24 insertions(+), 75 deletions(-)

diff --git a/sheep/object_cache.c b/sheep/object_cache.c
index a722259..431fe26 100644
--- a/sheep/object_cache.c
+++ b/sheep/object_cache.c
@@ -75,9 +75,6 @@ struct object_cache {
 	struct rb_root object_tree;
 
 	pthread_rwlock_t lock;
-
-	int (*read)(struct object_cache_entry *, void *, size_t, off_t);
-	int (*write)(struct object_cache_entry *, void *, size_t, off_t, int);
 };
 
 static struct global_cache sys_cache;
@@ -372,19 +369,6 @@ out:
 	return ret;
 }
 
-static int write_cache_object(struct object_cache_entry *entry, void *buf,
-			      size_t count, off_t offset, int create)
-{
-	uint32_t vid = entry->oc->vid, idx = entry_idx(entry);
-	int ret;
-
-	ret = write_cache_object_noupdate(vid, idx, buf, count, offset);
-
-	if (ret == SD_RES_SUCCESS)
-		update_cache_entry(entry, idx, count, offset, 1);
-	return ret;
-}
-
 static int read_cache_object(struct object_cache_entry *entry, void *buf,
 			     size_t count, off_t offset)
 {
@@ -398,9 +382,9 @@ static int read_cache_object(struct object_cache_entry *entry, void *buf,
 	return ret;
 }
 
-static int write_and_push_cache_object(struct object_cache_entry *entry,
-				       void *buf, size_t count, off_t offset,
-				       int create)
+static int write_cache_object(struct object_cache_entry *entry, void *buf,
+			      size_t count, off_t offset, int create,
+			      bool writeback)
 {
 	uint32_t vid = entry->oc->vid, idx = entry_idx(entry);
 	uint64_t oid = idx_to_oid(vid, idx);
@@ -412,6 +396,9 @@ static int write_and_push_cache_object(struct object_cache_entry *entry,
 	if (ret != SD_RES_SUCCESS)
 		return ret;
 
+	if (writeback)
+		goto out;
+
 	if (create)
 		sd_init_req(&hdr, SD_OP_CREATE_AND_WRITE_OBJ);
 	else
@@ -427,8 +414,8 @@ static int write_and_push_cache_object(struct object_cache_entry *entry,
 		eprintf("failed to write object %" PRIx64 ", %x\n", oid, ret);
 		return ret;
 	}
-
-	update_cache_entry(entry, idx, count, offset, 0);
+out:
+	update_cache_entry(entry, idx, count, offset, writeback);
 	return ret;
 }
 
@@ -618,12 +605,6 @@ not_found:
 
 		pthread_rwlock_init(&cache->lock, NULL);
 		hlist_add_head(&cache->hash, head);
-
-		cache->read = read_cache_object;
-		if (sys->writethrough)
-			cache->write = write_and_push_cache_object;
-		else
-			cache->write = write_cache_object;
 	} else {
 		cache = NULL;
 	}
@@ -690,7 +671,7 @@ static void add_to_object_cache(struct object_cache *oc, uint32_t idx,
 }
 
 static int object_cache_lookup(struct object_cache *oc, uint32_t idx,
-			       int create)
+			       int create, bool writeback)
 {
 	struct strbuf buf;
 	int fd, ret = SD_RES_SUCCESS, flags = def_open_flags;
@@ -728,12 +709,9 @@ static int object_cache_lookup(struct object_cache *oc, uint32_t idx,
 	ret = prealloc(fd, data_length);
 	if (ret != SD_RES_SUCCESS) {
 		ret = SD_RES_EIO;
-	} else {
-		if (sys->writethrough)
-			add_to_object_cache(oc, idx, 0);
-		else
-			add_to_object_cache(oc, idx, 1);
-	}
+	} else
+		add_to_object_cache(oc, idx, writeback);
+
 	close(fd);
 out:
 	strbuf_release(&buf);
@@ -851,7 +829,7 @@ int object_is_cached(uint64_t oid)
 	if (!cache)
 		return 0;
 
-	return (object_cache_lookup(cache, idx, 0) == SD_RES_SUCCESS);
+	return (object_cache_lookup(cache, idx, 0, false) == SD_RES_SUCCESS);
 }
 
 void object_cache_delete(uint32_t vid)
@@ -960,27 +938,6 @@ int bypass_object_cache(struct request *req)
 {
 	uint64_t oid = req->rq.obj.oid;
 
-	if (!(req->rq.flags & SD_FLAG_CMD_CACHE)) {
-		uint32_t vid = oid_to_vid(oid);
-		struct object_cache *cache;
-
-		cache = find_object_cache(vid, 0);
-		if (!cache)
-			return 1;
-		if (req->rq.flags & SD_FLAG_CMD_WRITE) {
-			object_cache_flush_and_delete(cache);
-			return 1;
-		} else  {
-			/* For read requet, we can read cache if any */
-			uint32_t idx = object_cache_oid_to_idx(oid);
-
-			if (object_cache_lookup(cache, idx, 0) == 0)
-				return 0;
-			else
-				return 1;
-		}
-	}
-
 	/*
 	 * For vmstate && vdi_attr object, we don't do caching
 	 */
@@ -1009,7 +966,8 @@ int object_cache_handle_request(struct request *req)
 		create = 1;
 
 retry:
-	ret = object_cache_lookup(cache, idx, create);
+	ret = object_cache_lookup(cache, idx, create,
+				  hdr->flags & SD_FLAG_CMD_CACHE);
 	if (ret == SD_RES_NO_CACHE) {
 		ret = object_cache_pull(cache, idx);
 		if (ret != SD_RES_SUCCESS)
@@ -1030,13 +988,14 @@ retry:
 	}
 
 	if (hdr->flags & SD_FLAG_CMD_WRITE) {
-		ret = cache->write(entry, req->data, hdr->data_length,
-				   hdr->obj.offset, create);
+		ret = write_cache_object(entry, req->data, hdr->data_length,
+					 hdr->obj.offset, create,
+					 hdr->flags & SD_FLAG_CMD_CACHE);
 		if (ret != SD_RES_SUCCESS)
 			goto err;
 	} else {
-		ret = cache->read(entry, req->data, hdr->data_length,
-				  hdr->obj.offset);
+		ret = read_cache_object(entry, req->data, hdr->data_length,
+					hdr->obj.offset);
 		if (ret != SD_RES_SUCCESS)
 			goto err;
 		req->rp.data_length = hdr->data_length;
@@ -1065,7 +1024,7 @@ int object_cache_write(uint64_t oid, char *data, unsigned int datalen,
 		return SD_RES_NO_CACHE;
 	}
 
-	ret = write_cache_object(entry, data, datalen, offset, create);
+	ret = write_cache_object(entry, data, datalen, offset, create, false);
 
 	put_cache_entry(entry);
 
diff --git a/sheep/request.c b/sheep/request.c
index fd210d3..7c2dec8 100644
--- a/sheep/request.c
+++ b/sheep/request.c
@@ -287,7 +287,7 @@ static void queue_gateway_request(struct request *req)
 	 * Even if it doesn't exist in cache, we'll rely on cache layer to pull
 	 * it.
 	 */
-	if (sys->enable_write_cache && req->rq.flags & SD_FLAG_CMD_CACHE)
+	if (sys->enable_write_cache)
 		goto queue_work;
 
 	if (req->local_oid)
diff --git a/sheep/sheep.c b/sheep/sheep.c
index 36e059a..c168d26 100644
--- a/sheep/sheep.c
+++ b/sheep/sheep.c
@@ -197,7 +197,6 @@ int main(int argc, char **argv)
 	struct cluster_driver *cdrv;
 	int enable_object_cache = 0; /* disabled by default */
 	char *pid_file = NULL;
-	char *object_cache_size, *object_cache_mode;
 
 	signal(SIGPIPE, SIG_IGN);
 
@@ -266,9 +265,7 @@ int main(int argc, char **argv)
 			break;
 		case 'w':
 			enable_object_cache = 1;
-			object_cache_size = strtok(optarg, ",");
-			object_cache_mode = strtok(NULL, ",");
-			cache_size = strtol(object_cache_size, &p, 10);
+			cache_size = strtol(optarg, &p, 10);
 			if (optarg == p || cache_size < 0 ||
 			    UINT64_MAX < cache_size) {
 				fprintf(stderr, "Invalid cache size '%s': "
@@ -278,14 +275,8 @@ int main(int argc, char **argv)
 			}
 			sys->cache_size = cache_size * 1024 * 1024;
 
-			if (!object_cache_mode ||
-			    strcmp(object_cache_mode, "writeback") != 0) {
-				sys->writethrough = 1;
-			}
 			fprintf(stdout, "enable write cache, "
-				"max cache size %" PRIu64 "M, %s mode\n",
-				cache_size, sys->writethrough ?
-				"writethrough" : "writeback");
+				"max cache size %" PRIu64 "M\n", cache_size);
 			break;
 		case 's':
 			free_space = strtoll(optarg, &p, 10);
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 90006f6..dce1ae5 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -109,7 +109,6 @@ struct cluster_info {
 	int use_directio;
 	uint8_t gateway_only;
 	uint8_t disable_recovery;
-	uint8_t writethrough;
 
 	struct work_queue *gateway_wqueue;
 	struct work_queue *io_wqueue;
-- 
1.7.2.5




More information about the sheepdog mailing list