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]

Reply via email to