All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Ren <zren@suse.com>
To: ocfs2-devel@oss.oracle.com
Subject: [Ocfs2-devel] [PATCH 2/6] ocfs2: o2hb: add NEGO_TIMEOUT message
Date: Mon, 25 Jan 2016 11:18:56 +0800	[thread overview]
Message-ID: <20160125031855.GA7746@laptop.ha> (raw)
In-Reply-To: <1453259619-5347-3-git-send-email-junxiao.bi@oracle.com>

On Wed, Jan 20, 2016 at 11:13:35AM +0800, Junxiao Bi wrote: 
> This message is sent to master node when non-master nodes's
> negotiate timer expired. Master node records these nodes in
> a bitmap which is used to do write timeout timer re-queue
> decision.
> 
> Signed-off-by: Junxiao Bi <junxiao.bi@oracle.com>
> Reviewed-by: Ryan Ding <ryan.ding@oracle.com>
> ---
>  fs/ocfs2/cluster/heartbeat.c |   66 +++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 65 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c
> index b601ee95de50..ecf8a5e21c38 100644
> --- a/fs/ocfs2/cluster/heartbeat.c
> +++ b/fs/ocfs2/cluster/heartbeat.c
> @@ -280,6 +280,10 @@ struct o2hb_region {
>  	 * being checked because we temporarily have to zero out the
>  	 * crc field. */
>  	struct o2hb_disk_heartbeat_block *hr_tmp_block;
> +
> +	/* Message key for negotiate timeout message. */
> +	unsigned int		hr_key;
> +	struct list_head	hr_handler_list;
>  };
>  
>  struct o2hb_bio_wait_ctxt {
> @@ -288,6 +292,14 @@ struct o2hb_bio_wait_ctxt {
>  	int               wc_error;
>  };
>  
> +enum {
> +	O2HB_NEGO_TIMEOUT_MSG = 1,
> +};
> +
> +struct o2hb_nego_msg {
> +	u8 node_num;
> +};
> +
>  static void o2hb_write_timeout(struct work_struct *work)
>  {
>  	int failed, quorum;
> @@ -356,6 +368,24 @@ static void o2hb_disarm_timeout(struct o2hb_region *reg)
>  	cancel_delayed_work_sync(&reg->hr_nego_timeout_work);
>  }
>  
> +static int o2hb_send_nego_msg(int key, int type, u8 target)
> +{
> +	struct o2hb_nego_msg msg;
> +	int status, ret;
> +
> +	msg.node_num = o2nm_this_node();
> +again:
> +	ret = o2net_send_message(type, key, &msg, sizeof(msg),
> +			target, &status);
> +
> +	if (ret == -EAGAIN || ret == -ENOMEM) {
> +		msleep(100);
> +		goto again;
> +	}
> +
> +	return ret;
> +}
> +
>  static void o2hb_nego_timeout(struct work_struct *work)
>  {
>  	struct o2hb_region *reg =
> @@ -384,8 +414,24 @@ static void o2hb_nego_timeout(struct work_struct *work)
>  		/* approve negotiate timeout request. */
>  	} else {
>  		/* negotiate timeout with master node. */
> +		o2hb_send_nego_msg(reg->hr_key, O2HB_NEGO_TIMEOUT_MSG,
> +			master_node);
>  	}
> +}
> +
> +static int o2hb_nego_timeout_handler(struct o2net_msg *msg, u32 len, void *data,
> +				void **ret_data)
> +{
> +	struct o2hb_region *reg = (struct o2hb_region *)data;
> +	struct o2hb_nego_msg *nego_msg;
>  
> +	nego_msg = (struct o2hb_nego_msg *)msg->buf;
> +	if (nego_msg->node_num < O2NM_MAX_NODES)
> +		set_bit(nego_msg->node_num, reg->hr_nego_node_bitmap);
> +	else
> +		mlog(ML_ERROR, "got nego timeout message from bad node.\n");
> +
> +	return 0;
>  }
>  
>  static inline void o2hb_bio_wait_init(struct o2hb_bio_wait_ctxt *wc)
> @@ -1493,6 +1539,7 @@ static void o2hb_region_release(struct config_item *item)
>  	list_del(&reg->hr_all_item);
>  	spin_unlock(&o2hb_live_lock);
>  
> +	o2net_unregister_handler_list(&reg->hr_handler_list);
>  	kfree(reg);
>  }
>  
> @@ -2039,13 +2086,30 @@ static struct config_item *o2hb_heartbeat_group_make_item(struct config_group *g
>  
>  	config_item_init_type_name(&reg->hr_item, name, &o2hb_region_type);
>  
> +	/* this is the same way to generate msg key as dlm, for local heartbeat,
> +	 * name is also the same, so make initial crc value different to avoid
> +	 * message key conflict.
> +	 */
> +	reg->hr_key = crc32_le(reg->hr_region_num + O2NM_MAX_REGIONS,
> +		name, strlen(name));
> +	INIT_LIST_HEAD(&reg->hr_handler_list);

Looks no need to initilize ->hr_handler_list here?

Thanks,
Eric
> +	ret = o2net_register_handler(O2HB_NEGO_TIMEOUT_MSG, reg->hr_key,
> +			sizeof(struct o2hb_nego_msg),
> +			o2hb_nego_timeout_handler,
> +			reg, NULL, &reg->hr_handler_list);
> +	if (ret)
> +		goto free;
> +
>  	ret = o2hb_debug_region_init(reg, o2hb_debug_dir);
>  	if (ret) {
>  		config_item_put(&reg->hr_item);
> -		goto free;
> +		goto free_handler;
>  	}
>  
>  	return &reg->hr_item;
> +
> +free_handler:
> +	o2net_unregister_handler_list(&reg->hr_handler_list);
>  free:
>  	kfree(reg);
>  	return ERR_PTR(ret);
> -- 
> 1.7.9.5
> 
> 
> _______________________________________________
> Ocfs2-devel mailing list
> Ocfs2-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/ocfs2-devel
> 

  parent reply	other threads:[~2016-01-25  3:18 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-20  3:13 [Ocfs2-devel] ocfs2: o2hb: not fence self if storage down Junxiao Bi
2016-01-20  3:13 ` [Ocfs2-devel] [PATCH 1/6] ocfs2: o2hb: add negotiate timer Junxiao Bi
2016-01-21 23:42   ` Andrew Morton
2016-01-22  3:23     ` Junxiao Bi
2016-01-22  0:56   ` Joseph Qi
2016-01-22  3:19     ` Junxiao Bi
2016-01-20  3:13 ` [Ocfs2-devel] [PATCH 2/6] ocfs2: o2hb: add NEGO_TIMEOUT message Junxiao Bi
2016-01-21 23:47   ` Andrew Morton
2016-01-22  5:12     ` Junxiao Bi
2016-01-22  5:45       ` Andrew Morton
2016-01-22  5:46         ` Junxiao Bi
2016-01-25  3:18   ` Eric Ren [this message]
2016-01-25  4:28     ` Junxiao Bi
2016-01-25  5:59       ` Eric Ren
2016-01-20  3:13 ` [Ocfs2-devel] [PATCH 3/6] ocfs2: o2hb: add NEGOTIATE_APPROVE message Junxiao Bi
2016-01-20  3:13 ` [Ocfs2-devel] [PATCH 4/6] ocfs2: o2hb: add some user/debug log Junxiao Bi
2016-01-25  3:28   ` Eric Ren
2016-01-25  4:29     ` Junxiao Bi
2016-01-25  6:00       ` Eric Ren
2016-01-20  3:13 ` [Ocfs2-devel] [PATCH 5/6] ocfs2: o2hb: don't negotiate if last hb fail Junxiao Bi
2016-01-20  3:13 ` [Ocfs2-devel] [PATCH 6/6] ocfs2: o2hb: fix hb hung time Junxiao Bi
2016-01-20  6:00 ` [Ocfs2-devel] ocfs2: o2hb: not fence self if storage down Gang He
2016-01-20  8:09   ` Junxiao Bi
2016-01-20  9:18 ` Joseph Qi
2016-01-20 13:27   ` Junxiao Bi
2016-01-21  0:46     ` Joseph Qi
2016-01-21  1:48       ` Junxiao Bi
2016-01-22  4:25         ` Joseph Qi
2016-01-22  5:08           ` Junxiao Bi
2016-01-21  8:34 ` rwxybh
2016-01-21  8:41   ` Junxiao Bi
  -- strict thread matches above, loose matches on Subject: below --
2016-05-23 21:50 [Ocfs2-devel] [patch 2/6] ocfs2: o2hb: add NEGO_TIMEOUT message akpm at linux-foundation.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160125031855.GA7746@laptop.ha \
    --to=zren@suse.com \
    --cc=ocfs2-devel@oss.oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.