codelipenghui commented on code in PR #17228:
URL: https://github.com/apache/pulsar/pull/17228#discussion_r970508162


##########
managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java:
##########
@@ -2357,6 +2357,42 @@ private void 
maybeOffloadInBackground(CompletableFuture<PositionImpl> promise) {
         }
     }
 
+    // Although we have caught the connection loss exception on the meta 
store, to avoid other exceptions cause
+    // the mismatch between meta store and in memory, we refresh the ledger 
info list when the offload execute
+    // failed by badversion
+    private void asyncRefreshLedgersInfoOnBadVersion(ManagedLedgerException 
exception) {
+        if (!(exception instanceof BadVersionException)) {
+            return;
+        }
+        if (!metadataMutex.tryLock()) {
+            scheduledExecutor.schedule(
+                () -> asyncRefreshLedgersInfoOnBadVersion(exception), 100, 
TimeUnit.MILLISECONDS);
+            return;
+        }
+        store.getManagedLedgerInfo(name, false, new MetaStoreCallback<>() {
+            @Override
+            public void operationComplete(ManagedLedgerInfo mlInfo, Stat stat) 
{
+                ledgersStat = stat;
+                try {
+                    synchronized (ManagedLedgerImpl.this) {

Review Comment:
   > And the synchronized to make sure there hasn't remove/add operation when 
the ledger is closing or creating.
   
   Yes, that is what I want to say. If there are other operations that will 
update the `ledgers`, it will introduce the problem.
   
   For example:
   
   1. asyncRefreshLedgersInfoOnBadVersion get the metadataMutex lock
   2. we got the returned `ManageLedgerInfo` at line 2370
   3. another operation changed the `ledgers`,  we will waiting here line 2373
   4. after the `ledgers` changed, we will continue to run lines 2374 - 2377
   5. we will lose the changes at step 3  
   
   And it also might introduce deadlock? someone is getting the `synchronized` 
but waiting for the `metadataMutex` lock, here is waiting for the 
`synchronized` lock but can't release the `metadataMutex` lock



-- 
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