这里_scheduleHeartbeatToTarget 的实现比较简单,其真正发起心跳是由 _doMemberHeartbeat 实现的,如下:
- void ReplicationCoordinatorImpl::_scheduleHeartbeatToTarget(const HostAndPort& target,
- int targetIndex,
- Date_t when) {
- //执行调度,在某个时间点调用_doMemberHeartbeat
- _trackHeartbeatHandle(
- _replExecutor.scheduleWorkAt(when,
- stdx::bind(&ReplicationCoordinatorImpl::_doMemberHeartbeat,
- this,
- stdx::placeholders::_1,
- target,
- targetIndex)));
- }
ReplicationCoordinatorImpl::_doMemberHeartbeat 方法的实现如下:
- void ReplicationCoordinatorImpl::_doMemberHeartbeat(ReplicationExecutor::CallbackArgs cbData,
- const HostAndPort& target,
- int targetIndex) {
- LockGuard topoLock(_topoMutex);
- //取消callback 跟踪
- _untrackHeartbeatHandle(cbData.myHandle);
- if (cbData.status == ErrorCodes::CallbackCanceled) {
- return;
- }
- const Date_t now = _replExecutor.now();
- BSONObj heartbeatObj;
- Milliseconds timeout(0);
- //3.2 以后的版本
- if (isV1ElectionProtocol()) {
- const std::pair<ReplSetHeartbeatArgsV1, Milliseconds> hbRequest =
- _topCoord->prepareHeartbeatRequestV1(now, _settings.ourSetName(), target);
- //构造请求,设置一个timeout
- heartbeatObj = hbRequest.first.toBSON();
- timeout = hbRequest.second;
- } else {
- ...
- }
- //构造远程命令
- const RemoteCommandRequest request(
- target, "admin", heartbeatObj, BSON(rpc::kReplSetMetadataFieldName << 1), nullptr, timeout);
- //设置远程命令回调,指向_handleHeartbeatResponse方法
- const ReplicationExecutor::RemoteCommandCallbackFn callback =
- stdx::bind(&ReplicationCoordinatorImpl::_handleHeartbeatResponse,
- this,
- stdx::placeholders::_1,
- targetIndex);
- _trackHeartbeatHandle(_replExecutor.scheduleRemoteCommand(request, callback));
- }
(编辑:西安站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|