PostgreSQL multixact日誌管理器說明

PostgreSQL multixact日誌管理器說明

MultiXactID日誌是uxdb系統用來記錄組合事務ID的一種日誌。由於uxdb採用了多版本併發控制,因此同一個元組相關聯的事務ID可能有多個,爲了在加鎖(行共享鎖)的時候統一操作,uxdb將與該元組相關聯的多個事務ID組合起來用一個MultiXactID代替來管理。同CLOG、Subtrans日誌一樣,MultiXact日誌也是利用SLRU緩衝池來實現。

MultiXact日誌管理器相關數據結構

MultiXactID是一個多對一的映射關係,需要在事務ID數組中標記哪一段映射到一個MultiXactID。所以在映射的過程中需要存儲兩種信息,即需要標誌一段事務ID的偏移量(Offset),還需要激勵這段偏移量的大小(nMembers)。

由於需要對MultiXactdID的分配進行維護,於是定義了數據結構MultiXactStateData。

MultiXactStateData用來管理和維護MultiXactID,另外還需要定義一個統一的接口來操作MultiXactID,即存儲這種多對一的映射關係,uxdb定義mXactCacheEnt來完成此工作。

multixact日誌存儲在uxdata/ux_multixactd/目錄下,其中會有兩個子目錄members和offset,分別存儲XactID成員和偏移量。從一個MultiXactID映射到具體的存儲位置是通過下面的變換來完成的:

TODO

MultiXact日誌的緩衝區用兩個slru緩衝池來實現,分別是MultiXactOffsetCtl和MultiXactMemberCtl,分別記錄Members和Offsets。在uxdb啓動後,就註冊在共享內存中,管理全局的MultiXactID。

MultiXact日誌管理器主要操作

同CLOG日誌管理器一樣,MultiXact日誌管理器的操作包括Multixact日誌系統的啓動、關閉、檢查點操作,以及MultiXactID的創建、擴增等。

Multixact的創建

改操作定義在函數MultiXactIdCreate中。MultiXactID的創建指的是將兩個XID組合成一個整體,結果返回一個MultiXactID,用來代替這兩個XID。創建過程如下:

  1. 首先在當前進程MXactCache中查找這兩種XID的組合是不是已經生成了一個MultixactID,如果已經生成,直接返回MultiXactID即可。

  2. 調用GetNewMultiXactId函數從共享內存MultiXactState中獲得一個新的MultiXactID,並更新MultiXactState中的nextMXact和nextOffset。

  3. 向XLOG中寫入當前操作的日誌,記錄當前分配得到的MultiXactID以及組合成該MultiXactID的Xids鏈表和數量。

  4. 最後將該MultiXactID以及相關Xids更新到本地緩存中,返回MultiXactID。

Multixact的擴增

該操作定義在函數MultiXactIdExpand中。我們知道,一個MultiXactID可以對應多個Xid,而上面的MultiXactID的創建只能完成兩個Xid到一個MultiXactID的映射過程,於是定義了MultiXactIdExpand()來完成MultiXactdID的擴增,即將一個Xid加入到該MultiXactID對應的Xids隊列中。

  1. 首先有MultiXactID找到對應的Xids隊列和數量。

  2. 檢查該MultiXactID是否有對應成員存在,若不存在,創建一個僅由該Xid組成的MultiXactID返回即可。

  3. 檢查該Xid是否已經在當前MultiXactID對應的Xids中,若存在,直接返回即可。

  4. 將該MultiXactID對應的Xids鏈表取出,將新增的Xid放到其末尾,然後重新調用MultiXactdIdCreate()得到新的MultiXactID,最後返回該值。

檢測MultiXact是否在運行中

該操作定義在函數MultiXactIdIsRunning中,其邏輯比較簡單,當該MultiXactID中的任何一個成員屬於當前事務ID或者正在運行中,則認爲該MultiXactID也在運行中。

4)Multixact日誌系統的啓動

該操作定義在函數StartupMultiXact中,一般在Uxdbmaster啓動時通過調用StartupXlog進而調用StartupMultiXact。主要功能是用來初始化管理MultiXactID的偏移量和成員的兩個slru緩衝池。

5)Multixact日誌系統的關閉

該操作在函數ShutdownMultiXact中定義,用來完成MultiXactID日誌系統的關閉。通過調用SimpleLruFlush函數將管理MultiXactID的偏移量和成員的兩個slru緩衝池刷新到磁盤即可。

6)MultiXact日誌系統檢查點操作

在創建檢查點時,MultiXactID日誌系統也需要刷新到磁盤,所以CheckPointMultiXact用來將管理MultiXactID的偏移量和成員的兩個slru緩衝池刷新到磁盤。與MultiXact日誌的關閉不同的是,在這個刷新的過程中,允許其他進程向緩衝池中寫日誌。

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