FastTracker进程总共有9个线程(默认配置, 根据配置文件可以更改工作线程(work_thread_entrance)数量)在运行:
1:
主进程创建其他进程后主要就是在listen客户端的连接:
tracker_accept_loop: 每当一个连接进来, 就将socket号传递给工作线程work_thread_entrance线程; 传递采用了libevent的peer socket方式传递给工作线程:
write(pThreadData->pipe_fds[1], &incomesock, sizeof(incomesock)) != sizeof(incomesock));
工作线程的选择主要是根据socket号被工作线程数取余的方式选择。因此工作线程是采用线程池的方式工作。
2:
工作线程(work_thread_entrance)将peer socket的另一端pipe_fds[0] 加入到libevent的的事件处理中,处理事件的函数是recv_notify_read;工作线程在libevent提供的处理接口event_base_loop上等待并处理收到 的事件。当收到主进程的accept后的事件后,recv_notify_read就读取accept的socket。获取一个空闲的连接处理任务:fast_task_info; 在socket上设置读和写的事件处理接口client_sock_read和client_sock_write(利用libevent的机制来处理读写)。发送的接口是send_add_event,也是采用事件的方式来发送数据。client_sock_read中处理消息的接口是:tracker_deal_task。
3:
httpd_entrance: 处理http消息的线程,主要由generic_handler来处理http来的事件,也是采用libevent来的事件方式来处理。主要是用于处理http的查询消息。
4:
http_check_entrance :用于定时检查storage server是否正常,主要是建立到storage的连接是否可以建立。
5:
sched_thread_entrance: 主要来处理一些本地全局变量,storage状态写入文件等事件。
log_sync_func: 将日志同步到磁盘;
tracker_mem_check_alive: 找出不活动的 storage server,接下来并更改 storage 的状态
fdfs_stat_file_sync_func: 将统计数据同步到磁盘;
6:
relationship_thread_entrance:主要是用于选择leader和维护leader。
后续几个线程写的比较简单,后续完善