tikv region预拆分后,key插入region失败

【 TiDB 使用环境】测试
【 TiDB 版本】tikv客户端:3.3.2
【复现路径】做过哪些操作出现的问题
conf = TiConfiguration.createDefault(“*****”);
session = TiSession.create(conf);
client = session.createRawClient();
// region预拆分
List<byte[]> list = new ArrayList<>();
list.add(toByteArray(“inodes”, 500000));
list.add(toByteArray(“inodes”, 800000));
session.splitRegionAndScatter(list);
// 插入一条
client.put(ByteString.copyFrom(toByteArray(“inodes”, 611224)), ByteString.copyFromUtf8(“Hello”));

【遇到的问题:问题现象及影响】
对region预拆分后写入key能基于key找到对应的region,但是在最后将key往该region写入时报错提示key_not_in_region。
跟踪源码发现获取region时,会对key做一步编码
PDClient.getRegionByKey():
GetRegionRequest.newBuilder().setRegionKey(codec.encodePdQuery(key))
返回CodecUtils.encode(key);
而在插入key时,此过程不对key做编码,两者无法对上导致插入对应region报错
RegionStoreClient.rawPut():
RawPutRequest.newBuilder().setKey(codec.encodeKey(key))
直接返回key;
有大佬清楚为啥region这里需要实现这一步编码么,有没办法规避这个问题

【资源配置】
【附件:截图/日志/监控】

内部的处理方式肯定是为了兼容,满足 PD 对于 region 的调度,至于 region keys 间隙 最好遵循规则

参考文档给的用法,另寻奇境会找到更多的坑…
https://tikv.github.io/client-java/examples/rawkv.html

另外要知晓兼容性上的差距:

1 个赞

KVMode设置为RAW解决
conf.setKvMode(String.valueOf(TiConfiguration.KVMode.RAW))

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