[sheepdog] [PATCH 1/2] sheep: reduce needless memory allocation in checkpoint sync
Hitoshi Mitake
mitake.hitoshi at lab.ntt.co.jp
Tue Jun 23 15:50:37 CEST 2015
Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
---
sheep/group.c | 36 ++++++++++--------------------------
1 file changed, 10 insertions(+), 26 deletions(-)
diff --git a/sheep/group.c b/sheep/group.c
index dd73d28..936695f 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -691,45 +691,32 @@ struct cinfo_collection_work {
int epoch;
struct vnode_info *members;
- struct vdi_state *result;
+ struct vdi_state result;
uint32_t next_vid;
};
static struct cinfo_collection_work *collect_work;
-static struct vdi_state *do_cinfo_collection_work(uint32_t epoch,
- uint32_t vid,
- struct sd_node *n)
+static int do_cinfo_collection_work(uint32_t epoch, uint32_t vid,
+ struct sd_node *n, struct vdi_state *result)
{
- struct vdi_state *vs = NULL;
struct sd_req hdr;
- int ret;
-
- vs = xzalloc(sizeof(*vs));
sd_init_req(&hdr, SD_OP_VDI_STATE_CHECKPOINT_CTL);
hdr.vdi_state_checkpoint.get = 1;
hdr.vdi_state_checkpoint.tgt_epoch = epoch;
hdr.vdi_state_checkpoint.vid = vid;
- hdr.data_length = sizeof(*vs);
-
- ret = sheep_exec_req(&n->nid, &hdr, (char *)vs);
- if (ret == SD_RES_SUCCESS) {
- sd_debug("succeed to obtain checkpoint of vdi states");
- return vs;
- }
+ hdr.data_length = sizeof(*result);
- sd_err("failed to obtain checkpoint of vdi states from node %s",
- node_to_str(n));
- return NULL;
+ return sheep_exec_req(&n->nid, &hdr, (char *)result);
}
static void cinfo_collection_work(struct work *work)
{
- struct vdi_state *vs = NULL;
struct cinfo_collection_work *w =
container_of(work, struct cinfo_collection_work, work);
struct sd_node *n;
+ int ret;
sd_debug("start collection of cinfo, epoch: %d, vid: %"PRIx32,
w->epoch, w->next_vid);
@@ -740,11 +727,10 @@ static void cinfo_collection_work(struct work *work)
if (node_is_local(n))
continue;
- vs = do_cinfo_collection_work(w->epoch, w->next_vid, n);
- if (vs) {
- w->result = vs;
+ ret = do_cinfo_collection_work(w->epoch, w->next_vid, n,
+ &w->result);
+ if (ret == SD_RES_SUCCESS)
return;
- }
}
/*
@@ -788,11 +774,10 @@ static main_fn void cinfo_collection_done(struct work *work)
struct cinfo_collection_work *w =
container_of(work, struct cinfo_collection_work, work);
uint32_t next_vid;
- struct vdi_state *vs = w->result;
+ struct vdi_state *vs = &w->result;
sd_assert(w == collect_work);
-
sd_debug("VID: %"PRIx32, vs->vid);
sd_debug("nr_copies: %d", vs->nr_copies);
sd_debug("snapshot: %d", vs->snapshot);
@@ -803,7 +788,6 @@ static main_fn void cinfo_collection_done(struct work *work)
addr_to_str(vs->lock_owner.addr, vs->lock_owner.port));
apply_vdi_lock_state(vs);
- free(vs);
next_vid = find_next_bit(sys->vdi_inuse, SD_NR_VDIS, w->next_vid + 1);
if (next_vid == SD_NR_VDIS) {
--
1.9.1
More information about the sheepdog
mailing list