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/rpc/metadata.cpp | |
parent | 1c44e48a50fc2cddbcb2d837a000187a1d84e34e (diff) | |
download | mongo-1a6c4ecddfa4bb7a7275dc4b1bf5b79222aa4b72.tar.gz |
SERVER-28562 Move LogicalTime HMAC computation outside collection lock
Diffstat (limited to 'src/mongo/rpc/metadata.cpp')
-rw-r--r-- | src/mongo/rpc/metadata.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/mongo/rpc/metadata.cpp b/src/mongo/rpc/metadata.cpp index d0e837302c4..07cdfef9fca 100644 --- a/src/mongo/rpc/metadata.cpp +++ b/src/mongo/rpc/metadata.cpp @@ -38,6 +38,7 @@ #include "mongo/db/auth/privilege.h" #include "mongo/db/jsobj.h" #include "mongo/db/logical_clock.h" +#include "mongo/db/logical_time_validator.h" #include "mongo/rpc/metadata/audit_metadata.h" #include "mongo/rpc/metadata/client_metadata_ismaster.h" #include "mongo/rpc/metadata/config_server_metadata.h" @@ -131,7 +132,7 @@ Status readRequestMetadata(OperationContext* opCtx, const BSONObj& metadataObj) auto logicalClock = LogicalClock::get(opCtx); if (logicalClock) { - auto logicalTimeMetadata = LogicalTimeMetadata::readFromMetadata(logicalTimeElem); + auto logicalTimeMetadata = rpc::LogicalTimeMetadata::readFromMetadata(logicalTimeElem); if (!logicalTimeMetadata.isOK()) { return logicalTimeMetadata.getStatus(); } @@ -143,19 +144,24 @@ Status readRequestMetadata(OperationContext* opCtx, const BSONObj& metadataObj) return Status::OK(); } + auto logicalTimeValidator = LogicalTimeValidator::get(opCtx); if (isAuthorizedToAdvanceClock(opCtx)) { - auto advanceClockStatus = logicalClock->advanceClusterTimeFromTrustedSource(signedTime); - - if (!advanceClockStatus.isOK()) { - return advanceClockStatus; + if (logicalTimeValidator) { + logicalTimeValidator->updateCacheTrustedSource(signedTime); } + } else if (!logicalTimeValidator) { + return Status(ErrorCodes::CannotVerifyAndSignLogicalTime, + "Cannot accept logicalTime: " + signedTime.getTime().toString() + + ". May not be a part of a sharded cluster"); } else { - auto advanceClockStatus = logicalClock->advanceClusterTime(signedTime); + auto advanceClockStatus = logicalTimeValidator->validate(signedTime); if (!advanceClockStatus.isOK()) { return advanceClockStatus; } } + + logicalClock->advanceClusterTime(signedTime.getTime()); } return Status::OK(); |