Skip to content

KeyRange Query Encounters IndexOutOfBoundsException #98

@seancarroll

Description

@seancarroll

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions