FastDFS源码分析之tracker协议分析

本文深入剖析FastDFS中tracker协议的工作原理,包括storage心跳协议、报告响应同步时间、磁盘使用情况上报、storage服务加入及状态报告等关键流程,揭示FastDFS内部通信机制。
摘要由CSDN通过智能技术生成

本篇博客主要讲解fastdfs中tracker协议的讲解。

fastdfs主要是存储文件,直接把整个文件存储到磁盘上,所以,简单直接。但是也有很大的局限性。

因此,fastdfs对文件的目录设置和存储是最为核心的。


为什么这么突然的讲解这些。因为我已经看了一段时间的fastdfs,主要结构都已经搞的比较清晰了。因此,这篇文章,我就主要一tracker这一部分的协议来分析。


其他具体介绍tracker的请百度。我就不介绍了,我就直接从

[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. int tracker_deal_task(struct fast_task_info *pTask)  

这个方法开始对每个case分析。


1、storage心跳协议

[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. case TRACKER_PROTO_CMD_STORAGE_BEAT:  
  2.             TRACKER_CHECK_LOGINED(pTask)  
  3.             result = tracker_deal_storage_beat(pTask);  
  4.             break;  

自然,该协议是从storage层发送给tracker层的数据包,

[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. #define TRACKER_PROTO_CMD_STORAGE_BEAT              83  //storage heart beat  

那么,storage主要是做了什么:

storage在启动的时候,会开启一个线程,该线程为

[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. static void *tracker_report_thread_entrance(void *arg)  

该函数主要是做了根据配置连接相应的它的组的tacker,做一些事情,这里有个while循环,代码如下

[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. current_time = g_current_time;  
  2.             if (current_time - last_beat_time >= \  
  3.                     g_heart_beat_interval)  
  4.             {  
  5.                 if (tracker_heart_beat(pTrackerServer, \  
  6.                     &stat_chg_sync_count, \  
  7.                     &bServerPortChanged) != 0)  
  8.                 {  
  9.                     break;  
  10.                 }  


也就是至少30秒钟来一次心跳,心跳包的主要数据是包头和当前storage的状态信息,

[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. char out_buff[sizeof(TrackerHeader) + sizeof(FDFSStorageStatBuff)];  

[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. /* struct for network transfering */  
  2. typedef struct  
  3. {  
  4.     char sz_total_upload_count[8];  
  5.     char sz_success_upload_count[8];  
  6.     char sz_total_append_count[8];  
  7.     char sz_success_append_count[8];  
  8.     char sz_total_modify_count[8];  
  9.     char sz_success_modify_count[8];  
  10.     char sz_total_truncate_count[8];  
  11.     char sz_success_truncate_count[8];  
  12.     char sz_total_set_meta_count[8];  
  13.     char sz_success_set_meta_count[8];  
  14.     char sz_total_delete_count[8];  
  15.     char sz_success_delete_count[8];  
  16.     char sz_total_download_count[8];  
  17.     char sz_success_download_count[8];  
  18.     char sz_total_get_meta_count[8];  
  19.     char sz_success_get_meta_count[8];  
  20.     char sz_total_create_link_count[8];  
  21.     char sz_success_create_link_count[8];  
  22.     char sz_total_delete_link_count[8];  
  23.     char sz_success_delete_link_count[8];  
  24.     char sz_total_upload_bytes[8];  
  25.     char sz_success_upload_bytes[8];  
  26.     char sz_total_append_bytes[8];  
  27.     char sz_success_append_bytes[8];  
  28.     char sz_total_modify_bytes[8];  
  29.     char sz_success_modify_bytes[8];  
  30.     char sz_total_download_bytes[8];  
  31.     char sz_success_download_bytes[8];  
  32.     char sz_total_sync_in_bytes[8];  
  33.     char sz_success_sync_in_bytes[8];  
  34.     char sz_total_sync_out_bytes[8];  
  35.     char sz_success_sync_out_bytes[8];  
  36.     char sz_total_file_open_count[8];  
  37.     char sz_success_file_open_count[8];  
  38.     char sz_total_file_read_count[8];  
  39.     char sz_success_file_read_count[8];  
  40.     char sz_total_file_write_count[8];  
  41.     char sz_success_file_write_count[8];  
  42.     char sz_last_source_update[8];  
  43.     char sz_last_sync_update[8];  
  44.     char sz_last_synced_timestamp[8];  
  45.     char sz_last_heart_beat_time[8];  
  46. } FDFSStorageStatBuff;  


tracker主要是做了什么呢?

对其进行解包,然后对这个保存在本地的storage的信息进行保存到文件中,调用

[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. status = tracker_save_storages();  

调用

[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. tracker_mem_active_store_server(pClientInfo->pGroup, \  
  2.             pClientInfo->pStorage);  
将这个存储服务器如果没有,就插入到group中。




最后调用

[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. static int tracker_check_and_sync(struct fast_task_info *pTask, \  
  2.             const int status)  

检查相应的改变状态,并将其同步等。(需要再详细看看)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值