ceph源碼osd分析

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/

相關文章
相關標籤/搜索