librados 處理過程

2021-07-25 23:42:10 字數 3790 閱讀 2970

librados是ceph rados對外提供服務的原生api,本文是libradso介面呼叫的過程(從之前的文中摘錄)。

設定image 的id

ioctx->exec(oid, "rbd", "set_id", in, out)

>io_ctx_impl->exec(obj, cls, method, inbl, outbl)

>(::objectoperation)rd.call(cls, method, inbl) //將該操作封裝成osdop,放入objectoperation物件的vector集合中

>add_call(ceph_osd_op_call, cname, method, indata, null, null, null)

>operate_read(oid, &rd, &outbl) //發起讀請求

>objecter::op *objecter_op = objecter->prepare_read_op(oid, oloc,*o, snap_seq, pbl, flags,onack, &ver) //建立op的例項 資料結構變成op

>objecter->op_submit(objecter_op) //提交到objecter層 操作物件為objecter::op

>_op_submit_with_budget(op, lc, ctx_budget)

>int op_budget = _take_op_budget(op) //減去該op的預算for throttle;

>int op_budget = calc_op_budget(op) //預算值是該op的位元組大小

> _throttle_op(op, op_budget) //這裡是objecter的throttle層,如果keep_balanced_budget=true,能實現對速度的限制(op_throttle_bytes&op_throttle_ops)

>_op_submit(op, lc)

>_calc_target(&op->target, &op->last_force_resend) //計算該op的操作物件(用到crush演算法)

>_get_session(op->target.osd, &s, lc) //為該op構建與osd對應的osdsession

>_send_op_account(op) //登記該次op操作

> m = _prepare_osd_op(op) //使用op中的資訊,初始化mosdop的例項

>_session_op_assign(s, op) //將op與osdsession相關聯。

> _send_op(op, m)

>op->session->con->send_message(m) //進入massenger層,操作物件mosdop

>static_cast

(msgr)->send_message(m, this) //使用使用massenger層的******messenger的例項發生訊息

>_send_message(m, con)

>submit_message(m, static_cast

(con),con->get_peer_addr(), con->get_peer_type(), false) //提交資訊

>static_cast

(con)->try_get_pipe(&pipe) //獲取該pipconnection對應的pipe的例項

>pipe->_send(m) //通過pipe傳送訊息,即:把訊息放入到pipe::out_q佇列中,並通知pipe中的寫執行緒來做實際的發生操作。

>out_q[m->get_priority()].push_back(m);

>dispatch_queue.local_delivery(m, m->get_priority()) //如果傳送端與接收端是同乙個,則直接將訊息投遞到dispathcqueue::local_messages中。

寫入資料

m_ictx->data_ctx.aio_operate(m_oid, rados_completion, &m_write,m_snap_seq, m_snaps)

>io_ctx_impl->aio_operate(obj, (::objectoperation*)o->impl, c->pc,snapc, 0)

>objecter->mutate(oid, oloc, *o, snap_context, ut, flags, onack, oncommit,&c->objver) //進入objecter層

>prepare_mutate_op(oid, oloc, op, snapc, mtime, flags, onack, oncommit, objver) //封裝成op

>objecter->op_submit(objecter_op) //提交到objecter層 操作物件為objecter::op

>_op_submit_with_budget(op, lc, ctx_budget)

>int op_budget = _take_op_budget(op) //減去該op的預算for throttle;

>int op_budget = calc_op_budget(op) //預算值是該op的位元組大小

> _throttle_op(op, op_budget) //這裡是objecter的throttle層,如果keep_balanced_budget=true,能實現對速度的限制(op_throttle_bytes&op_throttle_ops)

>_op_submit(op, lc)

>_calc_target(&op->target, &op->last_force_resend) //計算該op的操作物件(用到crush演算法)

>_get_session(op->target.osd, &s, lc) //為該op構建與osd對應的osdsession

>_send_op_account(op) //登記該次op操作

> m = _prepare_osd_op(op) //使用op中的資訊,初始化mosdop的例項

>_session_op_assign(s, op) //將op與osdsession相關聯。

> _send_op(op, m)

>op->session->con->send_message(m) //進入massenger層,操作物件mosdop

>static_cast

(msgr)->send_message(m, this) //使用使用massenger層的******messenger的例項發生訊息

>_send_message(m, con)

>submit_message(m, static_cast

(con),con->get_peer_addr(), con->get_peer_type(), false) //提交資訊

>static_cast

(con)->try_get_pipe(&pipe) //獲取該pipconnection對應的pipe的例項

>pipe->_send(m) //通過pipe傳送訊息,即:把訊息放入到pipe::out_q佇列中,並通知pipe中的寫執行緒來做實際的發生操作。

>out_q[m->get_priority()].push_back(m);

>dispatch_queue.local_delivery(m, m->get_priority()) //如果傳送端與接收端是同乙個,則直接將訊息投遞到dispathcqueue::local_messages中。

摘錄於

摘錄於

USB host處理過程

在usbh core.c中有乙個函式usbh process 這個函式很重要,main 函式每迴圈一次,它就執行一次,它處理所有usb核心狀態的變化,typedef enum host state 根據這個當前狀態 phost gstate 處於以上哪個狀態的不同,做出不同的處理過程。其中最重要的要...

Hadoop map reduce處理過程

1 在hadoop中,每個mapreduce任務都被初始化為乙個job。每個job又可以分成兩個階段 map階段和reduce階段 map函式接受乙個形式的輸入,然後同樣產生乙個形式的中間輸出,hadoop會負責將所有具有相同結果中間key值的value集合到一起傳給reduce函式,reduce函...

Openstack nova api 處理過程

乙個python函式示例 乙個python類的示例 所有的web請求引數都被封裝在environ這個dictionary中,start response函式讓人難以理解,其主要作用是設定reponse的http返回碼和http header.返回的list的乙個item對應於http respons...