osd接受數據流程:git
一、建立一個simplemessenger類,代碼0448行github
Messenger *ms_public = Messenger::create(g_ceph_context, g_conf->ms_type,
entity_name_t::OSD(whoami), "client",
getpid());tcp
二、綁定IP和端口,代碼0530行函數
r = ms_public->bind(g_conf->public_addr);this
該bind函數調用的是simplemessenger類中的bind函數,在bind函數中調用 accepter.bind(bind_addr, avoid_ports)spa
在accepter的bind函數中綁定ip和端口。.net
三、啓動註冊的messenger。在ceph_osd.cc 597行線程
ms_public->start();
ms_hbclient->start();
ms_hb_front_server->start();
ms_hb_back_server->start();
ms_cluster->start();
ms_objecter->start();server
start的函數的做用是清除讀取完的pipe。blog
四、在OSD類的init函數中把 osd加入調度器,OSD.cc 2147行,client_messenger->add_dispatcher_head(this);在此函數中調用simplemessenger類的ready函數,啓動accepter.start函數
五、該start函數會調用accepter類的entry啓動一個接受線程。在entry函數中246行,把sd加入到接收隊列中
msgr->add_accept_pipe(sd);
六、在add_accept_pip函數中啓動讀消息函數346行,p->start_reader(); start_reader會啓動reader類的entry,在entry中啓動PIPE類的讀函數,讀取信息。
七、在reader函數中調用tcp_read讀取tag,tag == CEPH_MSGR_TAG_MSG纔會真正的讀取信息調用read_message(&m, auth_handler.get()),把會話保存在m中,在源碼1644行調用 in_q->fast_preprocess(m);預處理消息。
八、待續
參考https://my.oschina.net/u/2460844/blog/534390
http://bean-li.github.io/ceph-network-message-3/