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。創建過程如下:
-
首先在當前進程MXactCache中查找這兩種XID的組合是不是已經生成了一個MultixactID,如果已經生成,直接返回MultiXactID即可。
-
調用GetNewMultiXactId函數從共享內存MultiXactState中獲得一個新的MultiXactID,並更新MultiXactState中的nextMXact和nextOffset。
-
向XLOG中寫入當前操作的日誌,記錄當前分配得到的MultiXactID以及組合成該MultiXactID的Xids鏈表和數量。
-
最後將該MultiXactID以及相關Xids更新到本地緩存中,返回MultiXactID。
Multixact的擴增
該操作定義在函數MultiXactIdExpand中。我們知道,一個MultiXactID可以對應多個Xid,而上面的MultiXactID的創建只能完成兩個Xid到一個MultiXactID的映射過程,於是定義了MultiXactIdExpand()來完成MultiXactdID的擴增,即將一個Xid加入到該MultiXactID對應的Xids隊列中。
-
首先有MultiXactID找到對應的Xids隊列和數量。
-
檢查該MultiXactID是否有對應成員存在,若不存在,創建一個僅由該Xid組成的MultiXactID返回即可。
-
檢查該Xid是否已經在當前MultiXactID對應的Xids中,若存在,直接返回即可。
-
將該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日誌的關閉不同的是,在這個刷新的過程中,允許其他進程向緩衝池中寫日誌。