在有关split的测试中,客户端如果通过Snap要获得多个region的value,就会请求多次。而这时可能会于split的执行重叠。当客户端从engine中读取数据的时候,可能因为regionRanges的信息更新,造成同一份数据从两个不同的分区中读取了两次,最终读取的数据多了,出现错误。
不知道regionRanges的信息应该何时更新?(每次通过心跳更新好像不能保证不影响正在读取的操作)
在有关split的测试中,客户端如果通过Snap要获得多个region的value,就会请求多次。而这时可能会于split的执行重叠。当客户端从engine中读取数据的时候,可能因为regionRanges的信息更新,造成同一份数据从两个不同的分区中读取了两次,最终读取的数据多了,出现错误。
不知道regionRanges的信息应该何时更新?(每次通过心跳更新好像不能保证不影响正在读取的操作)
一个建议:
可以在 split 结束的时候, 如果当前是 leader , 可以通过 scheduler 主动发送心跳给 pd, 而不是等定时器来发送心跳, 这样 pd 的缓存会更新快一点
在Split相关的测试中,虽然会请求多次,但是由于回复的response中包含了region的相关信息,所以,之后的读取是根据回复的region信息来判断的,而不是从client端读取的。
这就说明,应该不是这个位置造成的问题。
关于何时更新regionRanges,和上面的回答一样,可以在每次split之后主动发送心跳。另外,applySnapshot之后也需要,不过这在之前应该已经实现过了。
可以去看看每次读请求到来之后是否检查了checkKeyInRegion,保证在读取的时候,读到的是正确的region。
谢谢,不过已经实现了过,还是存在问题
是这样的,是我理解错了。