Race condition problme in AbstractZkLedgerManager
BUG REPORT
There are two methods in AbstractZkLedgerManager.
-
registerLedgerMetadataListener https://github.com/apache/bookkeeper/blob/677ccec3eb84f5be1b3556537871e14eb5e8359c/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java#L389-L409
-
unregisterLedgerMetadataListener https://github.com/apache/bookkeeper/blob/677ccec3eb84f5be1b3556537871e14eb5e8359c/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java#L412-L426
The initial data listeners: 1: watcherSet(watcher1)
Thread one: doing unregisterLedgerMetadataListener, it unregister (1, watcher1) It get watcherSet and remove watcher1, the watcherSet is empty, then remove index ledger 1.
Thread two: doing registerLedgerMetadataListener, it register (1, watcher2)
At the same time, thread one not remove index ledger 1. thread two get same watcherSet and wait thread one remove watcher1 and remove index ledger 1. Then add watcher2 to this watcherSet which already not be indexed.
Final Result listeners: emptyMap
Expected Result listeners: 1: watcherSet(watcher2)