本篇博客主要讲解fastdfs中tracker协议的讲解。
fastdfs主要是存储文件,直接把整个文件存储到磁盘上,所以,简单直接。但是也有很大的局限性。
因此,fastdfs对文件的目录设置和存储是最为核心的。
为什么这么突然的讲解这些。因为我已经看了一段时间的fastdfs,主要结构都已经搞的比较清晰了。因此,这篇文章,我就主要一tracker这一部分的协议来分析。
其他具体介绍tracker的请百度。我就不介绍了,我就直接从
- int tracker_deal_task(struct fast_task_info *pTask)
这个方法开始对每个case分析。
1、storage心跳协议
- case TRACKER_PROTO_CMD_STORAGE_BEAT:
- TRACKER_CHECK_LOGINED(pTask)
- result = tracker_deal_storage_beat(pTask);
- break;
自然,该协议是从storage层发送给tracker层的数据包,
- #define TRACKER_PROTO_CMD_STORAGE_BEAT 83 //storage heart beat
那么,storage主要是做了什么:
storage在启动的时候,会开启一个线程,该线程为
- static void *tracker_report_thread_entrance(void *arg)
该函数主要是做了根据配置连接相应的它的组的tacker,做一些事情,这里有个while循环,代码如下
- current_time = g_current_time;
- if (current_time - last_beat_time >= \
- g_heart_beat_interval)
- {
- if (tracker_heart_beat(pTrackerServer, \
- &stat_chg_sync_count, \
- &bServerPortChanged) != 0)
- {
- break;
- }
也就是至少30秒钟来一次心跳,心跳包的主要数据是包头和当前storage的状态信息,
- char out_buff[sizeof(TrackerHeader) + sizeof(FDFSStorageStatBuff)];
- /* struct for network transfering */
- typedef struct
- {
- char sz_total_upload_count[8];
- char sz_success_upload_count[8];
- char sz_total_append_count[8];
- char sz_success_append_count[8];
- char sz_total_modify_count[8];
- char sz_success_modify_count[8];
- char sz_total_truncate_count[8];
- char sz_success_truncate_count[8];
- char sz_total_set_meta_count[8];
- char sz_success_set_meta_count[8];
- char sz_total_delete_count[8];
- char sz_success_delete_count[8];
- char sz_total_download_count[8];
- char sz_success_download_count[8];
- char sz_total_get_meta_count[8];
- char sz_success_get_meta_count[8];
- char sz_total_create_link_count[8];
- char sz_success_create_link_count[8];
- char sz_total_delete_link_count[8];
- char sz_success_delete_link_count[8];
- char sz_total_upload_bytes[8];
- char sz_success_upload_bytes[8];
- char sz_total_append_bytes[8];
- char sz_success_append_bytes[8];
- char sz_total_modify_bytes[8];
- char sz_success_modify_bytes[8];
- char sz_total_download_bytes[8];
- char sz_success_download_bytes[8];
- char sz_total_sync_in_bytes[8];
- char sz_success_sync_in_bytes[8];
- char sz_total_sync_out_bytes[8];
- char sz_success_sync_out_bytes[8];
- char sz_total_file_open_count[8];
- char sz_success_file_open_count[8];
- char sz_total_file_read_count[8];
- char sz_success_file_read_count[8];
- char sz_total_file_write_count[8];
- char sz_success_file_write_count[8];
- char sz_last_source_update[8];
- char sz_last_sync_update[8];
- char sz_last_synced_timestamp[8];
- char sz_last_heart_beat_time[8];
- } FDFSStorageStatBuff;
tracker主要是做了什么呢?
对其进行解包,然后对这个保存在本地的storage的信息进行保存到文件中,调用
- status = tracker_save_storages();
调用
- tracker_mem_active_store_server(pClientInfo->pGroup, \
- pClientInfo->pStorage);
最后调用
- static int tracker_check_and_sync(struct fast_task_info *pTask, \
- const int status)
检查相应的改变状态,并将其同步等。(需要再详细看看)