[tinykv] invalid region meta key length 错误的可能原因是什么

在测试 TestSplitRecover3B 时,出现 invalid region meta key length for key [1 3 0 0 0 0 0 0 0 1 1 255 255 255 255 255 255 255 211] [recovered] 错误。
这个错误出现的场景是:一个 peer 之前被 stop 了,之后又重新启动。其在启动时会调用 loadPeers 函数,这个函数会从 stable storage 中取每个 peer 对应的 region。取 region 的方法是根据之前持久化时使用的 RegionStateKey 作为 key,从 stable storage 中取对应的 value,即 region。由于 RegionStateKey 是被编码过的,因此需要调用 DecodeRegionMetaKey 函数进行解码。错误就出现在这个函数中。该函数会判断解码得到的 key 的长度是否与预设的长度相同,如果不同就抛出之前所述的错误。
该错误是可复现的。每次都出现在重新启动第一个 peer 时。

通过打印 log 信息,发现 [1 3 0 0 0 0 0 0 0 1 1] 是对应 region 1 的 region state key。其长度为 11,符合规定的大小。但是在重新启动时,从 stable storage 中取出来的 region state key 却变成了 [1 3 0 0 0 0 0 0 0 1 1 255 255 255 255 255 255 255 211] 。似乎 stable storage 中的数据被污染了。

请问有人遇到过类似的问题吗?解决方法是什么呢?

找到原因了,是因为同一个 WriteBatch 被错误地写入了两次,导致 badger 中数据被污染了。