This is an automated email from the ASF dual-hosted git repository.

sijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 12962d0  Fix invalid range error when getting number of entries (#2709)
12962d0 is described below

commit 12962d0fecae73f71e1ddfeba4d6bbe65232bcca
Author: massakam <massa...@yahoo-corp.jp>
AuthorDate: Thu Oct 4 10:30:07 2018 +0900

    Fix invalid range error when getting number of entries (#2709)
    
    For a topic with metadata similar to 
https://github.com/apache/pulsar/pull/2673, IllegalArgumentException may occur 
in the following line:
    
https://github.com/apache/pulsar/blob/b2484d92d5068d4f0699eb9c3d31640cb48f9dd0/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java#L655
    
    This is the broker log when the exception has occurred:
    
[invalid_range_error.txt](https://github.com/apache/pulsar/files/2442924/invalid_range_error.txt)
    
    It is because `readPosition` is ahead of 
`ledger.getLastPosition().getNext()`, so 
`ManagedCursorImpl#getNumberOfEntries()` should return 0 as the number of 
entries to read in that case.
    
    I think this issue and https://github.com/apache/pulsar/pull/2673 are the 
result of that `ledger.getLastPosition()` is no longer the real last of the 
managed ledger because of https://github.com/apache/pulsar/pull/1550.
---
 .../org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java  | 10 +++++++++-
 .../org/apache/bookkeeper/mledger/impl/ManagedCursorTest.java  |  1 +
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git 
a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java
 
b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java
index 64efa85..57c4e62 100644
--- 
a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java
+++ 
b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java
@@ -652,7 +652,15 @@ public class ManagedCursorImpl implements ManagedCursor {
 
     @Override
     public long getNumberOfEntries() {
-        return getNumberOfEntries(Range.closedOpen(readPosition, 
ledger.getLastPosition().getNext()));
+        if (readPosition.compareTo(ledger.getLastPosition().getNext()) > 0) {
+            if (log.isDebugEnabled()) {
+                log.debug("[{}] [{}] Read position {} is ahead of last 
position {}. There are no entries to read",
+                        ledger.getName(), name, readPosition, 
ledger.getLastPosition());
+            }
+            return 0;
+        } else {
+            return getNumberOfEntries(Range.closedOpen(readPosition, 
ledger.getLastPosition().getNext()));
+        }
     }
 
     @Override
diff --git 
a/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedCursorTest.java
 
b/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedCursorTest.java
index 77d6c6c..d8c48de 100644
--- 
a/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedCursorTest.java
+++ 
b/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedCursorTest.java
@@ -2759,6 +2759,7 @@ public class ManagedCursorTest extends 
MockedBookKeeperTestCase {
             public void operationComplete() {
                 assertEquals(cursor.getMarkDeletedPosition(), lastPosition);
                 assertEquals(cursor.getReadPosition(), nextPosition);
+                assertEquals(cursor.getNumberOfEntries(), 0L);
             }
 
             @Override

Reply via email to