Race condition problme in AbstractZkLedgerManager
- Dominant language
- Java
- Stars
- 2k
- Forks
- 976
- Avg merge
- 6d 15h
- Merged PRs (30d)
- 7
Description
**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)
Contributor guide
Assessment
This issue has not been assessed yet.