ATS写文件
與讀緩存類似,寫緩存也有大文件小文件的區分,這里先討論寫小文件。大致的思想就是將CacheVC::blocks中的數據拷貝到agg_buf中,整個流程如下:
Cache::open_write: 根據key生成一個新key作為earliest_key,不過小文件的話貌似earlist_key沒用。根據CacheV->first_key計算的到vol。執行Vol::open_write,在Vol::open_write中進行了簡單的aggregation buf的錯誤檢查就執行了OpenDir::open_write。最后將CacheVC::openWriteMain設置為回調函數,流程結束。
OpenDir::open_write: 根據first_key計算bucket,原理就是最低32位處以bucket數量然后取余。遍歷這個bucket所有的位置看是否已經有寫操作了,如果沒有的話,新建一個OpenDirEntry對象并且放倒bucket中
CacheVC::openWriteMain: 設置讀寫相關的字節數,將資源在reader中consume掉,向continuation發送VC_EVENT_WRITE_COMPLETE信號
CacheVC::die: 設置回調函數為CacheVC::openWriteClose并執行
CacheVC::openWriteClose: 執行openWriteCloseHead
CacheVC::openWriteCloseHead: 設置回調函數為CacheVC::updateVector,并執行
CacheVC::updateVector: 設置了回調函數為CacheVC::openWriteCloseHeadDone,執行CacheVC::do_write_call。
CacheVC::do_write_call函數對回調函數執行了push操作,CacheVC::handleWrite函數又執行了pop操作。CacheVC::do_write_call最終返回了EVENT_RETURN,CacheVC::updateVector函數最后會執行回調函數CacheVC::openWriteCloseHeadDone。
CacheVC::handleWrite: 將回調函數POP出。計算大概大小,將CacheVC對象加入到vol->agg中,vol->agg是一個隊列,每個元素就是一個寫緩存的CacheVC。判斷是否已經有io操作正在進行了,如果沒有,直接執行Vol::aggWrite
Vol::aggWrite: 循環遍歷vol->agg隊列,判斷agg_buf是否還能裝下當前的資源,如果可以裝下,執行agg_copy,將CacheVC從vol->agg中刪除。
agg_copy: 設置dir的各個bit,初始化vc->dir各個bit。一開始將一個Doc類型指針指向agg_buf,并對這個Doc進行初始化。執行iobufferblock_memcpy,將vc中的內從拷貝到doc->data()。
CacheVC::openWriteCloseHeadDone: 執行了dir_insert函數,dir_insert函數中在特定的segment的特定的bucket中找一個位置放置這個資源的dir。最后執行CacheVC::openWriteCloseDir
dir_insert: 通過key找到對應的bucket,在freelist中找到一個位置,將dir放進去。
CacheVC::openWriteCloseDir: 做一些善后工作,釋放CacheVC的資源。
對于寫大文件,CacheVC::openWriteMain處理的邏輯有一些不同,具體如下:
CacheVC::openWriteMain: 會執行若干次,每次會對vio中的數據做一些處理,主要是初始化CacheVC::blocks,標記一些已經處理過的數據長度,本次處理的數據長度。如果攢夠了一個fragment的長度,就寫到agg_buf中,并且開始處理下一個fragment的數據。CacheVC::openWriteMain函數中并沒有實現數據的拷貝。
CacheVC::openWriteWriteDone:每個fragment數據處理完了會執行這個函數。函數執行了iobufferblock_skip,因為每次回向agg_buf中寫一個fragment那么多數據,但是執行CacheVC::openWriteWriteDone時已經處理過的數據可能大于一個fragment的長度,所以需要重新計算CacheVC::length。獲取了下一個key,將回調函數設置為CacheVC::openWriteMain并執行。
轉載于:https://blog.51cto.com/11490450/1876682
總結
- 上一篇: ceph对象存储折腾记
- 下一篇: 说说JavaScriptCore