1. 程式人生 > >小夥伴們的ceph原始碼分析三——monitor訊息處理流程

小夥伴們的ceph原始碼分析三——monitor訊息處理流程

筆者在讀程式碼初期非常想理清楚的就是ceph這麼個系統在服務端與客戶端是怎麼響應與發起請求的。

本人主要負責monitor部分,而且追了一會cephx認證的程式碼,所以拿這塊舉例,後續osd部分主要是對同事分享的學習。

本篇會講到src/mon/monitor.cc中

class Monitor : public Dispatcher

class MonClient : public Dispatcher 

以及src/tools/ceph.cc

這三者的關係:

前一篇講到ceph-mon.cc中啟動了monitor的程序,而啟動的過程伴隨著一些訊息佇列的啟動:

void SimpleMessenger::ready()

{

  ldout(cct,10) << "ready "<< get_myaddr()<< dendl;

  dispatch_queue.start();//訊息接收佇列啟動

  lock.Lock();

  if (did_bind)

    accepter.start();//套接字啟動(如前一篇所說)

  lock.Unlock();

}


1. monitor:


細節就不多說了,在entry()中我們可以看到有個while迴圈輪訓監聽,處理monitor接受到的請求,接下來是monitor對單條訊息的處理:



2. monclient



monclient

與monitor對應,monitor為服務端,monclient為客戶端,最初的猜想是所有需要和monitor打交道的程式都要例項化一個monclient,但是實際上monclient只處理一些特定的訊息:

  // we only care about these message types
  switch (m->get_type()) {
  case CEPH_MSG_MON_MAP:
  case CEPH_MSG_AUTH_REPLY:
  case CEPH_MSG_MON_SUBSCRIBE_ACK:
  case CEPH_MSG_MON_GET_VERSION_REPLY:
  case MSG_MON_COMMAND_ACK:
  case MSG_LOGACK:
    break;
  default:
    return false;
  }

3. src/tools/ceph.cc

說到這裡,ceph.cc還沒出場,這裡引入一個容易混淆的概念:

比如說我在終端輸入ceph mon dump,這個時候發生了什麼?這是一個向monitor請求的命令,而且是客戶端發起的,是不是會例項化一個monclient,這個命令如何對應到程式碼中?

答案是,這個命令直觀的看,跟monclient沒有半毛錢關係(其實後面認證的時候有關係),它的入口是src/tools/ceph.cc(其實0.65版本之後不是了,後面會說明),這段程式碼的邏輯如下:



4. 總結

src/tools/ceph.cc是命令列的入口,而monclient是一個抽象的概念,在需要跟monitor打交道的時候,而且是處理上面所說的那幾種訊息的時候才會用到。

另外,從0.65版本後ceph.cc棄用了,你可以file /usr/bin/ceph  或者是/usr/local/bin/ceph,變成了個python指令碼,但是處理邏輯差不多