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(®->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(®->hr_all_item);
> spin_unlock(&o2hb_live_lock);
>
> + o2net_unregister_handler_list(®->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(®->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(®->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, ®->hr_handler_list);
> + if (ret)
> + goto free;
> +
> ret = o2hb_debug_region_init(reg, o2hb_debug_dir);
> if (ret) {
> config_item_put(®->hr_item);
> - goto free;
> + goto free_handler;
> }
>
> return ®->hr_item;
> +
> +free_handler:
> + o2net_unregister_handler_list(®->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
>
next prev 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).