




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ceph 源碼分析之讀寫(xiě)操作流程(2)上一篇介紹了ceph 存儲(chǔ)在上兩層的消息邏輯,這一篇主要介紹一下讀寫(xiě)操作在底兩層的流程。下圖是上一篇消息流程的一個(gè)總結(jié)。 上在 ceph 中,讀寫(xiě)操作由于分布式存儲(chǔ)的原因,故走了不同流程。對(duì)于讀操作而言:1.客戶端直接計(jì)算出存儲(chǔ)數(shù)據(jù)所屬于的主osd,直接給主osd上發(fā)送消息。2.主 osd 收到消息后,可以調(diào)用Filestore 直接讀取處在底層文件系統(tǒng)中的主pg 里面的內(nèi)容然后返回給客戶端。具體調(diào)用函數(shù)在 ReplicatedPG:do_osd_ops 中實(shí)現(xiàn)。讀操作代碼流程如圖:如我們之前說(shuō)的,當(dāng)確定讀操作為主osd 的消息時(shí)( CEPH_MSG_OS
2、D_OP 類(lèi)型),會(huì)調(diào)用到ReplicatePG:do_osd_op 函數(shù),該函數(shù)對(duì)類(lèi)型做進(jìn)一步判斷,當(dāng)發(fā)現(xiàn)為讀類(lèi)型(CEPH_OSD_OP_READ )時(shí) ,會(huì)調(diào)用FileStore 中的函數(shù)對(duì)磁盤(pán)上數(shù)據(jù)進(jìn)行讀。cpp view plain copy int ReplicatedPG:do_osd_ops(OpContext*ctx, vector<OSDOp>& ops)switch (op.op) caseCEPH_OSD_OP_READ:+ctx->num_read;/ read into a bufferbufferlistbl;int r = osd-&g
3、t;store->read(coll, soid,op.extent.offset, op.extent.length, bl);/ 調(diào)用FileStore:read從底層文件系統(tǒng)讀取caseCEPH_OSD_OP_WRITE:+ctx->num_write;/寫(xiě)操作只是做準(zhǔn)備工作,并不實(shí)際的寫(xiě)FileStore:read函數(shù)是底層具體的實(shí)現(xiàn),會(huì)通過(guò)調(diào)用系統(tǒng)函數(shù)如:open,:pread,:close 等函數(shù)來(lái)完成具體的操作。cpp viewplain copy int FileStore:read(coll_t cid,constghobject_t& oid,uint6
4、4_t offset,size_t len,bufferlist& bl,bool allow_eio)int r = lfn_open(cid, oid, false, &fd);got = safe_pread(*fd, bptr.c_str(), len, offset);/FileStore:safe_pread 中調(diào)用了 :preadlfn_close(fd);而對(duì)于寫(xiě)操作而言,由于要保證數(shù)據(jù)寫(xiě)入的同步性就會(huì)復(fù)雜很多:1.首先客戶端會(huì)將數(shù)據(jù)發(fā)送給主osd,2.主 osd 同樣要先進(jìn)行寫(xiě)操作預(yù)處理,完成后它要發(fā)送寫(xiě)消息給其他的從osd,讓他們對(duì)副本pg 進(jìn)行更改,3.從
5、 osd 通過(guò) FileJournal 完成寫(xiě)操作到Journal 中后發(fā)送消息告訴主 osd 說(shuō)完成,進(jìn)入54.當(dāng)主 osd 收到所有的從osd 完成寫(xiě)操作的消息后,會(huì)通過(guò)FileJournal 完成自身的寫(xiě)操作到Journal 中。完成后會(huì)通知客戶端,已經(jīng)完成了寫(xiě)操作。5.主 osd,從 osd 的線程開(kāi)始工作調(diào)用Filestore 將 Journal 中的數(shù)據(jù)寫(xiě)入到底層文件系統(tǒng)中。在介紹寫(xiě)操作的流程前,需要先介紹一下ceph 中的 callback 函數(shù)。Context 類(lèi)定義在src/include 文件中,該類(lèi)是一個(gè)回調(diào)函數(shù)類(lèi)的抽象類(lèi),繼承它的類(lèi)只要在子類(lèi)實(shí)現(xiàn)它的finish 函數(shù),
6、在finish 函數(shù)調(diào)用自己需要回調(diào)的函數(shù),就可以完成回調(diào)。cpp view plain copy class Context Context(constContext& other);const Context&operator=(const Context& other);protected:virtual void finish(int r) = 0;public:Context() virtual Context() / we want a virtualdestructor!virtual void complete(int r) finish(r);dele
7、te this;Finisher 類(lèi)是在 src/common 中定義的一個(gè)專門(mén)查看操作是否結(jié)束的一個(gè)類(lèi)。在這個(gè)類(lèi)里面擁有一個(gè)線程 finisher_thread 和一個(gè)類(lèi)型為Context 指針的隊(duì)列finisher_queue。當(dāng)一個(gè)操作線程完成自己的操作后,會(huì)將Context 類(lèi)型對(duì)象送入隊(duì)列。此時(shí)finisher_thread 線程循環(huán)監(jiān)視著自己的finisher_queue 隊(duì)列,當(dāng)發(fā)現(xiàn)了有新進(jìn)入的Context 時(shí),會(huì)調(diào)用這個(gè)Context:complete 函數(shù),這個(gè)函數(shù)則會(huì)調(diào)用到 Context 子類(lèi)自己實(shí)現(xiàn)的finish 函數(shù)。來(lái)處理操作完成后的后續(xù)工作。cpp view p
8、lain copy class Finisher CephContext*cct;vector<Context*>finisher_queue;void*finisher_thread_entry();struct FinisherThread : publicThread Finisher *fin;FinisherThread(Finisher *f) : fin(f) void* entry() return (void*)fin->finisher_thread_entry(); finisher_thread;void*Finisher:finisher_threa
9、d_entry()while(!finisher_stop)while(!finisher_queue.empty()vector<Context*> lsls.swap(finisher_queue);for(vector<Context*>:iterator p = ls.begin();p != ls.end();+p) if(*p) /這里面調(diào)用 Context 子類(lèi)實(shí)現(xiàn)的 finish函數(shù)(*p)->complete(0);在寫(xiě)操作中涉及了多個(gè)線程和消息隊(duì)列的協(xié)同工作,需要注意的是一個(gè)類(lèi)擁有一個(gè)Finisher成員時(shí),以為著它同時(shí)獲得了一個(gè)隊(duì)列和一個(gè)執(zhí)行
10、線程。OSD 中處理讀寫(xiě)操作是線程池和消息隊(duì)列(有很多, 其他暫時(shí)不討論):cpp view plain copy ThreadPoolop_tp;ThreadPool:WorkQueueVal<pair<PGRef,OpRequestRef>, PGRef>&op_wq;FileJournal 中擁有的線程和消息隊(duì)列:cpp view plain copy Writewrite_thread;deque<write_item> writeq;其父類(lèi) Journal 中擁有線程和消息隊(duì)列(引用自之前說(shuō)的JournalingObjectStore 類(lèi)中
11、):cpp view plain copy Finisherfinisher_thread;FileStore 中擁有的線程和消息隊(duì)列:cpp view plain copy ThreadPoolop_tp;op_wq;/Filestore 中實(shí)現(xiàn),繼承自ThreadPool:WorkQueue<OpSequencer>ondisk_finisher;Finisherop_finisher;OpWQFinisher前一章說(shuō)過(guò)在前兩層, OSD 根據(jù)不同的消息類(lèi)型,選擇了主OSD 處理和從 OSD 的處理,以下介紹的寫(xiě)流程,就是在收到具體寫(xiě)操作以后,本地OSD 開(kāi)始的工作。寫(xiě)的邏輯流
12、程圖如圖:從圖中我們可以看到寫(xiě)操作分為以下幾步:1.OSD:op_tp 線程從 OSD:op_wq 中拿出來(lái)操作如本文開(kāi)始的圖上描述,具體代碼流是ReplicatePG:apply_repop 中創(chuàng)建回調(diào)類(lèi)C_OSD_OpCommit 和 C_OSD_OpAppliedFileStore:queue_transactions 中創(chuàng)建了回調(diào)類(lèi)C_JournaledAhead2.FileJournal:write_thread 線程從 FileJournal:writeq 中拿出來(lái)操作,主要就是寫(xiě)數(shù)據(jù)到具體的journal 中,具體代碼流:3.Journal:Finisher.finisher_t
13、hread 線程從Journal:Finisher.finish_queue 中拿出來(lái)操作,通過(guò)調(diào)用C_JournalAhead 留下的回調(diào)函數(shù)FileStore:_journaled_ahead,該線程開(kāi)始工作兩件事:首先入底層FileStore:op_wq 通知開(kāi)始寫(xiě),再入 FileStore:ondisk_finisher.finisher_queue通知可以返回。具體代碼流: 4.FileStore:ondisk_finisher.finisher_thread線程從 FileStore:ondisk_finisher.finisher_queue中拿出來(lái)操作,通過(guò)調(diào)用C_OSD_OpCommit 留下來(lái)的回調(diào)函數(shù)ReplicatePG:op_commit ,通知客戶端寫(xiě)操作成功5.FileStore:op_tp 線程池從FileStore:op_wq 中拿出操作(此處的 OP_WQ 繼承了父類(lèi)ThreadPool:WorkQueue 重寫(xiě)了_process 和_process_finish 等函數(shù),所以不同于OSD:op_
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 施工技術(shù)課程總結(jié)
- 2025-高校教師職業(yè)道德修養(yǎng)考前通關(guān)必練題庫(kù)-含答案
- 2025屆江蘇省南京、淮安市高三沖刺診斷考試數(shù)學(xué)試題試卷
- 茶業(yè)制作培訓(xùn)課件
- 手機(jī)管理家庭教育指導(dǎo)
- 司法機(jī)關(guān)對(duì)青少年犯罪預(yù)防教育計(jì)劃
- 2025天津房屋租賃合同協(xié)議
- 激光產(chǎn)品認(rèn)證聲明
- 個(gè)人民間借款合同范例二零二五年
- SET流程及相關(guān)加密技術(shù)二零二五年
- 神經(jīng)病學(xué)(第8版)第六章-周?chē)窠?jīng)疾病
- 印刷服務(wù)投標(biāo)方案(技術(shù)方案)
- 國(guó)家開(kāi)放大學(xué)2024年《知識(shí)產(chǎn)權(quán)法》形考任務(wù)1-4答案
- 2023圖解商用密碼應(yīng)用安全性評(píng)估
- (高清版)DZT 0004-2015 重力調(diào)查技術(shù)規(guī)范(150 000)
- 新能源技術(shù)在國(guó)防軍工領(lǐng)域的應(yīng)用與研究
- 高中英語(yǔ)語(yǔ)法課件-狀語(yǔ)從句(共40張)
- 永磁同步電機(jī)直接轉(zhuǎn)矩控制
- 物種起源少兒彩繪版
- 第6課《求助電話》課件
- 小學(xué)課后服務(wù)閱讀教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論