[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