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();
}
Example #3
0
Status ShardingMetadata::writeToMetadata(BSONObjBuilder* metadataBob) const {
    BSONObjBuilder subobj(metadataBob->subobjStart(kGLEStatsFieldName));
    subobj.append(kGLEStatsLastOpTimeFieldName, getLastOpTime());
    subobj.append(kGLEStatsElectionIdFieldName, getLastElectionId());
    return Status::OK();
}