diff options
author | Randolph Tan <randolph@10gen.com> | 2017-04-26 14:39:55 -0400 |
---|---|---|
committer | Randolph Tan <randolph@10gen.com> | 2017-05-03 10:47:37 -0400 |
commit | 1a6c4ecddfa4bb7a7275dc4b1bf5b79222aa4b72 (patch) | |
tree | 683414110da9fef4ba13373ffa9a49c087985369 /src/mongo/db/logical_time_metadata_hook.cpp | |
parent | 1c44e48a50fc2cddbcb2d837a000187a1d84e34e (diff) | |
download | mongo-1a6c4ecddfa4bb7a7275dc4b1bf5b79222aa4b72.tar.gz |
SERVER-28562 Move LogicalTime HMAC computation outside collection lock
Diffstat (limited to 'src/mongo/db/logical_time_metadata_hook.cpp')
-rw-r--r-- | src/mongo/db/logical_time_metadata_hook.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/mongo/db/logical_time_metadata_hook.cpp b/src/mongo/db/logical_time_metadata_hook.cpp index bb4124d611b..29949e36c82 100644 --- a/src/mongo/db/logical_time_metadata_hook.cpp +++ b/src/mongo/db/logical_time_metadata_hook.cpp @@ -31,6 +31,7 @@ #include "mongo/db/logical_time_metadata_hook.h" #include "mongo/db/logical_clock.h" +#include "mongo/db/logical_time_validator.h" #include "mongo/rpc/metadata/logical_time_metadata.h" #include "mongo/stdx/memory.h" @@ -42,11 +43,13 @@ LogicalTimeMetadataHook::LogicalTimeMetadataHook(ServiceContext* service) : _ser Status LogicalTimeMetadataHook::writeRequestMetadata(OperationContext* opCtx, BSONObjBuilder* metadataBob) { - if (!LogicalClock::get(_service)->canVerifyAndSign()) { + auto validator = LogicalTimeValidator::get(_service); + if (!validator) { return Status::OK(); } - LogicalTimeMetadata metadata(LogicalClock::get(_service)->getClusterTime()); + auto newTime = LogicalClock::get(_service)->getClusterTime(); + LogicalTimeMetadata metadata(validator->signLogicalTime(newTime)); metadata.writeToMetadata(metadataBob); return Status::OK(); } @@ -57,14 +60,21 @@ Status LogicalTimeMetadataHook::readReplyMetadata(StringData replySource, if (!parseStatus.isOK()) { return parseStatus.getStatus(); } + auto& signedTime = parseStatus.getValue().getSignedTime(); + // LogicalTimeMetadata is default constructed if no logical time metadata was sent, so a // default constructed SignedLogicalTime should be ignored. if (signedTime.getTime() == LogicalTime::kUninitialized) { return Status::OK(); } - return LogicalClock::get(_service)->advanceClusterTimeFromTrustedSource(signedTime); + auto validator = LogicalTimeValidator::get(_service); + if (validator) { + validator->updateCacheTrustedSource(signedTime); + } + + return LogicalClock::get(_service)->advanceClusterTime(signedTime.getTime()); } } // namespace rpc |