[Drbd-dev] [PATCH] drbd: Ignore negotiation result with the peer who is also negotiating
Dongsheng Yang
dongsheng.yang at easystack.cn
Tue Mar 3 02:29:49 CET 2020
Hi Philipp,
What's your opinion on this patch?
Thanx
Yang
在 3/2/2020 8:31 PM, Zhang Duan 写道:
>
>
> 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
More information about the drbd-dev
mailing list