ATS寫文件

與讀緩存類似,寫緩存也有大文件小文件的區分,這裏先討論寫小文件。大致的思想就是將CacheVC::blocks中的數據拷貝到agg_buf中,整個流程如下:wKiom1g4Af7h02rFAAGgouQkqQY918.png

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並執行。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章