[Sheepdog] [PATCH 1/4] sheep: reduce the size of join message

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Thu Oct 20 18:48:09 CEST 2011


At Thu, 20 Oct 2011 21:46:35 +0800,
Liu Yuan wrote:
> 
> On 10/20/2011 07:33 PM, MORITA Kazutaka wrote:
> 
> > Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
> > ---
> >  sheep/group.c |   51 ++++++++++++++++++++++++++++++++++-----------------
> >  1 files changed, 34 insertions(+), 17 deletions(-)
> > 
> > diff --git a/sheep/group.c b/sheep/group.c
> > index 7e4531d..04fec41 100644
> > --- a/sheep/group.c
> > +++ b/sheep/group.c
> > @@ -49,8 +49,8 @@ struct join_message {
> >  	uint8_t inc_epoch; /* set non-zero when we increment epoch of all nodes */
> >  	uint8_t pad[3];
> >  	union {
> > -		struct sheepdog_node_list_entry nodes[SD_MAX_NODES];
> > -		struct sheepdog_node_list_entry leave_nodes[SD_MAX_NODES];
> > +		struct sheepdog_node_list_entry nodes[0];
> > +		struct sheepdog_node_list_entry leave_nodes[0];
> 
> >  	};
> >  };
> >  
> > @@ -74,7 +74,7 @@ struct work_join {
> >  	size_t member_list_entries;
> >  	struct sheepdog_node_list_entry joined;
> >  
> > -	struct join_message jm;
> > +	struct join_message *jm;
> >  };
> >  
> >  struct work_leave {
> > @@ -100,6 +100,13 @@ struct work_leave {
> >  
> >  static int cpg_event_running;
> >  
> > +static size_t get_join_message_size(struct join_message *jm)
> > +{
> > +	/* jm->nr_nodes is always larger than jm->nr_leave_nodes, so
> > +	 * it is safe to use jm->nr_nodes. */
> > +	return sizeof(*jm) + jm->nr_nodes * sizeof(jm->nodes[0]);
> > +}
> > +
> >  static int get_node_idx(struct sheepdog_node_list_entry *ent,
> >  			struct sheepdog_node_list_entry *entries, int nr_nodes)
> >  {
> > @@ -863,7 +870,7 @@ static int check_majority(struct sheepdog_node_list_entry *nodes, int nr_nodes)
> >  static void __sd_join(struct cpg_event *cevent)
> >  {
> >  	struct work_join *w = container_of(cevent, struct work_join, cev);
> > -	struct join_message *msg = &w->jm;
> > +	struct join_message *msg = w->jm;
> >  	int i;
> >  
> >  	if (msg->cluster_status != SD_STATUS_OK)
> > @@ -953,23 +960,29 @@ static enum cluster_join_result sd_check_join_cb(
> >  
> >  static int send_join_request(struct sheepdog_node_list_entry *ent)
> >  {
> > -	struct join_message msg;
> > +	struct join_message *msg;
> >  	int nr_entries, ret;
> >  
> > -	memset(&msg, 0, sizeof(msg));
> > -	msg.header.proto_ver = SD_SHEEP_PROTO_VER;
> > -	msg.header.msg_length = sizeof(msg);
> > -	msg.header.from = *ent;
> > +	msg = zalloc(sizeof(*msg) * SD_MAX_NODES * sizeof(msg->nodes[0]));
> 
> 
> zalloc(sizeof(*msg) + ...) ?

Oops, yes, thanks for the catch!

Kazutaka



More information about the sheepdog mailing list