void ShardingEgressMetadataHookForMongos::_saveGLEStats(const BSONObj& metadata, StringData hostString) { if (!haveClient()) { // Client will be present only when write commands are used. return; } auto swShardingMetadata = rpc::ShardingMetadata::readFromMetadata(metadata); if (swShardingMetadata.getStatus() == ErrorCodes::NoSuchKey) { return; } else if (!swShardingMetadata.isOK()) { warning() << "Got invalid sharding metadata " << redact(swShardingMetadata.getStatus()) << " metadata object was '" << redact(metadata) << "'"; return; } auto shardConn = ConnectionString::parse(hostString.toString()); // If we got the reply from this host, we expect that its 'hostString' must be valid. if (!shardConn.isOK()) { severe() << "got bad host string in saveGLEStats: " << hostString; } invariantOK(shardConn.getStatus()); auto shardingMetadata = std::move(swShardingMetadata.getValue()); auto& clientInfo = cc(); LOG(4) << "saveGLEStats lastOpTime:" << shardingMetadata.getLastOpTime() << " electionId:" << shardingMetadata.getLastElectionId(); ClusterLastErrorInfo::get(clientInfo) ->addHostOpTime( shardConn.getValue(), HostOpTime(shardingMetadata.getLastOpTime(), shardingMetadata.getLastElectionId())); }
Status ShardingMetadata::writeToMetadata(BSONObjBuilder* metadataBob) const { BSONObjBuilder subobj(metadataBob->subobjStart(kGLEStatsFieldName)); if (getLastOpTime().getTerm() > repl::OpTime::kUninitializedTerm) { getLastOpTime().append(&subobj, kGLEStatsLastOpTimeFieldName); } else { subobj.append(kGLEStatsLastOpTimeFieldName, getLastOpTime().getTimestamp()); } subobj.append(kGLEStatsElectionIdFieldName, getLastElectionId()); return Status::OK(); }
Status ShardingMetadata::writeToMetadata(BSONObjBuilder* metadataBob) const { BSONObjBuilder subobj(metadataBob->subobjStart(kGLEStatsFieldName)); subobj.append(kGLEStatsLastOpTimeFieldName, getLastOpTime()); subobj.append(kGLEStatsElectionIdFieldName, getLastElectionId()); return Status::OK(); }