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对象的私有变量)中

results matching ""

    No results matching ""