poorbarcode commented on PR #4462: URL: https://github.com/apache/bookkeeper/pull/4462#issuecomment-2217174727
> Is there contains Race Condition between deleteLedger and getHandle with same ledgerId. cc @eolivelli @nicoloboschi There is no race condition issue. See details below There are two thread safety maps: `ledgers` and `recentlyFencedAndDeletedLedgers` - `OPS: deleteLedger` adds ledger to `recentlyFencedAndDeletedLedgers` first, then removes ledger from `ledgers`. - `OPS: getHandle` get ledger from `ledgers` first, then get ledger from `recentlyFencedAndDeletedLedgers` --- **Scenario 1** | `getHandle` | `deleteLedger` | | --- | --- | | `write`: get an existing handle | | | fence | | | `delete ledger`: add ledger into `recentlyFencedAndDeletedLedgers` | | `write`: get an existing handle(which is fenced), client will get a fenced error | | | `delete ledger`: remove ledger from `ledgers` | --- **Scenario 2** | `getHandle` | `deleteLedger` | | --- | --- | | `write`: get an existing handle | | | fence | | `write`: get an existing handle(which is fenced), client will get a fenced error | | | `delete ledger`: add ledger into `recentlyFencedAndDeletedLedgers` | | | `delete ledger`: remove ledger from `ledgers` | --- **Scenario 3** | `getHandle` | `deleteLedger` | | --- | --- | | `write`: get an existing handle | | | fence | | | `delete ledger`: add ledger into `recentlyFencedAndDeletedLedgers` | | | `delete ledger`: remove ledger from `ledgers` | | `write`: get an error since it is in `recentlyFencedAndDeletedLedgers` | --- **Scenario 4** | `getHandle` | `deleteLedger` | | --- | --- | | | fence | | `write`: get an existing handle(which is fenced), client will get a fenced error | | | `delete ledger`: add ledger into `recentlyFencedAndDeletedLedgers` | | | `delete ledger`: remove ledger from `ledgers` | --- **Scenario 5** | `getHandle` | `deleteLedger` | | --- | --- | | `write: get handle`: get an existing handle | | | fence | | | `delete ledger`: add ledger into `recentlyFencedAndDeletedLedgers` | | | `delete ledger`: remove ledger from `ledgers` | | `write: do write`: update LAC | **Scenario 5 additional note**: Since `getHandle` and `deleteLedger` execute at the same thread, this scenario will not occur. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
