[ https://issues.apache.org/jira/browse/BOOKKEEPER-400?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13454069#comment-13454069 ]
Sijie Guo commented on BOOKKEEPER-400: -------------------------------------- Did an investigate the attached log, I found the issue caused by race condition between LedgerHandler#sendAddSuccessCallbacks and LedgerHandler#unsetSuccessAndSendWriteRequest on pendingAddOps and lastAddConfirmed. in sendAddSuccessCallbacks, it is peeking the succeed ops from pendingAddOps and change the state; while unsetSuccessAndSendWriteRequest is unsetting bookie index for all pendingAddOps. the race happens as below: 1) thread 1 changes ensemble starting with entry 2928 (from the attached log). 2) thread 2 sendAddSuccessCallbacks, which remove those succeed add ops. and it happens to that add ops before (include) 2935 has succeed and removed. 3) thread 1 finished changed ensemble and started to unsetting bookie index to reissue write requests. but thread 2 has been removed those succeed add ops. 2935 would not be reissued. 4) ensemble continue changed to replace those bookies owned entry 2935. Let me explain the details using the log as below: first, all the ensemble changes for ledger 338547, its corresponding unsetting entry 2935 and its corresponding responses of add entry 2935 requests are listed as below: {code} 2012-09-06 00:14:28,054 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host1:3181, /host12:3181, /host4:3181, /host6:3181] to: [/host1:3181, /host12:3181, /host11:3181, /host6:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:14:32,340 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host1:3181, /host12:3181, /host11:3181, /host6:3181] to: [/host1:3181, /host4:3181, /host11:3181, /host6:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:14:38,972 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host1:3181, /host4:3181, /host11:3181, /host6:3181] to: [/host1:3181, /host12:3181, /host11:3181, /host6:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:14:46,028 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host1:3181, /host12:3181, /host11:3181, /host6:3181] to: [/host1:3181, /host12:3181, /host2:3181, /host6:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:14:46,209 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host1:3181, /host12:3181, /host2:3181, /host6:3181] to: [/host9:3181, /host12:3181, /host2:3181, /host6:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:14:46,562 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host9:3181, /host12:3181, /host2:3181, /host6:3181] to: [/host9:3181, /host12:3181, /host2:3181, /host13:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:15:02,114 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host9:3181, /host12:3181, /host2:3181, /host13:3181] to: [/host9:3181, /host15:3181, /host2:3181, /host13:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:15:39,033 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host9:3181, /host15:3181, /host2:3181, /host13:3181] to: [/host9:3181, /host15:3181, /host2:3181, /host14:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:16:48,536 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host9:3181, /host15:3181, /host2:3181, /host14:3181] to: [/host9:3181, /host15:3181, /host12:3181, /host14:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:17:53,879 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host9:3181, /host15:3181, /host12:3181, /host14:3181] to: [/host9:3181, /host6:3181, /host12:3181, /host14:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:18:16,414 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host9:3181, /host6:3181, /host12:3181, /host14:3181] to: [/host9:3181, /host6:3181, /host12:3181, /host1:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:19:29,124 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host9:3181, /host6:3181, /host12:3181, /host1:3181] to: [/host9:3181, /host6:3181, /host13:3181, /host1:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:19:46,677 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host9:3181, /host6:3181, /host13:3181, /host1:3181] to: [/host9:3181, /host10:3181, /host13:3181, /host1:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:20:00,353 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host9:3181, /host10:3181, /host13:3181, /host1:3181] to: [/host9:3181, /host10:3181, /host13:3181, /host12:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:21:34,421 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host9:3181, /host10:3181, /host13:3181, /host12:3181] to: [/host9:3181, /host10:3181, /host2:3181, /host12:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:21:57,198 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host9:3181, /host10:3181, /host2:3181, /host12:3181] to: [/host9:3181, /host15:3181, /host2:3181, /host12:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:22:05,976 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host9:3181, /host15:3181, /host2:3181, /host12:3181] to: [/host7:3181, /host15:3181, /host2:3181, /host12:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:23:08,017 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host7:3181, /host15:3181, /host2:3181, /host12:3181] to: [/host7:3181, /host15:3181, /host3:3181, /host12:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:23:14,031 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host7:3181, /host15:3181, /host3:3181, /host12:3181] to: [/host7:3181, /host9:3181, /host3:3181, /host12:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:23:54,151 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host7:3181, /host9:3181, /host3:3181, /host12:3181] to: [/host2:3181, /host9:3181, /host3:3181, /host12:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:25:29,636 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host2:3181, /host9:3181, /host3:3181, /host12:3181] to: [/host1:3181, /host9:3181, /host3:3181, /host12:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:25:52,955 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host1:3181, /host9:3181, /host3:3181, /host12:3181] to: [/host1:3181, /host9:3181, /host3:3181, /host6:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:25:57,846 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host1:3181, /host9:3181, /host3:3181, /host6:3181] to: [/host1:3181, /host7:3181, /host3:3181, /host6:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:26:16,733 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host1:3181, /host7:3181, /host3:3181, /host6:3181] to: [/host1:3181, /host7:3181, /host11:3181, /host6:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:27:37,912 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host1:3181, /host7:3181, /host11:3181, /host6:3181] to: [/host5:3181, /host7:3181, /host11:3181, /host6:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:27:59,248 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host5:3181, /host7:3181, /host11:3181, /host6:3181] to: [/host5:3181, /host7:3181, /host11:3181, /host4:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:28:14,282 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host5:3181, /host7:3181, /host11:3181, /host4:3181] to: [/host5:3181, /host14:3181, /host11:3181, /host4:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:28:17,900 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host5:3181, /host14:3181, /host11:3181, /host4:3181] to: [/host5:3181, /host14:3181, /host7:3181, /host4:3181] for ledger:338547 starting at entry: 2946 {code} {code} 2012-09-06 00:19:37,904 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host9:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:19:37,911 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host6:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:19:37,913 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host1:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:19:37,930 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host6:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:19:47,000 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host1:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:21:39,985 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host10:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:22:07,401 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host12:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:23:49,055 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host7:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:23:59,118 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host15:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:25:51,045 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host9:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:26:08,289 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host2:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:27:37,427 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host1:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:27:58,069 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host6:3181 for ledger: 338547 entry: 2935 rc: 0 2012-09-06 00:28:01,622 - DEBUG - [pool-10-thread-1:PerChannelBookieClient@534] - Got response for add request from bookie: /host7:3181 for ledger: 338547 entry: 2935 rc: 0 {code} {code} 2012-09-06 00:19:01,530 - DEBUG - [pool-10-thread-1:PendingAddOp@98] - Unsetting success for ledger: 338547 entry: 2935 bookie index: 1 2012-09-06 00:19:14,590 - DEBUG - [pool-10-thread-1:PendingAddOp@98] - Unsetting success for ledger: 338547 entry: 2935 bookie index: 3 2012-09-06 00:20:34,342 - DEBUG - [pool-10-thread-1:PendingAddOp@98] - Unsetting success for ledger: 338547 entry: 2935 bookie index: 1 2012-09-06 00:21:17,403 - DEBUG - [pool-10-thread-1:PendingAddOp@98] - Unsetting success for ledger: 338547 entry: 2935 bookie index: 3 2012-09-06 00:22:34,389 - DEBUG - [pool-10-thread-1:PendingAddOp@98] - Unsetting success for ledger: 338547 entry: 2935 bookie index: 1 2012-09-06 00:22:49,620 - DEBUG - [pool-10-thread-1:PendingAddOp@98] - Unsetting success for ledger: 338547 entry: 2935 bookie index: 0 2012-09-06 00:24:51,208 - DEBUG - [pool-10-thread-1:PendingAddOp@98] - Unsetting success for ledger: 338547 entry: 2935 bookie index: 1 2012-09-06 00:25:09,143 - DEBUG - [pool-10-thread-1:PendingAddOp@98] - Unsetting success for ledger: 338547 entry: 2935 bookie index: 0 2012-09-06 00:26:38,864 - DEBUG - [pool-10-thread-1:PendingAddOp@98] - Unsetting success for ledger: 338547 entry: 2935 bookie index: 0 2012-09-06 00:26:59,237 - DEBUG - [pool-10-thread-1:PendingAddOp@98] - Unsetting success for ledger: 338547 entry: 2935 bookie index: 3 2012-09-06 00:27:12,239 - DEBUG - [pool-10-thread-1:PendingAddOp@98] - Unsetting success for ledger: 338547 entry: 2935 bookie index: 1 {code} the final ensemble contains entry 2935 are : [/host5:3181, /host14:3181, /host11:3181, /host4:3181]. but there is no write add entry to these three bookies. (all addEntry requests for 2935 are sent to [host1, host2, host6, host7, host9, host10, host12, host15]). matching the changing actions and responses with addEntry, we can know that the last response (to /host7) is matched to the following ensemble change which changing host9 to host7 in bookie index 1. which is also matching with the last unsetting operation on entry 2935. {quote} 2012-09-06 00:25:57,846 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host1:3181, /host9:3181, /host3:3181, /host6:3181] to: [/host1:3181, /host7:3181, /host3:3181, /host6:3181] for ledger:338547 starting at entry: 2928 {quote} after that there is no unsetting, requests and responses for entry 2935 when changing ensemble starting from 2928. {quote} 2012-09-06 00:26:16,733 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host1:3181, /host7:3181, /host3:3181, /host6:3181] to: [/host1:3181, /host7:3181, /host11:3181, /host6:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:27:37,912 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host1:3181, /host7:3181, /host11:3181, /host6:3181] to: [/host5:3181, /host7:3181, /host11:3181, /host6:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:27:59,248 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host5:3181, /host7:3181, /host11:3181, /host6:3181] to: [/host5:3181, /host7:3181, /host11:3181, /host4:3181] for ledger:338547 starting at entry: 2928 2012-09-06 00:28:14,282 - DEBUG - [pool-10-thread-1:LedgerHandle@680] - Changing ensemble from: [/host5:3181, /host7:3181, /host11:3181, /host4:3181] to: [/host5:3181, /host14:3181, /host11:3181, /host4:3181] for ledger:338547 starting at entry: 2928 {quote} changing host3 to host11 on bookie index 2 (no effects on entry 2935) changing host1 to host5 on bookie index 0 (should unset entry 2935, but it doesn't) changing host6 to host4 on bookie index 3 (should unset entry 2935, but it doesn't) changing host7 to host14 on bookie index 1 (should unset entry 2935, but it doesn't). so you could see all the replicas for entry 2935 has been replaced without sending any add requests. ----- from the above analysis, a possible solution for this fix is that we need to make the shared variables like lastAddConfirmed to volatile to make them visibile to all threads. and we need some synchronization on pendingAddOps to avoid item removed during iteration. > Ledger entry not found in any of the bookies in the ensemble responsible for > that entry. > ---------------------------------------------------------------------------------------- > > Key: BOOKKEEPER-400 > URL: https://issues.apache.org/jira/browse/BOOKKEEPER-400 > Project: Bookkeeper > Issue Type: Bug > Components: bookkeeper-client > Reporter: Aniruddha > Attachments: clean.log.gz > > > Detailed discussion at > http://mail-archives.apache.org/mod_mbox/zookeeper-bookkeeper-dev/201209.mbox/%3cCAOLhyDQzrmeOHmTxzPikeAqJ7pZUn0=vHfd=gc1srmtuye5...@mail.gmail.com%3e > We had an internal discussion about this. From BOOKKEEPER-337, it seems that > handleBookieFailure could be invoked in parallel by a thread other the one > that calls LedgerHandle#sendAddSuccessCallbacks. The values updated by > handleBookieFailure might not be visible to the thread running > sendAddSuccessCallbacks because the fields are not volatile and this might > have caused our bad state. > BK-337 synchronizes access to metadata.addEnsemble() and we believe this > would make this scenario very improbable. > A long term fix might be to make LedgerMetadata immutable since it is rarely > updated. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira