[sheepdog] [PATCH] sheep: handle SD_FLAG_CMD_WRITE in cluster requests

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Tue Aug 28 18:43:08 CEST 2012


If SD_FLAG_CMD_WRITE is set, req->data means sent data, so we don't
need to set response data in sd_notify_handler().  Otherwise, it means
receive data buffer, so we don't need to set multicast data in
prepare_cluster_msg().

This also fixes some local requests which don't set SD_FLAG_CMD_WRITE.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 sheep/group.c    |    7 ++++---
 sheep/recovery.c |    1 +
 sheep/vdi.c      |    1 +
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/sheep/group.c b/sheep/group.c
index ea5b9e6..3571b96 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -249,7 +249,7 @@ static struct vdi_op_message *prepare_cluster_msg(struct request *req,
 	struct vdi_op_message *msg;
 	size_t size;
 
-	if (has_process_main(req->op))
+	if (has_process_main(req->op) && req->rq.flags & SD_FLAG_CMD_WRITE)
 		size = sizeof(*msg) + req->rq.data_length;
 	else
 		size = sizeof(*msg);
@@ -265,7 +265,7 @@ static struct vdi_op_message *prepare_cluster_msg(struct request *req,
 	memcpy(&msg->req, &req->rq, sizeof(struct sd_req));
 	memcpy(&msg->rsp, &req->rp, sizeof(struct sd_rsp));
 
-	if (has_process_main(req->op))
+	if (has_process_main(req->op) && req->rq.flags & SD_FLAG_CMD_WRITE)
 		memcpy(msg->data, req->data, req->rq.data_length);
 
 	*sizep = size;
@@ -931,7 +931,8 @@ void sd_notify_handler(struct sd_node *sender, void *data, size_t data_len)
 
 	if (req) {
 		msg->rsp.result = ret;
-		if (has_process_main(req->op))
+		if (has_process_main(req->op) &&
+		    !(req->rq.flags & SD_FLAG_CMD_WRITE))
 			memcpy(req->data, msg->data, msg->rsp.data_length);
 		memcpy(&req->rp, &msg->rsp, sizeof(req->rp));
 
diff --git a/sheep/recovery.c b/sheep/recovery.c
index 64cd452..521d58f 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -350,6 +350,7 @@ static void notify_recovery_completion_work(struct work *work)
 
 	sd_init_req(&hdr, SD_OP_COMPLETE_RECOVERY);
 	hdr.epoch = rw->epoch;
+	hdr.flags = SD_FLAG_CMD_WRITE;
 	hdr.data_length = sizeof(sys->this_node);
 
 	ret = exec_local_req(&hdr, &sys->this_node);
diff --git a/sheep/vdi.c b/sheep/vdi.c
index 97d9f4e..f7e762f 100644
--- a/sheep/vdi.c
+++ b/sheep/vdi.c
@@ -578,6 +578,7 @@ static int notify_vdi_deletion(uint32_t vdi_id)
 	int ret = SD_RES_SUCCESS;
 
 	sd_init_req(&hdr, SD_OP_NOTIFY_VDI_DEL);
+	hdr.flags = SD_FLAG_CMD_WRITE;
 	hdr.data_length = sizeof(vdi_id);
 
 	ret = exec_local_req(&hdr, &vdi_id);
-- 
1.7.2.5




More information about the sheepdog mailing list