drbd: Delayed creation of current-UUID
When a fencing policy of "resource-and-stonith" is configured, and DRBD looses connection to it's peer, we can delay the creation of a new current-UUID until IO gets thawed. That allows one to deploy fence-peer handlers that actually commit suicide on the machine they get started. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
87f7be4cf8
commit
43a5182ccc
3 changed files with 27 additions and 6 deletions
|
@ -829,6 +829,7 @@ enum {
|
|||
* the peer, if it changed there as well. */
|
||||
CONN_DRY_RUN, /* Expect disconnect after resync handshake. */
|
||||
GOT_PING_ACK, /* set when we receive a ping_ack packet, misc wait gets woken */
|
||||
NEW_CUR_UUID, /* Create new current UUID when thawing IO */
|
||||
};
|
||||
|
||||
struct drbd_bitmap; /* opaque for drbd_conf */
|
||||
|
|
|
@ -1252,15 +1252,26 @@ static void after_state_ch(struct drbd_conf *mdev, union drbd_state os,
|
|||
}
|
||||
|
||||
if (fp == FP_STONITH && ns.susp) {
|
||||
/* case1: The outdate peer handler is successful:
|
||||
* case2: The connection was established again: */
|
||||
if ((os.pdsk > D_OUTDATED && ns.pdsk <= D_OUTDATED) ||
|
||||
(os.conn < C_CONNECTED && ns.conn >= C_CONNECTED)) {
|
||||
/* case1: The outdate peer handler is successful: */
|
||||
if (os.pdsk > D_OUTDATED && ns.pdsk <= D_OUTDATED) {
|
||||
tl_clear(mdev);
|
||||
if (test_bit(NEW_CUR_UUID, &mdev->flags)) {
|
||||
drbd_uuid_new_current(mdev);
|
||||
clear_bit(NEW_CUR_UUID, &mdev->flags);
|
||||
drbd_md_sync(mdev);
|
||||
}
|
||||
spin_lock_irq(&mdev->req_lock);
|
||||
_drbd_set_state(_NS(mdev, susp, 0), CS_VERBOSE, NULL);
|
||||
spin_unlock_irq(&mdev->req_lock);
|
||||
}
|
||||
/* case2: The connection was established again: */
|
||||
if (os.conn < C_CONNECTED && ns.conn >= C_CONNECTED) {
|
||||
clear_bit(NEW_CUR_UUID, &mdev->flags);
|
||||
spin_lock_irq(&mdev->req_lock);
|
||||
_tl_restart(mdev, resend);
|
||||
_drbd_set_state(_NS(mdev, susp, 0), CS_VERBOSE, NULL);
|
||||
spin_unlock_irq(&mdev->req_lock);
|
||||
}
|
||||
}
|
||||
/* Do not change the order of the if above and the two below... */
|
||||
if (os.pdsk == D_DISKLESS && ns.pdsk > D_DISKLESS) { /* attach on the peer */
|
||||
|
@ -1280,8 +1291,12 @@ static void after_state_ch(struct drbd_conf *mdev, union drbd_state os,
|
|||
if (get_ldev(mdev)) {
|
||||
if ((ns.role == R_PRIMARY || ns.peer == R_PRIMARY) &&
|
||||
mdev->ldev->md.uuid[UI_BITMAP] == 0 && ns.disk >= D_UP_TO_DATE) {
|
||||
drbd_uuid_new_current(mdev);
|
||||
drbd_send_uuids(mdev);
|
||||
if (mdev->state.susp) {
|
||||
set_bit(NEW_CUR_UUID, &mdev->flags);
|
||||
} else {
|
||||
drbd_uuid_new_current(mdev);
|
||||
drbd_send_uuids(mdev);
|
||||
}
|
||||
}
|
||||
put_ldev(mdev);
|
||||
}
|
||||
|
|
|
@ -1810,6 +1810,11 @@ static int drbd_nl_suspend_io(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nl
|
|||
static int drbd_nl_resume_io(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp,
|
||||
struct drbd_nl_cfg_reply *reply)
|
||||
{
|
||||
if (test_bit(NEW_CUR_UUID, &mdev->flags)) {
|
||||
drbd_uuid_new_current(mdev);
|
||||
clear_bit(NEW_CUR_UUID, &mdev->flags);
|
||||
drbd_md_sync(mdev);
|
||||
}
|
||||
drbd_suspend_io(mdev);
|
||||
reply->ret_code = drbd_request_state(mdev, NS(susp, 0));
|
||||
if (reply->ret_code == SS_SUCCESS) {
|
||||
|
|
Reference in a new issue