From 418cd46e033da83695b873a842f44abe7db0571f Mon Sep 17 00:00:00 2001 From: Simon P. Graham Date: Fri, 12 Sep 2008 10:41:49 -0400 Subject: [PATCH] Better handling of losing connection in primary/inconsistent state 1. Dont create a new UUID if primary/insonsistent when connection dropped 2. Allow connection to be established even if remote side has a different UUID - our data is useless anyway. --- drbd/drbd_main.c | 1 + drbd/drbd_nl.c | 1 + drbd/drbd_receiver.c | 2 +- 3 files changed, 3 insertions(+), 1 deletions(-) diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c index 3d45907..4c396f2 100644 --- a/drbd/drbd_main.c +++ b/drbd/drbd_main.c @@ -1078,6 +1078,7 @@ static void after_state_ch(struct drbd_conf *mdev, union drbd_state_t os, if (inc_local(mdev)) { /* generate new uuid, unless we did already */ if (ns.role == Primary && + ns.disk >= Consistent && mdev->bc->md.uuid[Bitmap] == 0) drbd_uuid_new_current(mdev); if (ns.peer == Primary) { diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c index 3c76edc..ddb33f2 100644 --- a/drbd/drbd_nl.c +++ b/drbd/drbd_nl.c @@ -360,6 +360,7 @@ int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role, int force) if (inc_local(mdev)) { if ( ((mdev->state.conn < Connected || mdev->state.pdsk <= Failed) + && mdev->state.disk >= Consistent && mdev->bc->md.uuid[Bitmap] == 0) || forced) drbd_uuid_new_current(mdev); diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c index c619c7a..5d38552 100644 --- a/drbd/drbd_receiver.c +++ b/drbd/drbd_receiver.c @@ -2454,7 +2454,7 @@ STATIC int receive_uuids(struct drbd_conf *mdev, struct Drbd_Header *h) mdev->p_uuid = p_uuid; if (mdev->state.conn < Connected && - mdev->state.disk < Outdated && + mdev->state.disk <= Negotiating && mdev->state.role == Primary && (mdev->ed_uuid & ~((u64)1)) != (p_uuid[Current] & ~((u64)1))) { ERR("Can only connect to data with current UUID=%016llX\n", -- 1.5.4-rc1.GIT