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