初始化執行緒間訊號量和執行緒池
tracker_service_init->work_thread_entrance
其主要處理:按接收通知訊息處理
recv_notify_read->event_set(client_sock_read)->client_sock_read->tracker_deal_task
這裡面有所有客戶端以及storage發起的客戶端請求訊息處理
g_check_file_duplicate說明有檔案備份存在,需要和serverarray內的所有伺服器握手。
common\sockopt.c 通訊使用tcp套接字,epoll/select接收資料報文
通訊佇列快取管理tracker\fast_task_queue.c,隊列為g_free_queue,初始化free_queue_init,刪除free_queue_destroy
申請記憶體:struct fast_task_info資料結構free_queue_pop->task_queue_pop,釋放記憶體:free_queue_push,包括大記憶體主動釋放功能,大於min_buff_size的申請記憶體直接釋放。
free佇列是共享的,各個任務佇列是區分開的。相同方式申請,分別使用。
libevent簡單介紹:
業務處理架構
以乙個fastdfs tranker客戶端查詢訪問流程為例簡單說明:
客戶端:
fastdfs_tracker_query_storage_store->php_fdfs_tracker_query_storage_store_impl->tracker_query_storage_store_with_group/tracker_query_storage_store_without_group->tcpsenddata_nb(tracker_proto_cmd_service_query_store_with_group_one/tracker_proto_cmd_service_query_store_without_group_one)/fdfs_recv_response
使用同步等待的方式,等待服務端的響應訊息
服務端:
tracker_deal_task(tracker_proto_cmd_service_query_store_with_group_one)->tracker_deal_service_query_storage
a、通過bsearch查詢g_groups組內名字匹配的fdfsgroupinfo
b、tracker_check_reserved_space計算保留空間
c、tracker_get_writable_storage,從當前寫的伺服器(應為storage)中的下乙個開始,current_write_server++先
d、將storegroup中所有的active_servers的ip位址寫入響應訊息體中,並返回給客戶端
Jetty 伺服器架構分析 下
說過了伺服器啟動,最後來看一下請求處理過程,伺服器啟動好後,處於待命狀態,請求來了,請求處理過程由分兩個建階段 前面有提到,從執行緒池中固定分配了乙個執行緒專門用於等待新連線,就是上圖的監聽執行緒,沒有請求來時,該執行緒是阻塞在 accept 方法上的,當新連線來建立連線時,accept 方法分配了...
Jetty 伺服器架構分析 下
說過了伺服器啟動,最後來看一下請求處理過程,伺服器啟動好後,處於待命狀態,請求來了,請求處理過程由分兩個建階段 前面有提到,從執行緒池中固定分配了乙個執行緒專門用於等待新連線,就是上圖的監聽執行緒,沒有請求來時,該執行緒是阻塞在 accept 方法上的,當新連線來建立連線時,accept 方法分配了...
Jetty 伺服器架構分析 下
說過了伺服器啟動,最後來看一下請求處理過程,伺服器啟動好後,處於待命狀態,請求來了,請求處理過程由分兩個建階段 前面有提到,從執行緒池中固定分配了乙個執行緒專門用於等待新連線,就是上圖的監聽執行緒,沒有請求來時,該執行緒是阻塞在 accept 方法上的,當新連線來建立連線時,accept 方法分配了...