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,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...