bookkeeper icon indicating copy to clipboard operation
bookkeeper copied to clipboard

Race condition problme in AbstractZkLedgerManager

Open horizonzy opened this issue 3 years ago • 0 comments

BUG REPORT

There are two methods in AbstractZkLedgerManager.

  1. registerLedgerMetadataListener https://github.com/apache/bookkeeper/blob/677ccec3eb84f5be1b3556537871e14eb5e8359c/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java#L389-L409

  2. 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)

horizonzy avatar Jun 25 '22 08:06 horizonzy