JavaClient KvClient scan

public List scan(ByteString startKey, long version, int limit)这个方法怎么用都会报错

org.tikv.common.exception.TiClientInternalException: Error scanning data from region.

at org.tikv.common.operation.iterator.ScanIterator.cacheLoadFails(ScanIterator.java:113)
at org.tikv.common.operation.iterator.ConcreteScanIterator.hasNext(ConcreteScanIterator.java:106)
at java.util.Iterator.forEachRemaining(Iterator.java:115)
at org.tikv.txn.KVClient.scan(KVClient.java:134)
at fs.server.tikv.TikvScanTest.testTIKVTxn3(TikvScanTest.java:313)
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:498)
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.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:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

Caused by: java.lang.IndexOutOfBoundsException: current cache size = 4, larger than 2
at org.tikv.common.operation.iterator.ScanIterator.cacheLoadFails(ScanIterator.java:100)
… 28 more

IndexOutOfBoundsException 下标越界了,是不是没那么多数据

你用的什么版本的client…

数据有6条,但是我只想要4条。按照方法的意思来说就是取从startKey开始的Math.min(limit,10240)

client是3.3.0的KvClient,我使用的是Txn存数据的

startKey 应该做记录阿,如果做范围扫描,那么 StartKey 和 endKey 都必须已知

另外 也会通过 本地的缓存去获取region 的 startKey

我感觉就是超范围了…
可以通过PD- Cli 来查阅一下 Region 和 region相关的 StartKey 和 endKey,核对下请求是否合理

https://docs.pingcap.com/zh/tidb/stable/pd-control#region-region_id---jqquery-string

谢谢你的指导,以前都是用的RawClient版本也不高,这次升级了版本需要使用Txn事务来控制。我去学习一下

刚刚看了一下,是这样的。我调用 scan(ByteString startKey, long version, int limit) 这个方法,我想获取的是startKey开始的limit个数据。这个方法难道不是这样用的吗?

我建议你看下这个:
https://tikv.github.io/client-java/examples/txnkv.html

按照例子跑起来先试试

这个我之前看过,这个里面的scan是有startKey、endKey的。KVClient提供了三个scan

  1. startKey、endKey
  2. startKey、limit
    3.startkey

源码贴给你拉,都是至少2个参数的,不能省略了

起码要从 PD 获取到 version

提供的三个方法都要传入startKey和version,这个我都传了。
如果你把官方提供的测试用例的scan改成不指定endKey,指定limit的话,无论limit传什么都会报错

那歇菜了,要跟源码了,看看有没有bug :rofl:

:hot_face:哈哈哈哈,我看看提个issue

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。