contender与detector
contender分成两种:standalone和zookeeper
竞争master
contender
MasterContender::create
- 41-44:如果定义了Contender模块,则调用模块中的创建函数并返回
- 46-48:若未定义zookeeper,则创建StandaloneMasterContender并返回
- 52-91:从命令行或是文件中获取zookeeper地址,最后创建ZooKeeperMasterContender对象并返回
detector
MasterDetector::create
参数:
- zk_
- masterDetectorModule_
流程:
- 50-53:若命令行定义了masterDetectorModule_,则调用模块中的create并返回
- 55-57:若未定义zk,则调用StandaloneMasterDetector(表示命令行中没有--master??)
- 61-70:zk以"zk://"开头,表示是zookeeper管理的master,调用ZooKeeperMasterDetector
- 71-96:zk以"file://"开头,表示master地址写在一个文件中,将文件内容读出来,再递归调用本函数create
- 98-107:
- 109-110:调用StandaloneMasterDetector,参数是一个新的消息createMasterInfo(函数定义在src/common/protobuf_utils.cpp 271行,功能是为MasterInfo赋值)
StandaloneMasterDetector
standalone.cpp
105-108:创建时新建一个StandaloneMasterDetectorProcess对象,并启动对应的进程
StandaloneMasterDetector几个函数都是调用其内部StandaloneMasterDetectorProcess对象相应的函数,这些函数有:
- appoint
- detect
StandaloneMasterDetectorProcess::appoint
- 56:设置对象的内部变量leader
- 58:将集合promises中每个promise都置上,并清除该集合
StandaloneMasterDetectorProcess::detect
参数:
- previous
std::promise类型模板提供设置异步结果的方法,这样其他线程就可以通过std::future实例来索引该结果。 ResultType模板参数,该类型可以存储异步结果。 std::promise实例中的异步结果与某个srd::future实例相关联,并且可以通过调用get_future()成员函数来获取这个srd::future实例。ResultType类型的异步结果,可以通过set_value()成员函数对存储值进行设置,或者使用set_exception()将对应异常设置进异步结果中。
流程:
- 64-65:若当前leader与previous不相等,直接返回。这种情况通常是初次运行时已经在命令行指定master
- 68:创建一个新的Promise对象,每个线程使用一个promise来表示是否准备好,然后让std::promise等待(复制)一个std::shared_future;主线程会等待每个线程上的promise设置后,才按下“开始”键
- 70-71:设置收到discard消息时的回调函数
- 73:将新的promise对象插入到promises集合(StandaloneMasterDetectorProcess对象的私有变量)中