![ceph源碼分析之讀寫操作流程(2).doc_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-9/23/61b9c660-77f2-4f04-b30c-4258a48e3bb7/61b9c660-77f2-4f04-b30c-4258a48e3bb71.gif)
![ceph源碼分析之讀寫操作流程(2).doc_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-9/23/61b9c660-77f2-4f04-b30c-4258a48e3bb7/61b9c660-77f2-4f04-b30c-4258a48e3bb72.gif)
![ceph源碼分析之讀寫操作流程(2).doc_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-9/23/61b9c660-77f2-4f04-b30c-4258a48e3bb7/61b9c660-77f2-4f04-b30c-4258a48e3bb73.gif)
![ceph源碼分析之讀寫操作流程(2).doc_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-9/23/61b9c660-77f2-4f04-b30c-4258a48e3bb7/61b9c660-77f2-4f04-b30c-4258a48e3bb74.gif)
![ceph源碼分析之讀寫操作流程(2).doc_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-9/23/61b9c660-77f2-4f04-b30c-4258a48e3bb7/61b9c660-77f2-4f04-b30c-4258a48e3bb75.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、ceph 源碼分析之讀寫操作流程(2)上一篇介紹了ceph 存儲在上兩層的消息邏輯,這一篇主要介紹一下讀寫操作在底兩層的流程。下圖是上一篇消息流程的一個總結。 上在 ceph 中,讀寫操作由于分布式存儲的原因,故走了不同流程。對于讀操作而言:1.客戶端直接計算出存儲數(shù)據(jù)所屬于的主osd,直接給主osd上發(fā)送消息。2.主 osd 收到消息后,可以調用Filestore 直接讀取處在底層文件系統(tǒng)中的主pg 里面的內容然后返回給客戶端。具體調用函數(shù)在 ReplicatedPG:do_osd_ops 中實現(xiàn)。讀操作代碼流程如圖:如我們之前說的,當確定讀操作為主osd 的消息時( CEPH_MSG_OS
2、D_OP 類型),會調用到ReplicatePG:do_osd_op 函數(shù),該函數(shù)對類型做進一步判斷,當發(fā)現(xiàn)為讀類型(CEPH_OSD_OP_READ )時 ,會調用FileStore 中的函數(shù)對磁盤上數(shù)據(jù)進行讀。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);/ 調用FileStore:read從底層文件系統(tǒng)讀取caseCEPH_OSD_OP_WRITE:+ctx->num_write;/寫操作只是做準備工作,并不實際的寫FileStore:read函數(shù)是底層具體的實現(xiàn),會通過調用系統(tǒng)函數(shù)如:open,:pread,:close 等函數(shù)來完成具體的操作。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 中調用了 :preadlfn_close(fd);而對于寫操作而言,由于要保證數(shù)據(jù)寫入的同步性就會復雜很多:1.首先客戶端會將數(shù)據(jù)發(fā)送給主osd,2.主 osd 同樣要先進行寫操作預處理,完成后它要發(fā)送寫消息給其他的從osd,讓他們對副本pg 進行更改,3.從
5、 osd 通過 FileJournal 完成寫操作到Journal 中后發(fā)送消息告訴主 osd 說完成,進入54.當主 osd 收到所有的從osd 完成寫操作的消息后,會通過FileJournal 完成自身的寫操作到Journal 中。完成后會通知客戶端,已經完成了寫操作。5.主 osd,從 osd 的線程開始工作調用Filestore 將 Journal 中的數(shù)據(jù)寫入到底層文件系統(tǒng)中。在介紹寫操作的流程前,需要先介紹一下ceph 中的 callback 函數(shù)。Context 類定義在src/include 文件中,該類是一個回調函數(shù)類的抽象類,繼承它的類只要在子類實現(xiàn)它的finish 函數(shù),
6、在finish 函數(shù)調用自己需要回調的函數(shù),就可以完成回調。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 類是在 src/common 中定義的一個專門查看操作是否結束的一個類。在這個類里面擁有一個線程 finisher_thread 和一個類型為Context 指針的隊列finisher_queue。當一個操作線程完成自己的操作后,會將Context 類型對象送入隊列。此時finisher_thread 線程循環(huán)監(jiān)視著自己的finisher_queue 隊列,當發(fā)現(xiàn)了有新進入的Context 時,會調用這個Context:complete 函數(shù),這個函數(shù)則會調用到 Context 子類自己實現(xiàn)的finish 函數(shù)。來處理操作完成后的后續(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) /這里面調用 Context 子類實現(xiàn)的 finish函數(shù)(*p)->complete(0);在寫操作中涉及了多個線程和消息隊列的協(xié)同工作,需要注意的是一個類擁有一個Finisher成員時,以為著它同時獲得了一個隊列和一個執(zhí)行
10、線程。OSD 中處理讀寫操作是線程池和消息隊列(有很多, 其他暫時不討論):cpp view plain copy ThreadPoolop_tp;ThreadPool:WorkQueueVal<pair<PGRef,OpRequestRef>, PGRef>&op_wq;FileJournal 中擁有的線程和消息隊列:cpp view plain copy Writewrite_thread;deque<write_item> writeq;其父類 Journal 中擁有線程和消息隊列(引用自之前說的JournalingObjectStore 類中
11、):cpp view plain copy Finisherfinisher_thread;FileStore 中擁有的線程和消息隊列:cpp view plain copy ThreadPoolop_tp;op_wq;/Filestore 中實現(xiàn),繼承自ThreadPool:WorkQueue<OpSequencer>ondisk_finisher;Finisherop_finisher;OpWQFinisher前一章說過在前兩層, OSD 根據(jù)不同的消息類型,選擇了主OSD 處理和從 OSD 的處理,以下介紹的寫流程,就是在收到具體寫操作以后,本地OSD 開始的工作。寫的邏輯流
12、程圖如圖:從圖中我們可以看到寫操作分為以下幾步:1.OSD:op_tp 線程從 OSD:op_wq 中拿出來操作如本文開始的圖上描述,具體代碼流是ReplicatePG:apply_repop 中創(chuàng)建回調類C_OSD_OpCommit 和 C_OSD_OpAppliedFileStore:queue_transactions 中創(chuàng)建了回調類C_JournaledAhead2.FileJournal:write_thread 線程從 FileJournal:writeq 中拿出來操作,主要就是寫數(shù)據(jù)到具體的journal 中,具體代碼流:3.Journal:Finisher.finisher_t
13、hread 線程從Journal:Finisher.finish_queue 中拿出來操作,通過調用C_JournalAhead 留下的回調函數(shù)FileStore:_journaled_ahead,該線程開始工作兩件事:首先入底層FileStore:op_wq 通知開始寫,再入 FileStore:ondisk_finisher.finisher_queue通知可以返回。具體代碼流: 4.FileStore:ondisk_finisher.finisher_thread線程從 FileStore:ondisk_finisher.finisher_queue中拿出來操作,通過調用C_OSD_OpCommit 留下來的回調函數(shù)ReplicatePG:op_commit ,通知客戶端寫操作成功5.FileStore:op_tp 線程池從FileStore:op_wq 中拿出操作(此處的 OP_WQ 繼承了父類ThreadPool:WorkQueue 重寫了_process 和_process_finish 等函數(shù),所以不同于OSD:op_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字化時代下的客戶分析與銷售策略
- 現(xiàn)代辦公技術與應用實踐培訓
- 數(shù)學圖形在兒童智力開發(fā)中的作用
- 科學實驗教學對小學生綜合素質的培養(yǎng)策略
- 項目突發(fā)環(huán)境事件應急預案
- 二手車批發(fā)合作合同協(xié)議
- 個人向個人臨時借款合同模板
- 上海市租賃合同模板及示例
- 不銹鋼期貨電子交易合同
- 個人房屋銷售合同簡易范本
- 云南省曲靖市羅平縣2024-2025學年高二上學期期末地理試題( 含答案)
- 中國糖尿病防治指南(2024版)要點解讀
- Unit 1 Nice boys and girls【知識精研】-一年級英語下學期(人教PEP版一起)
- 2024年高考數(shù)學(理)試卷(全國甲卷)(空白卷)
- 2024版CSCO胰腺癌診療指南解讀課件
- 九宮數(shù)獨200題(附答案全)
- 中考數(shù)學試題(含答案)共12套
- GB/T 4513.7-2017不定形耐火材料第7部分:預制件的測定
- GB/T 10205-2009磷酸一銨、磷酸二銨
- 公司財務制度及流程
- 深圳版初中英語單詞匯總
評論
0/150
提交評論