lhotari commented on code in PR #25101:
URL: https://github.com/apache/pulsar/pull/25101#discussion_r2639583918


##########
managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java:
##########
@@ -2713,26 +2713,29 @@ public void 
maybeUpdateCursorBeforeTrimmingConsumedLedger() {
         for (ManagedCursor cursor : cursors) {
             Position lastAckedPosition = 
cursor.getPersistentMarkDeletedPosition() != null
                     ? cursor.getPersistentMarkDeletedPosition() : 
cursor.getMarkDeletedPosition();
-            LedgerInfo currPointedLedger = 
ledgers.get(lastAckedPosition.getLedgerId());
+            LedgerInfo curPointedLedger = 
ledgers.get(lastAckedPosition.getLedgerId());
             LedgerInfo nextPointedLedger = 
Optional.ofNullable(ledgers.higherEntry(lastAckedPosition.getLedgerId()))
                     .map(Map.Entry::getValue).orElse(null);
 
-            if (currPointedLedger != null) {
+            if (curPointedLedger != null) {
                 if (nextPointedLedger != null) {
                     if (lastAckedPosition.getEntryId() != -1
-                            && lastAckedPosition.getEntryId() + 1 >= 
currPointedLedger.getEntries()) {
+                            && lastAckedPosition.getEntryId() + 1 >= 
curPointedLedger.getEntries()) {
                         lastAckedPosition = 
PositionFactory.create(nextPointedLedger.getLedgerId(), -1);
                     }
                 } else {
                     log.debug("No need to reset cursor: {}, current ledger is 
the last ledger.", cursor);
                 }
             } else {
+                // TODO no ledger exists, should we move cursor mark deleted 
position to nextPointedLedger:-1 ?
                 log.warn("Cursor: {} does not exist in the managed-ledger.", 
cursor);
             }
 
-            if (!lastAckedPosition.equals(cursor.getMarkDeletedPosition())) {
+            if (lastAckedPosition.compareTo(cursor.getMarkDeletedPosition()) > 
0) {

Review Comment:
   Yes, I think that production code changes should be in a separate PR. After 
reading your comments about the race condition, I now see that the tests 
themselves are wrong.
   
   it seems that test assertions like this
   ```
   assertEquals(c2.getMarkDeletedPosition(), lastPosition.get());
   ``` 
   
   should be something like 
`assertThat(c2.getMarkDeletedPosition()).isGreaterThanOrEqualTo(lastPosition.get());`
   
   I don't think that tests should contain ledgerIds since there's another race 
that could happen between the manager cursor storing the state to a ledger.



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