Hello,txn 模式访问 tikv 时,region 相关处理如下:
- txn 向 PD 根据 key 获取 region 的对应信息
- txn 向对应 TiKV 带着 region 元信息(如版本信息)发送请求
- TiKV 收到请求后,检查 region 信息是否对上,这个过程主要是用来保证 tikv 中的对应 region 没有发生过变更,如 split, merge.
- TiKV 开始处理请求,在拿到 snapshot 后处理咱们这个 key 时,发现 key 已经不在这个 region 了
确实如你所说,在 3 以后,这个 region 可能是发生过变更,比如 split, 就会导致咱们这个问题,这可以通过在 tikv 中搜索这个 region 相关的日志观察到。
为什么不是 Region Error 而是 Other Error 呢?我猜原因应该是这样:
- 首先 region error 一般在第 3 步处理的时候就会暴露出来,而咱们这一步处理已经在第 4 步也就是很核心了,之前没有考虑过在这一块处理 region error。
-
- 也是最关键的原因,这边直接返回 region error 也不行,因为事实确实是 key 不在这个 region 里面,设计初衷应该是怕真的这块逻辑出现了问题,所以直接丢这个错误是为了引起重视,并进一步排查是否是 region 信息发生了变更导致,而不是内部逻辑出现了问题。
-
- region split 操作本身是一瞬间的事情,所以踩到这一块的逻辑概率还是相对将大的,但又不是特别大,因为 get snapshot 这个操作也是瞬间的,所以如你所说,你这个场景就很难复现。所以我猜测这一块逻辑之前应该也是没有的,后来有同学踩到了才加入,然后又考虑到第二点原因,就是系统可能真的出现了问题,所以不报 Region Error 对用户来说可能是最稳妥的方式。