[Sheepdog] [PATCH 2/4] sheep: remove message header
MORITA Kazutaka
morita.kazutaka at lab.ntt.co.jp
Thu Oct 20 13:33:13 CEST 2011
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
sheep/group.c | 58 ++++++++++++++++++++------------------------------------
1 files changed, 21 insertions(+), 37 deletions(-)
diff --git a/sheep/group.c b/sheep/group.c
index 04fec41..4968528 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -29,15 +29,7 @@ struct node {
struct list_head list;
};
-struct message_header {
- uint8_t proto_ver;
- uint8_t pad[3];
- uint32_t msg_length;
- struct sheepdog_node_list_entry from;
-};
-
struct join_message {
- struct message_header header;
uint16_t nr_nodes;
uint16_t nr_leave_nodes;
uint32_t nr_sobjs;
@@ -47,7 +39,8 @@ struct join_message {
uint64_t ctime;
uint32_t result;
uint8_t inc_epoch; /* set non-zero when we increment epoch of all nodes */
- uint8_t pad[3];
+ uint8_t proto_ver;
+ uint8_t pad[2];
union {
struct sheepdog_node_list_entry nodes[0];
struct sheepdog_node_list_entry leave_nodes[0];
@@ -55,7 +48,6 @@ struct join_message {
};
struct vdi_op_message {
- struct message_header header;
struct sd_vdi_req req;
struct sd_vdi_rsp rsp;
uint8_t data[0];
@@ -64,6 +56,8 @@ struct vdi_op_message {
struct work_notify {
struct cpg_event cev;
+ struct sheepdog_node_list_entry sender;
+
struct message_header *msg;
};
@@ -267,8 +261,6 @@ forward:
return;
}
- msg->header.msg_length = sizeof(*msg) + hdr->data_length;
- msg->header.from = sys->this_node;
msg->req = *((struct sd_vdi_req *)&req->rq);
msg->rsp = *((struct sd_vdi_rsp *)&req->rp);
if (hdr->flags & SD_FLAG_CMD_WRITE)
@@ -276,7 +268,7 @@ forward:
list_add(&req->pending_list, &sys->pending_list);
- sys->cdrv->notify(msg, msg->header.msg_length, vdi_op);
+ sys->cdrv->notify(msg, sizeof(*msg) + hdr->data_length, vdi_op);
free(msg);
}
@@ -466,18 +458,17 @@ out:
return ret;
}
-static void join(struct join_message *msg)
+static void join(struct sheepdog_node_list_entry *joining, struct join_message *msg)
{
- if (msg->header.proto_ver != SD_SHEEP_PROTO_VER) {
+ if (msg->proto_ver != SD_SHEEP_PROTO_VER) {
eprintf("joining node send a wrong version message\n");
msg->result = SD_RES_VER_MISMATCH;
return;
}
- msg->result = get_cluster_status(&msg->header.from, msg->nodes,
- msg->nr_nodes, msg->ctime,
- msg->epoch, &msg->cluster_status,
- &msg->inc_epoch);
+ msg->result = get_cluster_status(joining, msg->nodes, msg->nr_nodes,
+ msg->ctime, msg->epoch,
+ &msg->cluster_status, &msg->inc_epoch);
msg->nr_sobjs = sys->nr_sobjs;
msg->cluster_flags = sys->flags;
msg->ctime = get_cluster_ctime();
@@ -553,6 +544,7 @@ static int update_epoch_log(int epoch)
}
static void update_cluster_info(struct join_message *msg,
+ struct sheepdog_node_list_entry *joined,
struct sheepdog_node_list_entry *nodes,
size_t nr_nodes)
{
@@ -573,7 +565,7 @@ static void update_cluster_info(struct join_message *msg,
/* add nodes execept for newly joined one */
for (i = 0; i < nr_nodes; i++) {
- if (node_cmp(nodes + i, &msg->header.from) == 0)
+ if (node_cmp(nodes + i, joined) == 0)
continue;
sys->nodes[sys->nr_nodes++] = nodes[i];
@@ -607,7 +599,7 @@ static void update_cluster_info(struct join_message *msg,
update_epoch_log(sys->epoch);
join_finished:
- sys->nodes[sys->nr_nodes++] = msg->header.from;
+ sys->nodes[sys->nr_nodes++] = *joined;
qsort(sys->nodes, sys->nr_nodes, sizeof(*sys->nodes), node_cmp);
sys->nr_vnodes = nodes_to_vnodes(sys->nodes, sys->nr_nodes,
sys->vnodes);
@@ -787,7 +779,7 @@ static void __sd_notify_done(struct cpg_event *cevent)
ret = SD_RES_UNKNOWN;
}
out:
- if (!is_myself(msg->header.from.addr, msg->header.from.port))
+ if (!is_myself(w->sender.addr, w->sender.port))
return;
req = list_first_entry(&sys->pending_list, struct request, pending_list);
@@ -804,13 +796,8 @@ static void sd_notify_handler(struct sheepdog_node_list_entry *sender,
{
struct cpg_event *cevent;
struct work_notify *w;
- struct message_header *m = msg;
- char name[128];
- dprintf("size: %d, from: %s, pid: %u\n",
- m->msg_length,
- addr_to_str(name, sizeof(name), m->from.addr, m->from.port),
- sender->port);
+ dprintf("size: %zd, from: %s\n", msg_len, node_to_str(sender));
w = zalloc(sizeof(*w));
if (!w)
@@ -821,6 +808,7 @@ static void sd_notify_handler(struct sheepdog_node_list_entry *sender,
vprintf(SDOG_DEBUG, "allow new deliver, %p\n", cevent);
+ w->sender = *sender;
if (msg_len) {
w->msg = zalloc(msg_len);
if (!w->msg)
@@ -917,22 +905,20 @@ static enum cluster_join_result sd_check_join_cb(
vprintf(SDOG_DEBUG, "%s\n", node_to_str(&sys->this_node));
- jm->header.from = sys->this_node;
-
nr_entries = ARRAY_SIZE(entries);
ret = read_epoch(&epoch, &ctime, entries, &nr_entries);
if (ret == SD_RES_SUCCESS) {
sys->epoch = epoch;
jm->ctime = ctime;
- get_cluster_status(&jm->header.from, entries, nr_entries,
- ctime, epoch, &jm->cluster_status, NULL);
+ get_cluster_status(joining, entries, nr_entries, ctime,
+ epoch, &jm->cluster_status, NULL);
} else
jm->cluster_status = SD_STATUS_WAIT_FOR_FORMAT;
return CJ_RES_SUCCESS;
}
- join(jm);
+ join(joining, jm);
dprintf("%d, %d\n", jm->result, jm->cluster_status);
if (jm->result == SD_RES_SUCCESS && jm->cluster_status != SD_STATUS_OK) {
@@ -967,9 +953,7 @@ static int send_join_request(struct sheepdog_node_list_entry *ent)
if (!msg)
panic("oom\n");
- msg->header.proto_ver = SD_SHEEP_PROTO_VER;
- msg->header.msg_length = sizeof(msg);
- msg->header.from = *ent;
+ msg->proto_ver = SD_SHEEP_PROTO_VER;
get_cluster_copies(&msg->nr_sobjs);
get_cluster_flags(&msg->cluster_flags);
@@ -997,7 +981,7 @@ static void __sd_join_done(struct cpg_event *cevent)
print_node_list(sys->nodes, sys->nr_nodes);
- update_cluster_info(jm, w->member_list, w->member_list_entries);
+ update_cluster_info(jm, &w->joined, w->member_list, w->member_list_entries);
if (sys_can_recover()) {
list_for_each_entry_safe(node, t, &sys->leave_list, list) {
--
1.7.2.5
More information about the sheepdog
mailing list