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())); }
// Look for $gleStats in a command response, and fill in ClientInfo with the data, // if found. // This data will be used by subsequent GLE calls, to ensure we look for the correct // write on the correct PRIMARY. void saveGLEStats(const BSONObj& result, const std::string& hostString) { if (!ClientInfo::exists()) { return; } if (result[kGLEStatsFieldName].type() != Object) { return; } std::string errmsg; ConnectionString shardConn = ConnectionString::parse(hostString, errmsg); BSONElement subobj = result[kGLEStatsFieldName]; OpTime lastOpTime = subobj[kGLEStatsLastOpTimeFieldName]._opTime(); OID electionId = subobj[kGLEStatsElectionIdFieldName].OID(); ClientInfo* clientInfo = ClientInfo::get( NULL ); LOG(4) << "saveGLEStats lastOpTime:" << lastOpTime << " electionId:" << electionId; clientInfo->addHostOpTime(shardConn, HostOpTime(lastOpTime, electionId)); }
void BatchWriteExecStats::noteWriteAt(const ConnectionString& host, OpTime opTime, const OID& electionId) { _writeOpTimes[host] = HostOpTime(opTime, electionId); }