GeezerVison is showing github.com — KeyRange Query Encounters IndexOutOfBoundsException · Issue #98 · lmdbjava/lmdbjava
KeyRange Query Encounters IndexOutOfBoundsException #98
Description
I'm hitting an IndexOutOfBoundsException when trying to use a keyrange iterator. I wrote a test to illustrate the issue
@Test
public void rangeSearch() {
final Dbi<ByteBuffer> db = env.openDbi(DB_1, MDB_CREATE);
final ByteBuffer key = allocateDirect(env.getMaxKeySize());
key.put("cherry".getBytes(UTF_8)).flip();
db.put(key, bb(1));
key.clear();
key.put("strawberry".getBytes(UTF_8)).flip();
db.put(key, bb(3));
key.clear();
key.put("pineapple".getBytes(UTF_8)).flip();
db.put(key, bb(2));
try (Txn<ByteBuffer> txn = env.txnRead()) {
ByteBuffer start = allocateDirect(env.getMaxKeySize());
start.put("a".getBytes(UTF_8)).flip();
ByteBuffer end = allocateDirect(env.getMaxKeySize());
end.put("z".getBytes(UTF_8)).flip();
List<String> keysFound = new ArrayList<>();
CursorIterator<ByteBuffer> ckr = db.iterate(txn, KeyRange.closed(start, end));
for (final CursorIterator.KeyVal<ByteBuffer> kv : ckr.iterable()) {
keysFound.add(UTF_8.decode(kv.key()).toString());
}
System.out.println(keysFound);
assertEquals(3, keysFound.size());
}
}
which can also be found here seancarroll@4e7b4f2.
Full stack trace is
java.lang.IndexOutOfBoundsException
at java.nio.Buffer.checkIndex(Buffer.java:546)
at java.nio.DirectByteBuffer.getLong(DirectByteBuffer.java:772)
at org.lmdbjava.ByteBufferProxy$AbstractByteBufferProxy.compareBuff(ByteBufferProxy.java:138)
at org.lmdbjava.ByteBufferProxy$AbstractByteBufferProxy.compare(ByteBufferProxy.java:192)
at org.lmdbjava.ByteBufferProxy$AbstractByteBufferProxy.compare(ByteBufferProxy.java:104)
at org.lmdbjava.Txn$$Lambda$2/2024542466.compare(Unknown Source)
at org.lmdbjava.KeyRangeType.iteratorOp(KeyRangeType.java:393)
at org.lmdbjava.CursorIterator.executeIteratorOp(CursorIterator.java:128)
at org.lmdbjava.CursorIterator.update(CursorIterator.java:158)
at org.lmdbjava.CursorIterator.hasNext(CursorIterator.java:70)
at org.lmdbjava.TxnTest.rangeSearch(TxnTest.java:299)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
I might be doing something dumb or missing something obvious
Activity
krisskross commented on Jul 19, 2018
Sorry for the delay. I'm on vacation and trying to disconnect a little. I'm sure @benalexau is also enjoying a well deserved vacation. We'll have a look ASAP.
seancarroll commented on Jul 19, 2018
ContributorAuthor
More actions
No worries. I should take a closer look at what AbstractByteBufferProxy.compareBuff is doing
seancarroll commented on Jul 21, 2018
ContributorAuthor
More actions
krisskross commented on Jul 24, 2018
I think you found a bug since capacity doesn't take limit into account. Do you mind try running the lmdbjava tests with the fix?
seancarroll commented on Jul 25, 2018
ContributorAuthor
More actions
All tests pass with the change. Created pull request as well
bp-alex commented on Dec 7, 2018
Closing issue now that PR #101 has been merged.
Metadata
Metadata
Development
No branches or pull requestsIssue actions