AssignmentManager.java及其相關程式碼淺析(1)
分析原始碼,一般可以依循專案的功能結構自頂向下或者自底向上進行分析,像HBase我們可以從頂部client發起訪問開始,也可以從最小物理儲存結構Cell開始分析。或者是由於某種契機,從中間發散開來進行分析,比如由發生異常的類而展開的分析。這裡我們選擇這樣一個契機,即2.0較1.x不同之處的AssignmentManager.java來展開。
AssignmentManager主要用來處理在建表、分裂與合併或者表失效時,region的分配和收回問題。下面介紹一下,AssignmentManager包含的主要屬性類和主要功能方法。
1.實現介面ServerListener類
AssignmentManager 實現了一個ServerListener的介面,介面ServerListener主要用來監聽RegionServer,其實現者需要實現三個方法,一是waiting(){}方法,用來等待需要註冊的RegionServer;二是serverAdded(finalServerName serverName)方法,即RegionServer加入以後要做的事;三是serverRemoved(finalServerName serverName)即RegionServer退出以後要做的事。
2.私有屬性RegionStates類
RegionStates包含了一系列AssignmentManager需要管理的Region相關Map,如系統可用的所有regions,正在transition的regions,下線的所有regions,以及擁有這些regions的所有 servers。
2.1 私有屬性STATES_EXPECTED_ON_OPEN
即當server open一個region時,region接下來可能呈現的狀態。
2.2 私有屬性STATES_EXPECTED_ON_CLOSE
即當server close一個 region時,region接下來可能呈現的狀態。
Region可能的狀態為一個列舉類State,State的所有狀態如下:
2.3內部類RegionStateNode
該類表示了region本身的一些資訊、狀態以及所在server的對應關係,只在記憶體中,不進行持久化。下面介紹一下這個類主要涉及的一些屬性和方法。
2.3.1 私有屬性類RegionInfo
Region本身資訊,包含region所屬的表名tableName,startKey,endKey,是否處於split狀態,是否處於offline狀態,以及regionId即該region建立的時間戳,replicaId副本id,encodedName即該region名稱組合以後的MD5編碼字串。
2.3.2 私有屬性類State
Region本身狀態,初始化為Offline。
2.3.3 私有屬性類ServerName
一個是lastHost即舊的RegionServer,另一個是regionLocation即新遷移到的RegionServer。
2.3.4 私有屬性類RegionTransitionProcedure
Region的變化過程執行類。
2.3.5 和狀態設定相關的方法
設定狀態相關的方法,如果準備設定的狀態在預期狀態列表裡,則可以 設定成功,不在則根據實際情況進行反饋或丟擲異常。
2.3.6 方法isInTransition()
如果該任務的執行類procedure沒有被置為null則說明仍然處於transition階段。
下節我們再來學習RegionStates的內部類ServerStateNode。
完
2018/10/14