日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ATS写文件

發布時間:2025/5/22 编程问答 84 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的ATS写文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。