project2b中,使用engine_util.PutCF接口添加的数据,经常获取失败导致

project2b中,使用engine_util.PutCF接口添加的数据,第一个key 000000大多数时候都会添加失败,偶尔能添加成功,其他key大多数添加成功,偶尔会添加的所有数据失败,完全获取不了数据,导致2b第一个test一直失败


是我使用接口的方式不对吗?

2 个赞

这里好像手册推荐使用writeBatch进行批处理写入,第一个test不过感觉有可能你的日志有点问题。
但是2b出问题的地方很多,也不是能明确的定位。比如我刚debug过了2b,就是少了一个If

2 个赞

writeBatch我也试过了,一样的问题,我有在调用之前打印过,明确的把key和value传进去engine_util.PutCF了,没返回error,但就是没这个数据。少数情况能完整的保存数据

2 个赞

你可以看到你自己这里缺了第一项数据,很大概率是你日志这边处理可能有问题。2b主要应该就两种问题,一种是cmdType不符合,一种就是数据不正确。关于到底哪里出问题,emmm 需要自己慢慢调了。

2 个赞


这是刚打印的,我觉得日志应该是没缺的
然后我把测试的函数由0开始改成了1开始,可以一直添加到三十多项,然后就又出现了读不出数据的问题了

2 个赞

几个问题:
1.是否有用writodb把writeBatch里面的数据持久化到badger
2.apply entry的时候,建议先试试每apply一个entry都持久化一次,比批量持久化出错的概率小

1 个赞

1.我现在用的接口其实就是每次处理req都直接持久化到badger了,我换了writeBatch是有调用writetodb的,但还是同样的问题
2.无论是apply一个entry持久化一次,还是一次性批量持久化,都会出现这个问题

昨晚试过putcf后立即getcf是能获取数据成功的,可否问下,cb里的txn你们这边是怎么生成的呢?我是直接这样弄的


感谢大佬的回复

1 个赞

我的做法是在调用callback之前writodb,保证之前的更新都能被读到

1 个赞

apply entry的顺序:
1 添加更新操作到writebatch
2 调用writetodb 持久化存储
3 callbak返回数据,其中scan类型的需要创建txn

1 个赞

我也是这个顺序。。但就是会丢数据。。我打印了apply entry时的log,entry是完整的,但就是会丢数据。。。


打印的put开头是把entry添加到writebatch的代码之前的log
打印的write是调用writetodb之前打印的log
打印的scan是我加在test scan的代码之前的log
可以看到前面一直添加到18的时候还是没问题的,但是再添加新的19、20、21之后,就又丢数据了,大部分的时候是连00这个都添加失败。。

1 个赞

这样的话就不是writebatch有没有成功持久化的问题了
是你程序本身有问题,2b到3b会经常出现这个error

3 个赞

以大佬的经验,可能是哪方面的问题呢?或者说是代码的哪一块没有处理好导致的,目前我没啥头绪:sob:

感谢大佬耐心解答,已经找到问题了

是什么问题导致的?

newRaft的时候,没有处理storge.initstate返回的confstate去初始化整个集群,所以一直都是单节点,然后几个节点的打印都混一起了。。。当时过了2a的test以为只需要用了传进来的config.peers就行了

加上相关处理代码后,test已经能pass了,再次感谢大佬的耐心解答给了我思路

按道理我之前没加这个confstate初始化,basictest2b根本跑不了,它会给我反馈一个cannot find region,到你这居然能跑。

我这边只是能跑起来,还是跑不过

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