天天看點

Hypertable源碼解讀之Hypertable.lib目錄

1. Class  MetaLog:: Entity

一個metalog entity能關聯到一個應用程式,并能被持久化到metalog中。metalog entity對象能在metalog的讀寫API中傳入和傳出。

應用程式對象能包含一個繼承自該類的成員對象,用于持久化應用程式的專題。應用程式對象也能直接繼承該類,這樣應用程式對象就可以直接将自己傳入到metalog的API了。

2. Class  Metalog::Definition

定義一個伺服器上一組有效的metalog entity。

Hypertable中的metalog架構能持久化伺服器的狀态變化。繼承自該類的子類定義了一個特定伺服器上一組有效的metalog entity。它由名稱和create方法構成,名稱例如:mml或rsml,metalog架構從被持久化的metalog檔案中串行的擷取資料,并使用create方法構造得到entity。

3. class RangeSpec

辨別一個range,主要辨別了range的start row、end row和類型(ROOT、METADATA、SYSTEM、USER、UNKNOWN)。

4. class CommitLogFileInfo

表示一個commit log檔案,可能是一個fragment,也可能是一個transfer log檔案。主要成員變量如下:

log_dir:日志路徑,與CommitLogBase類的成員變量m_log_dir一般表示同樣含義;成

parent:一般用于transfer log的場景,即對象本身為一個transfer log檔案,其parent為一個fragment檔案;

references:引用數,當對象為其它commit log檔案的parent時,該值加1。如果一個commit log檔案被清理後,其parent的引用數減1;

purge_dirs:該對象連結的commit log的路徑,可在清理該對象時也對這些路徑進行清理。

5. class CommitLogBase

commit log基類,包含了commit log的基本資訊,表示主要資訊的成員變量如下:

m_log_dir:日志路徑,例如:/hypertable/tables/2/6/_xfer/PQM6R7RwsZuLfZrl/1394814644 或者/hypertable/servers/rs29/log/user;

m_log_name:commit log全名,例如:/hypertable/servers/rs29/log/user/2344;

m_fragment_queue:順序編号的commit log檔案的集合,即CommitLogFileInfo對象指針集合;

m_last_revision:commit log中cell的最新revision;

m_range_reference_required:如果fragment是transfer log的一部分,而後者正被range引用,如果該變量為true,将在commit log清理時隻删除fragment,否則transfer log也将被删除。此變量預設為true,可通過配置項Hypertable.RangeServer.CommitLog.FragmentRemoval.RangeReferenceRequired改變此值。

6. class CommitLogReader  :  public CommitLogBase

讀取指定commit log目錄下的所有fragment檔案,為每個檔案建立一個CommitLogFileInfo對象,并将指針對象加入m_fragment_queue。注意:每個檔案對象的parent都強制為空。

7. class CommitLog  :  public CommitLogBase

commit log就是持久化的range的更新資料。它是一個目錄,包含了一組按序号遞增的檔案,每個檔案包含了一組被送出的資料塊,并且壓縮後存儲。檔案名稱從0開始,将會周期性的復原,即當一個trailer寫入到檔案結尾時,舊的檔案将關閉,新的檔案名稱将會在舊檔案名稱上加1,然後被打開。commit log過時的内容會被周期性的清理。每個commit log檔案的大小由屬性Hypertable.RangeServer.CommitLog.RollLimit決定。

成員變量m_reap_set表示引用數不為0的fragment或者transfer log檔案集合,該集合内的檔案将會下輪清理時被考慮。

該對象構造時,需要指定一個基類類型的指針init_log。如果此指針為空,表示commit log的fragment從0開始,即全新的開端。否則将延續init_log中的fragment編号,并将init_log中的fragment加入目前的m_fragment_queue,然後清除init_log中的m_fragment_queue。構造函數最終會建立并打開一個最新的fragment檔案,以接收之後的commit log寫入。

7.1. 成員函數

7.1.1. roll

聲明:int  roll(CommitLogFileInfo **clfip);

功能:終結目前fragment的寫入,并建立和打開下一個fragment對象.建立一個CommitLogFIleInfo對象記錄目前fragment的資訊,并将其加入到m_fragment_queue中。置标記m_needs_roll為false.

參數:clfip輸出參數,記錄目前fragment資訊的對象指針。

傳回值:如果成功傳回Error::OK,否則傳回其餘錯誤代碼。

7.1.2. link_log

聲明:int CommitLog::link_log(CommitLogBase *log_base);

功能:将transfer log連結到fragment。

transfer log的基本資訊将被編碼到一個資料塊,然後寫入到目前的fragment,再終結目前fragment,即目前的fragment就是transfer log的parent。周遊transfer log的m_fragment_queue,将每個元素加入目前的m_fragment_queue中。如果元素的parent為空,則置其parent為目前fragment,并且fragment的引用數(references)加1.然後清除transfer log的m_fragment_queue,并對目前m_fragment_queue排序。

參數:log_base 需要被連結的transfer log。

傳回值:如果成功傳回Error::OK,否則傳回其餘錯誤代碼。

7.1.3. purge

聲明:int purge(int64_t revision, StringSet &remove_ok_logs,                     StringSet &removed_logs, String *trace);

功能:清理commit log,移除所有的revision小于給定值的fragment檔案。

Commit log檔案被移除必須滿足三個條件:1)檔案的revision小于參數中指定的revision;;2)檔案的引用數為0;3)m_range_reference_required 為false或者檔案的log_dir被包含在可被安全移除的路徑集合以内。将對m_reap_set和m_fragment_queue進行周遊,判斷每個元素能否被清除。後者如果發現一個不能被清除的元素,後續元素将不再進行操作。

參數:revision:  給定的revision;remove_ok_logs:能被安全移除的一組log路徑;  removed_logs:輸出參數,本次調用中産生的能被删除的log路徑。

傳回值:如果成功傳回Error::OK,否則傳回其餘錯誤代碼。

7.1.4. load_cumulative_sizse_map

聲明:void  load_cumulative_size_map(CumulativeSizeMap &cumulative_size_map);

功能:CumulativeSizeMap的key是一個commit log的fragment中的最大的revision,value是一個CumulaltiveFragmentData對象。該對象表示fragment的基本資訊和累積資訊,共有四個字段:size表示一個fragment的大小;fragno表示fragment編号;cumulative_size表示多個fragment的累積大小;distance表示該元素在map中的反序的次序。即在一個CumulativeSizeMap中,key越小的元素,其value的distance和cumulative_size越大。

1)将目前最新的fragment添加到cumulative_size_map,key為m_lastest_revision,value中隻記錄fragment的size和no;

2)反序周遊m_fragment_queue,将其中的每個fragment添加到cumulative_size_map,key為fragment的revision,value中隻記錄fragment的size和no;

3)反序周遊cumulative_size_map,對每個元素的value的distance從0開始順序編号,累加每個元素的value的size,并将累積結果賦予目前元素的value的cumulative_size成員。

參數:cumulative_size_map:  統計的得到的fragment資訊。

繼續閱讀