From 2bc6df51df58b6ed163e99d85f2872f89f7a6050 Mon Sep 17 00:00:00 2001 From: Masahiro Sakamoto Date: Wed, 3 Oct 2018 23:59:47 +0900 Subject: [PATCH] Fix invalid range error when getting number of entries --- .../bookkeeper/mledger/impl/ManagedCursorImpl.java | 10 +++++++++- .../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 64efa85e4c98a..57c4e62b33250 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 boolean hasMoreEntries() { @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 77d6c6c67669c..d8c48ded3b448 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 Object answer(InvocationOnMock invocation) { public void operationComplete() { assertEquals(cursor.getMarkDeletedPosition(), lastPosition); assertEquals(cursor.getReadPosition(), nextPosition); + assertEquals(cursor.getNumberOfEntries(), 0L); } @Override