分析源代码,一般可以依循项目的功能结构自顶向下或者自底向上进行分析,像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