Alexander Aring 986ae3c2a8 dlm: fix race between final callback and remove
This patch fixes the following issue:

node 1 is dir
node 2 is master
node 3 is other

1->2: unlock
2: put final lkb, rsb moved to toss
2->1: unlock_reply
1: queue lkb callback with EUNLOCK
2->1: remove
1: receive_remove ignored (rsb on keep because of queued lkb callback)
1: complete lkb callback, put_lkb, move rsb to toss
3->1: lookup
1->3: lookup_reply master=2
3->2: request
2->3: request_reply EBADR

In summary:
An unexpected lkb reference causes the rsb to remain on the wrong list.
The rsb being on the wrong list causes receive_remove to be ignored.
An ignored receive_remove causes inconsistent dir and master state.

This sequence requires an unusually long delay in delivering the unlock
callback, because the remove message from 2->1 usually happens after
some seconds.  So, it's not known exactly how frequently this sequence
occurs in pratice.  It's possible that the same end result could also
have another unknown cause.

The solution for this issue is to further separate callback state
from the lkb, so that an lkb reference (and from that, an rsb ref)
are not held while a callback remains queued.  Then, within the
unlock_reply, the lkb will be freed and the rsb moved to the toss
list. So, the receive_remove will not be ignored.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>
2024-04-01 13:31:12 -05:00
..
2024-01-11 20:11:35 -08:00
2024-03-19 17:27:25 -07:00
2024-03-27 13:56:41 -07:00
2024-02-25 12:05:21 +01:00
2024-03-12 13:17:36 -07:00
2024-03-21 09:47:12 -07:00
\n
2024-03-13 14:30:58 -07:00
2024-03-18 11:26:00 -07:00
2024-03-15 09:47:14 -07:00
2024-03-25 10:53:39 -07:00
2023-12-29 11:58:34 -08:00
2024-03-11 09:38:17 -07:00
2024-03-11 09:38:17 -07:00
2024-03-04 18:35:21 +01:00
\n
2024-03-13 14:30:58 -07:00
2024-03-21 13:34:15 -07:00
2024-03-12 14:27:37 -07:00
2024-03-16 11:44:00 -07:00
2024-03-28 14:35:32 -07:00
\n
2024-03-13 14:30:58 -07:00
2024-03-11 10:52:34 -07:00
2024-03-12 17:44:08 -07:00
2024-03-25 10:21:01 +05:30
2024-03-12 20:03:34 -07:00
2024-03-11 10:07:03 -07:00
2024-03-06 10:52:12 +01:00
2024-03-11 09:38:17 -07:00
2024-03-12 17:44:08 -07:00
2024-03-27 09:57:30 -07:00
2024-03-11 10:07:03 -07:00
2024-03-12 20:03:34 -07:00
2023-12-12 14:24:14 +01:00
2024-03-15 09:00:09 -07:00
2024-03-13 12:53:53 -07:00
2024-02-12 13:13:59 +01:00
2024-03-13 12:53:53 -07:00
2024-03-11 10:21:06 -07:00
2024-03-12 20:03:34 -07:00
2024-03-13 12:53:53 -07:00
2024-03-12 20:03:34 -07:00
2024-03-13 12:53:53 -07:00
2024-02-02 13:11:49 +01:00
2024-03-12 20:03:34 -07:00
2024-01-08 10:57:34 -08:00
2024-03-18 10:32:44 +01:00
2024-02-15 23:43:47 -05:00