ATS缓存数据结构
ATS緩存數據結構
HttpTunnel類
數據傳輸驅動器(data transfer driver),包含一個生產者(producer)集合,每個生產者連接到一個或是多個消費者(comsumer)。隧道(tunnel)處理事件和緩沖區以便數據能從生產者移動到消費者,數據會盡可能保存在引用計數類型的緩沖區中。只有數據發生變動,或者在數據源(它從ATS外部獲取數據)和數據接收端(它將數據發送到ATS外部)的情況下,才會發生拷貝操作。
HTTPCacheAlt類
定義在HTTP.h中,它是一個緩存對象中單個副本的元數據(metadata)。包含下面的信息:
- 副本的earliest Doc對應的Dir
- 請求頭和響應頭信息
- 分片偏移表(fragment offset table)
- 源站請求和響應的時間戳(timestamp)
HTTPInfo類
定義在HTTP.h中,它是HTTPCacheAlt的包裝類。它提供了外部API來訪問包裝類內部的數據,它只含有一個指向包裝類實例的指針(可能為NULL)。
CacheHTTPInfo類
HTTPInfo類的typedef。
CacheHTTPInfoVector類
定義在P_CacheHttp.h中,它是HTTPInfo對象組成的數組,充當一個對象所有副本的信息倉庫。
OpenDir類
一個打開的目錄項(directory entry),包括一個Dir所有的信息,外加從first Doc中獲取的額外信息。
CacheVC類
接收輸入數據并寫到緩存中的虛擬連接類。
- int CacheVC::openReadStartHead(int event, Event *e)
執行讀取一個緩存對象(cached object)的初始化工作 - int CacheVC::openReadStartEarliest(int event, Event *e)
執行讀取一個緩存對象的副本(alternate)的初始化工作
CacheVol類
保存volume.config配置文件中一行的數據的類,一行表示一個緩存分卷。
CacheControlResult類
保存cache.config配置文件中一行的數據的類。
EvacuationBlock類
用于記錄疏散的相關信息(record for evacuation)。
Vol類
表示cache分卷內的一個存儲單元(過時的叫法storage unit,現在叫作cache strip),也叫作volume,注意跟磁盤分卷的那個volume是有區別的。
- off_t Vol::segments
緩存帶中的段的個數,由該緩存帶中的所有目錄項(directory entry)除以一個段中的目錄項數得到,是個粗略估計值。 - off_t Vol::buckets
緩存帶中的桶的個數,由目錄段中的所有目錄項(directory entry)除以DIR_DEPTH(當前為4)得到。是個粗略估計值,按照當前的定義值,這個數大約是16384(2^16/4),目錄桶用來作為索引哈希(index hash)的目標。 - DLL<EvacuationBlock> Vol::evacuate
元素為EvacuationBlock的桶組成的數組,它按照大小排序,以便每個疏散帶(evacuation span)都有一個EvacuationBlock桶。 - off_t len
緩存帶的字節長度。 - int Vol::evac_range(off_t low, off_t high, int evac_phase)
假如從low到high的字節帶上存在任何EvacuationBlock,就開始一次疏散。假如沒有疏散發生,返回0,否則返回非零值。
Doc類
在P_CacheVol.h中定義。
- uint32_t Doc::magic
校驗值,對合法文檔(document)設為DOC_MAGIC。 - uint32_t Doc::len
包含HTTP頭長度,分片表和Doc結構體的段的長度。 - Doc::total_len
整個文檔的總長度,不包含元數據,但是包含HTTP頭信息。 - Doc::first_key
文檔(document)的首個索引鍵值,用于定位cache帶中的緩存對象。 - Doc::key
分片的索引鍵值(index key),分片鍵值可以通過鏈式方法計算,使得下一個和上一個分片的鍵值可以從當前鍵值計算出來。 - uint32_t Doc::hlen
文檔頭(即元數據)長度,注意不是HTTP頭的長度。 - uint8_t Doc::ftype
分片類型,當前只用到CACHE_FRAG_TYPE_HTTP,其它類型用于后續緩存擴展,目前還沒有實現。 - uint24_t Doc::flen
分片表(fragment table)長度,假如存在分片表的話。一個緩存對象只有first Doc分片中才含有分片表。分片表是從第一個分片首字節開始計算時,各分片中HTTP響應內容(不包含元數據和HTTP頭)的相對字節偏移所組成的列表。分片表中的第一個元素表示的是第二個分片中的字節偏移,類似于數組從索引1開始計算,因為第一個分片的字節偏移是總是0,無須計算在內。這樣做的目的是為了在range請求的快速查找。假如給定first Doc分片,包含range請求首字節的分片將會直接計算和讀取,不需要更多的磁盤訪問。
ATS 3.3.0之后移除了。 - uint32_t Doc::sync_serial
- uint32_t Doc::write_serial
- uint32_t pinned
釘住對象(pinned object)的標志和計時器 - uint32_t checksum
VolHeaderFooter類
參考文獻
https://docs.trafficserver.apache.org/en/latest/developer-guide/architecture/data-structures.en.html
總結
- 上一篇: 利用lua中的string.gsub来巧
- 下一篇: ATS名词术语(待续)