[sheepdog] [PATCH 2/3] object cache: remove async flush
Liu Yuan
namei.unix at gmail.com
Wed Jun 27 16:05:41 CEST 2012
From: Liu Yuan <tailai.ly at taobao.com>
For now we have a retry-based pull/push method, which privide us mush better
robust mechanism, async is no longer required to run Guests seriously because
it violate block storage that Guest always expect of.
Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
sheep/object_cache.c | 54 ++++++++------------------------------------------
sheep/sheep.c | 13 +++---------
sheep/sheep_priv.h | 5 +----
3 files changed, 12 insertions(+), 60 deletions(-)
diff --git a/sheep/object_cache.c b/sheep/object_cache.c
index fdc8253..9e91b6a 100644
--- a/sheep/object_cache.c
+++ b/sheep/object_cache.c
@@ -60,12 +60,6 @@ struct object_cache_entry {
int create;
};
-struct flush_work {
- struct object_cache *cache;
- struct vnode_info *vnode_info;
- struct work work;
-};
-
static char cache_dir[PATH_MAX];
static int def_open_flags = O_RDWR;
@@ -209,9 +203,9 @@ out:
return cache;
}
-static inline void del_from_dirty_tree_and_list(
- struct object_cache_entry *entry,
- struct rb_root *dirty_tree)
+static inline void
+del_from_dirty_tree_and_list(struct object_cache_entry *entry,
+ struct rb_root *dirty_tree)
{
rb_erase(&entry->rb, dirty_tree);
list_del(&entry->list);
@@ -539,8 +533,8 @@ static uint64_t idx_to_oid(uint32_t vid, uint32_t idx)
return vid_to_data_oid(vid, idx);
}
-static int push_cache_object(uint32_t vid, uint32_t idx,
- uint64_t bmap, int create)
+static int push_cache_object(uint32_t vid, uint32_t idx, uint64_t bmap,
+ int create)
{
struct sd_req hdr;
void *buf;
@@ -678,8 +672,7 @@ void object_cache_delete(uint32_t vid)
}
-static int object_cache_flush_and_delete(struct vnode_info *vnode_info,
- struct object_cache *oc)
+static int object_cache_flush_and_delete(struct object_cache *oc)
{
DIR *dir;
struct dirent *d;
@@ -734,7 +727,7 @@ int bypass_object_cache(struct request *req)
if (!cache)
return 1;
if (req->rq.flags & SD_FLAG_CMD_WRITE) {
- object_cache_flush_and_delete(req->vnodes, cache);
+ object_cache_flush_and_delete(cache);
return 1;
} else {
/* For read requet, we can read cache if any */
@@ -845,25 +838,6 @@ int object_cache_read(uint64_t oid, char *data, unsigned int datalen,
return ret;
}
-static void object_cache_flush_vdi_fn(struct work *work)
-{
- struct flush_work *fw = container_of(work, struct flush_work, work);
-
- dprintf("flush vdi %"PRIx32"\n", fw->cache->vid);
- if (object_cache_push(fw->cache) != SD_RES_SUCCESS)
- eprintf("failed to flush vdi %"PRIx32"\n", fw->cache->vid);
-}
-
-static void object_cache_flush_vdi_done(struct work *work)
-{
- struct flush_work *fw = container_of(work, struct flush_work, work);
-
- dprintf("flush vdi %"PRIx32" done\n", fw->cache->vid);
-
- put_vnode_info(fw->vnode_info);
- free(fw);
-}
-
int object_cache_flush_vdi(struct request *req)
{
uint32_t vid = oid_to_vid(req->rq.obj.oid);
@@ -873,18 +847,6 @@ int object_cache_flush_vdi(struct request *req)
if (!cache)
return SD_RES_SUCCESS;
- if (sys->async_flush) {
- struct flush_work *fw = xzalloc(sizeof(*fw));
-
- fw->work.fn = object_cache_flush_vdi_fn;
- fw->work.done = object_cache_flush_vdi_done;
- fw->cache = cache;
- fw->vnode_info = grab_vnode_info(req->vnodes);
-
- queue_work(sys->flush_wqueue, &fw->work);
- return SD_RES_SUCCESS;
- }
-
return object_cache_push(cache);
}
@@ -894,7 +856,7 @@ int object_cache_flush_and_del(struct request *req)
struct object_cache *cache;
cache = find_object_cache(vid, 0);
- if (cache && object_cache_flush_and_delete(req->vnodes, cache) < 0)
+ if (cache && object_cache_flush_and_delete(cache) < 0)
return SD_RES_EIO;
return SD_RES_SUCCESS;
}
diff --git a/sheep/sheep.c b/sheep/sheep.c
index 49d3cda..67db023 100644
--- a/sheep/sheep.c
+++ b/sheep/sheep.c
@@ -34,7 +34,6 @@ LIST_HEAD(cluster_drivers);
static char program_name[] = "sheep";
static struct option const long_options[] = {
- {"asyncflush", no_argument, NULL, 'a'},
{"cluster", required_argument, NULL, 'c'},
{"debug", no_argument, NULL, 'd'},
{"directio", no_argument, NULL, 'D'},
@@ -53,7 +52,7 @@ static struct option const long_options[] = {
{NULL, 0, NULL, 0},
};
-static const char *short_options = "ac:dDfg:Ghi:l:op:v:Wy:z:";
+static const char *short_options = "c:dDfg:Ghi:l:op:v:Wy:z:";
static void usage(int status)
{
@@ -65,7 +64,6 @@ static void usage(int status)
Sheepdog daemon (version %s)\n\
Usage: %s [OPTION]... [PATH]\n\
Options:\n\
- -a, --asyncflush flush the object cache asynchronously\n\
-c, --cluster specify the cluster driver\n\
-d, --debug include debug messages in the log\n\
-D, --directio use direct IO when accessing the object from object cache\n\
@@ -165,9 +163,6 @@ int main(int argc, char **argv)
dprintf("direct IO mode\n");
sys->use_directio = 1;
break;
- case 'a':
- sys->async_flush = 1;
- break;
case 'g':
nr_gateway_worker = strtol(optarg, &p, 10);
if (optarg == p || nr_gateway_worker < 4 || nr_gateway_worker > UINT32_MAX) {
@@ -281,11 +276,9 @@ int main(int argc, char **argv)
sys->io_wqueue = init_work_queue("io", nr_io_worker);
sys->recovery_wqueue = init_work_queue("recovery", 1);
sys->deletion_wqueue = init_work_queue("deletion", 1);
- sys->flush_wqueue = init_work_queue("flush", 1);
sys->block_wqueue = init_work_queue("block", 1);
- if (!sys->gateway_wqueue || !sys->io_wqueue ||
- !sys->recovery_wqueue || !sys->deletion_wqueue ||
- !sys->flush_wqueue || !sys->block_wqueue)
+ if (!sys->gateway_wqueue || !sys->io_wqueue ||!sys->recovery_wqueue ||
+ !sys->deletion_wqueue || !sys->block_wqueue)
exit(1);
ret = init_signal();
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index bd44073..90c22cc 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -131,13 +131,11 @@ struct cluster_info {
uint32_t recovered_epoch;
int use_directio;
- uint8_t async_flush;
struct work_queue *gateway_wqueue;
struct work_queue *io_wqueue;
struct work_queue *deletion_wqueue;
struct work_queue *recovery_wqueue;
- struct work_queue *flush_wqueue;
struct work_queue *block_wqueue;
};
@@ -300,7 +298,6 @@ int prealloc(int fd, uint32_t size);
int objlist_cache_insert(uint64_t oid);
void objlist_cache_remove(uint64_t oid);
-void object_cache_remove(uint64_t oid);
void req_done(struct request *req);
@@ -402,8 +399,8 @@ int object_cache_read(uint64_t oid, char *data, unsigned int datalen,
int object_cache_flush_vdi(struct request *req);
int object_cache_flush_and_del(struct request *req);
void object_cache_delete(uint32_t vid);
-
int object_cache_init(const char *p);
+void object_cache_remove(uint64_t oid);
/* sockfd_cache */
struct sockfd {
--
1.7.10.2
More information about the sheepdog
mailing list