FastDFS是不是有个binlog_index同步的bug

发布于 2022-09-15 05:31:09 字数 2382 浏览 34 评论 3

本帖最后由 koolcoy 于 2011-02-17 11:59 编辑

在函数storage_binlog_fsync里面有下面几行代码。

  1.                         g_binlog_index++;
  2.                         if ((write_ret=write_to_binlog_index()) == 0)
  3.                         {
  4.                                 write_ret = open_next_writable_binlog();
  5.                         }

复制代码从上面可以看出来,写binlog的线程是先更新了g_binlog_index然后再创建的新binlog文件。
再看同步线程的代码(1.21版,2.08在这个地方有修改但是存在同样的问题)

  1.                         if (pReader->binlog_index < g_binlog_index) //rotate
  2.                         {
  3.                                 pReader->binlog_index++;
  4.                                 pReader->binlog_offset = 0;
  5.                                 if ((result=storage_open_readable_binlog(
  6.                                                 pReader)) != 0)
  7.                                 {
  8.                                         return result;
  9.                                 }

复制代码bug:在写binlog的线程更新g_binlog_index后新的binlog文件创建完成之前,如果读binlog的线程就去打开新的binlog文件,storage_open_readable_binlog会失败,并且会将pReader->binlog_fd置成-1

修改建议:先创建新的binlog文件,再g_binlog_index++

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

等待圉鍢 2022-09-19 02:26:38

回复 3# koolcoy

灰常感谢,这次真正改好了!
大家都像koolcoy这么给力就好了!

迷你仙 2022-09-19 00:59:49

本帖最后由 happy_fish100 于 2011-02-17 16:36 编辑

刚看了svn的代码,貌似并没有真正修改掉啊。你是在write_to_binlog_index里面给g_binlog_index赋值的,也就是说仍然是在创建新的binlog文件之前修改的g_binlog_index。

g_binlog_index的修改应该在系统调用

  1. g_binlog_fd = open(full_filename, O_WRONLY | O_CREAT | O_APPEND, 0644);

复制代码之后发生才正确{:3_190:}

此生挚爱伱 2022-09-17 22:54:17

回复 1# koolcoy

的确存在你说的问题,已经修复了。非常感谢!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文