ceph Timer原始碼分析

2021-09-01 12:09:59 字數 2041 閱讀 4538

ceph定時器主要用來實現某些定時任務,比如osd之間的心跳,monitor之間的心跳等.

原始檔:

src/common/timer.h

src/common/timer.cc

src/include/context.h

ceph中的事件都繼承自context類,並且實現自己的事件處理方法finish().例如基於定時器的心跳機制就是在finish中每隔一段時間傳送乙個ping請求.

class context 

virtual ~context() {} // we want a virtual destructor!!!

virtual void complete(int r)

};

定時器執行緒用於執行定時器任務,具體的任務處理方法由safetimer類的timer_thread()定義.

class safetimerthread : public thread 

void *entry()

};

定時器由定時器執行緒和定時器任務組成,由定時器執行緒週期的處理定時器任務.

class safetimer:

主要資料成員:

cephcontext *cct

mutex &lock

cond cond

bool safe_callbacks

safetimerthread *thread 定時器執行緒

// schedule和events都表示定時器任務集,

// 前者採取時間到事件的對映方式,主要用於定時器執行緒按時間執行定時器任務.

// 後都採用事件到迭代器的對映方法,主要用於主線程按事件名取消事件.

multimapschedule

map::iterator> events

bool stopping 定時器執行緒的終止狀態標誌

主要成員函式:

init():

thread = new safetimerthread(this) 新建定時器執行緒

thread->create("safe_timer") 啟動定時器執行緒

timer_thread(): 定時器執行緒的執行函式

確定定時器執行緒處於執行狀態,即stopping為false.

當事件集schedule不為空時,迴圈檢查事件是否期執行.

事件在schedule中是按照時間公升序排列的.

如果第乙個事件沒有到時間,後面的事件就不用檢查了,直接終止迴圈,然後等待.

如果第乙個事件到定時時間,就呼叫它的finish()進行處理

處理完當前事件後,等待直到下乙個事件的時間.

shutdown():

取消全部定時器事件

銷毀定時器執行緒thread

add_event_after(double seconds, context *callback):

基於相對時間when增加定時器事件

add_event_at(utime_t when, context *callback):

基於絕對時間when增加定時器事件

cancel_event(context *callback):

根據事件名取消定時器事件

cancel_all_event():

取消全部定時器事件

question:

定時器執行緒乙個時刻只能處理乙個事件,那如果有兩個事件時間相同,怎麼處理?

理論上乙個執行緒不可能同時執行兩個事件,問題的關鍵在於timer_thread()函式的在執行:定時器事件是按執行時間排序的,因此定時器執行緒執行事件的過程是,執行乙個事件,等待一段時間,執行下乙個事件…因此如果兩個事件的執行時間相同,那麼定時器執行緒不等待直接執行該事件,由於每個事件的執行時間很短,因此可以近似認為兩個事件是同時執行的.這裡其實用到了乙個小技巧:pthread_cond_timedwait(cond, mutex, time),time是絕對時間,如果time值大於當前時間now,那麼執行緒等待now-time,但如果time小於等於now,那麼執行緒不等待直接執行.

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...

redux原始碼分析(三) 原始碼部分

下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...