FastDFS是不是有个binlog_index同步的bug
本帖最后由 koolcoy 于 2011-02-17 11:59 编辑
在函数storage_binlog_fsync里面有下面几行代码。
- g_binlog_index++;
- if ((write_ret=write_to_binlog_index()) == 0)
- {
- write_ret = open_next_writable_binlog();
- }
复制代码从上面可以看出来,写binlog的线程是先更新了g_binlog_index然后再创建的新binlog文件。
再看同步线程的代码(1.21版,2.08在这个地方有修改但是存在同样的问题)
- if (pReader->binlog_index < g_binlog_index) //rotate
- {
- pReader->binlog_index++;
- pReader->binlog_offset = 0;
- if ((result=storage_open_readable_binlog(
- pReader)) != 0)
- {
- return result;
- }
复制代码bug:在写binlog的线程更新g_binlog_index后新的binlog文件创建完成之前,如果读binlog的线程就去打开新的binlog文件,storage_open_readable_binlog会失败,并且会将pReader->binlog_fd置成-1
修改建议:先创建新的binlog文件,再g_binlog_index++
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
回复 3# koolcoy
灰常感谢,这次真正改好了!
大家都像koolcoy这么给力就好了!
本帖最后由 happy_fish100 于 2011-02-17 16:36 编辑
刚看了svn的代码,貌似并没有真正修改掉啊。你是在write_to_binlog_index里面给g_binlog_index赋值的,也就是说仍然是在创建新的binlog文件之前修改的g_binlog_index。
g_binlog_index的修改应该在系统调用
复制代码之后发生才正确{:3_190:}
回复 1# koolcoy
的确存在你说的问题,已经修复了。非常感谢!