From: Philipp Reisner <philipp.reisner@linbit.com>
To: drbd-dev@lists.linbit.com
Cc: "Montrose, Ernest" <Ernest.Montrose@stratus.com>
Subject: Re: [Drbd-dev] DRBD8: incorrect state transition Connected ->WFBitMapS and UpToDate->Inconsistent
Date: Thu, 15 Nov 2007 17:27:05 +0100 [thread overview]
Message-ID: <200711151727.05736.philipp.reisner@linbit.com> (raw)
In-Reply-To: <BD7042533C2F8943A6A4257A9E31C454F47A31@EXNA.corp.stratus.com>
[-- Attachment #1: Type: text/plain, Size: 2310 bytes --]
On Monday 12 November 2007 14:41:10 Montrose, Ernest wrote:
> Hi,
> We have been struggling with a problem where one side gets stuck in
> WFBitMapS and Inconsistent State. Consider two nodes (Node0 and node1).
>
>
> * Device r5 on node0 starts syncing as the synctarget.
> * Device r5 is done syncing and on node0 we call drbd_resync_finished()
> this gets delayed for a bit in drbd_rs_del_all()
> * During this delay, device R0 wants to resync. So the lower priority
> devices like R5 gets paused. This is were the trouble starts.
Right. But Something else happens...
[...]
> Oct 4 14:56:01 node0 kernel: drbd60: Syncer continues.
> Oct 4 14:56:01 node0 kernel: drbd60: ASSERT(
> !test_bit(STOP_SYNC_TIMER,&mdev->flags) ) in
> /sandbox/sgraham/sn/trunk/platform/drbd/src/drbd/drbd_main.c:786
That assert caught my attention, and this is my understanding what
went wrong...
r5 was already finished with its resync timer and calling
w_make_resync_request(), but due to the continue event after the
pause the timer got restarted...
Unfortunately the drbd_bm_find_next() searched through all the
bitmap and found those bits near the end that where not yet
cleared, and so resync requests where resent...
Therefore...
[...]
> Oct 4 14:56:09 node0 kernel: drbd60: Resync done (total 2 sec; paused 0
> sec; 384 K/sec)
[...]
> Oct 4 14:56:09 node0 kernel: drbd60: Resync done (total 2 sec; paused 0
> sec; 0 K/sec)
> Oct 4 14:56:09 node0 kernel: drbd60: Resync done (total 2 sec; paused 0
> sec; 0 K/sec)
> Oct 4 14:56:09 node0 kernel: drbd60: Connected in w_make_resync_request
> Oct 4 14:56:09 node0 kernel: drbd60: Resync done (total 2 sec; paused 0
> sec; 0 K/sec)
... we got multiple calls to drbd_resync_finished().
Here is my suggestion to fix that.
1) Do not restart the timer after a syncpause, when the timer is no
longer needed.
2) To make the whole thing more robust against such bugs,
drbd_bm_find_next() should not reset the find_offset back to 0
after it hit the end of the bitmap once.
I have not tested it.... but I think this should do...
-Phil
--
: Dipl-Ing Philipp Reisner Tel +43-1-8178292-50 :
: LINBIT Information Technologies GmbH Fax +43-1-8178292-82 :
: Vivenotgasse 48, 1120 Vienna, Austria http://www.linbit.com :
[-- Attachment #2: Wbimaps_stuck_phil.patch --]
[-- Type: text/x-diff, Size: 1136 bytes --]
diff --git a/drbd/drbd_bitmap.c b/drbd/drbd_bitmap.c
index 015421a..7e118a6 100644
--- a/drbd/drbd_bitmap.c
+++ b/drbd/drbd_bitmap.c
@@ -954,7 +954,7 @@ unsigned long drbd_bm_find_next(drbd_dev *mdev)
}
if (i >= b->bm_bits) {
i = -1UL;
- b->bm_fo = 0;
+ /* leave b->bm_fo unchanged. */
} else {
b->bm_fo = i+1;
}
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
index fe8f66d..e25bb3a 100644
--- a/drbd/drbd_main.c
+++ b/drbd/drbd_main.c
@@ -786,9 +786,13 @@ int _drbd_set_state(drbd_dev* mdev, drbd_state_t ns,enum chg_state_flags flags)
INFO("Syncer continues.\n");
mdev->rs_paused += (long)jiffies-(long)mdev->rs_mark_time;
if( ns.conn == SyncTarget ) {
- D_ASSERT(!test_bit(STOP_SYNC_TIMER,&mdev->flags));
- clear_bit(STOP_SYNC_TIMER,&mdev->flags);
- mod_timer(&mdev->resync_timer,jiffies);
+ if (!test_bit(STOP_SYNC_TIMER,&mdev->flags)) {
+ mod_timer(&mdev->resync_timer,jiffies);
+ }
+ /* This if (!test_bit is only needed for the case
+ that a device that has ceased to used its timer,
+ i.e. it is already in drbd_resync_finished() gets
+ paused and resumed. */
}
}
next prev parent reply other threads:[~2007-11-15 16:27 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-07 3:54 [Drbd-dev] Handling on-disk caches Graham, Simon
2007-11-07 14:03 ` Lars Ellenberg
2007-11-07 14:16 ` Graham, Simon
2007-11-12 12:39 ` Philipp Reisner
2007-11-12 13:41 ` [Drbd-dev] DRBD8: incorrect state transition Connected ->WFBitMapS and UpToDate->Inconsistent Montrose, Ernest
2007-11-15 16:27 ` Philipp Reisner [this message]
2007-11-16 2:36 ` Ernest Montrose
2007-11-26 14:31 ` Philipp Reisner
2007-11-26 14:43 ` Montrose, Ernest
2007-11-26 15:09 ` Philipp Reisner
2007-11-30 0:01 ` Montrose, Ernest
2007-11-12 15:59 ` [Drbd-dev] Handling on-disk caches Graham, Simon
2007-11-12 16:24 ` Philipp Reisner
[not found] ` <BD7042533C2F8943A6A4257A9E31C454F47A31@EXNA.corp.str atus.com>
2007-11-15 16:34 ` [Drbd-dev] DRBD8: incorrect state transition Connected->WFBitMapS and UpToDate->Inconsistent Montrose, Ernest
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=200711151727.05736.philipp.reisner@linbit.com \
--to=philipp.reisner@linbit.com \
--cc=Ernest.Montrose@stratus.com \
--cc=drbd-dev@lists.linbit.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