GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — KeyRange Query Encounters IndexOutOfBoundsException · Issue #98 · lmdbjava/lmdbjava

KeyRange Query Encounters IndexOutOfBoundsException #98

New issue
Copy link
New issue
Copy link
Closed
Closed
KeyRange Query Encounters IndexOutOfBoundsException#98
Copy link

Description

@seancarroll
seancarroll
opened on Jul 17, 2018
Issue body actions

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

  1. krisskross commented on Jul 19, 2018

    @krisskross
    krisskross
    on Jul 19, 2018
    Contributor
    More actions

    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.

  2. seancarroll commented on Jul 19, 2018

    @seancarroll
    seancarroll
    on Jul 19, 2018
    ContributorAuthor
    More actions

    No worries. I should take a closer look at what AbstractByteBufferProxy.compareBuff is doing

  3. seancarroll commented on Jul 21, 2018

    @seancarroll
    seancarroll
    on Jul 21, 2018
    ContributorAuthor
    More actions

    I can get my test to pass by changing https://github.com/lmdbjava/lmdbjava/blob/master/src/main/java/org/lmdbjava/ByteBufferProxy.java#L131 to

    final int minLength = Math.min(o1.limit(), o2.limit());
    
  4. krisskross commented on Jul 24, 2018

    @krisskross
    krisskross
    on Jul 24, 2018
    Contributor
    More actions

    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?

  5. seancarroll commented on Jul 25, 2018

    @seancarroll
    seancarroll
    on Jul 25, 2018
    ContributorAuthor
    More actions

    All tests pass with the change. Created pull request as well

  6. bp-alex commented on Dec 7, 2018

    @bp-alex
    bp-alex
    on Dec 7, 2018
    Member
    More actions

    Closing issue now that PR #101 has been merged.

  7. bp-alex
    closed this as completedon Dec 7, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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

      You are visitor 01402520 — GeezerVison does not store the pages you look up.
      Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.