[Drbd-dev] [PATCH] drbd: Ignore negotiation result with the peer who is also negotiating

Zhang Duan duan.zhang at easystack.cn
Mon Mar 2 13:31:59 CET 2020


We have a test on 3 nodes cluster in which the primary is uptodate and 
the other two secondary
is diskless by doing drbdadm detach. Then after doing drbdadm attach on 
the two secondary at
the same time, one status hangs at NEGOTIATING while another hangs at 
ATTACHING.

That is because if a negotiating peer receives another's 
wide-cluster-change from DISKLESS to
NEGOTIATING, it will reject it due to more than one negotiation 
throughout the cluster, but the
new disk state of that node remains NEGOTIATING after a failed state 
change. Then neither of
two peers can get a negotiating result what they want.

Signed-off-by: ZhangDuan
---
drbd/drbd_state.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drbd/drbd_state.c b/drbd/drbd_state.c
index c919d759..85910f1e 100644
--- a/drbd/drbd_state.c
+++ b/drbd/drbd_state.c
@@ -1835,8 +1835,10 @@ static void sanitize_state(struct drbd_resource 
*resource)
for_each_peer_device_rcu(peer_device, device) {
enum drbd_repl_state nr = peer_device->negotiation_result;
enum drbd_disk_state pdsk = peer_device->disk_state[NEW];
+ enum drbd_disk_state pdsk_old = peer_device->disk_state[OLD];

- if (pdsk == D_UNKNOWN || pdsk < D_NEGOTIATING)
+ if ((pdsk == D_UNKNOWN || pdsk < D_NEGOTIATING) ||
+ (pdsk_old < D_NEGOTIATING && pdsk == D_NEGOTIATING))
continue;

if (pdsk == D_UP_TO_DATE)
-- 
2.24.0.windows.2

-- 
Sincerely Yours,
Zhang Duan

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linbit.com/pipermail/drbd-dev/attachments/20200302/684d703c/attachment.htm>


More information about the drbd-dev mailing list