免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5421 | 回复: 8
打印 上一主题 下一主题

[FastDFS] fastdfs的api是多线程和多进程安全吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-10 14:03 |只看该作者 |倒序浏览
目前使用c的api,在处理用户并发访问时,想跟作者确认一下api是否多线程和多进程安全,多谢!

g_tracker_servers是个全局变量,客户端和Storage都用到,客户端应该非线程安全吧?像函数:
tracker_get_connection
tracker_get_connection_ex
所有访问g_tracker_servers的地方都应该加锁。

[ 本帖最后由 happy_fastdfs 于 2009-10-10 16:05 编辑 ]

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
2 [报告]
发表于 2009-10-10 16:47 |只看该作者

回复 #1 happy_fastdfs 的帖子

可以做到多线程安全。
加锁是一种做法,但不建议这么用,因为会导致堵塞和等待,效率很差。
建议每个线程使用自己的tracker server,不要使用全局的。
比如:
TrackerServerInfo tracker_server;
if (tracker_get_connection_ex(&tracker_server) != 0)
{
     //连接tracker server失败!
}

论坛徽章:
0
3 [报告]
发表于 2009-10-12 09:59 |只看该作者

这个函数也不是线程安全的

tracker_get_connection_ex函数
        pCurrentServer = g_tracker_servers + g_tracker_server_index;//线程A 根据g_tracker_server_index memcpy出最后这个tracker结构体时,线程B刚好将g_tracker_server_index++到越界位置,memcpy时会越界访问。
        memcpy(pTrackerServer, pCurrentServer, sizeof(TrackerServerInfo));
        pTrackerServer->sock = -1;
        if (tracker_connect_server(pTrackerServer) == 0)
        {
                g_tracker_server_index++;//线程B刚好将g_tracker_server_index++到越界位置
                if (g_tracker_server_index >= g_tracker_server_count)
                {
                        g_tracker_server_index = 0;
                }
                return 0;
        }
所以后面版本看看能不能实现几个不使用全局变量g_tracker_servers和 g_tracker_server_index的tracker连接管理函数。可以把配置文件中的tracker列表读到全局变量中,因为运行时只读,然后每个线程get connection时从全局配置中读出各个tracker的ip和port,构建线程自己的tracker_servers。

搜索代码看到应该是Storage也用到全局变量g_tracker_servers,幸好Storage需要重启才会改变g_tracker_server_count,看来server在运行时没发现线程安全问题。

我的理解对不?

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
4 [报告]
发表于 2009-10-12 21:25 |只看该作者

回复 #3 happy_fastdfs 的帖子

的确存储LZ所说的问题,V1.22版中已经修复此问题。
LZ对FastDFS研究得比较深入啊,再次赞一个!

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
5 [报告]
发表于 2009-10-12 21:36 |只看该作者

回复 #3 happy_fastdfs 的帖子

修正后的代码片段如下:

        int server_index;

        server_index = pTrackerGroup->server_index;
        if (server_index >= pTrackerGroup->server_count)
        {
                server_index = 0;
        }
        pCurrentServer = pTrackerGroup->servers + server_index;

以前tracker server守护进程的计数器也不是线程安全的,采用了类似的做法解决了多线程访问导致读取的计数器越界的问题。

论坛徽章:
0
6 [报告]
发表于 2009-10-13 09:14 |只看该作者
用个局部变量 int server_index;避免了加锁,你的技巧也令人佩服啊!
再用个参数pTrackerServer memcpy出来,而不是直接使用pTrackerGroup内的指针,避免了不安全的隐患,学习了!

发现这个问题,归功于同事chenwq看api后的质疑,因为他是多线程环境使用api。
我今天对比测试一下,如还有问题或还有其他地方线程安全问题,今天再回复这个贴。

论坛徽章:
0
7 [报告]
发表于 2009-10-13 15:13 |只看该作者
从svn取代码测试OK,非常感谢,期待新版本的正式发布。

论坛徽章:
0
8 [报告]
发表于 2009-10-16 17:51 |只看该作者
实在佩服happyfish的编程水平和有耐心地回答用户提出的问题。这两天才刚开始看fastdfs,要好好地学习一下。
需要向happy_fastdfs 学习

论坛徽章:
0
9 [报告]
发表于 2009-10-29 17:39 |只看该作者
期待fastdfs逐渐完善和强大起来,成为一款高质量的应用系统。很感谢作者和发现问题的各位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP