[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