summaryrefslogtreecommitdiff
path: root/src/mongo/db/logical_time_validator.cpp
diff options
context:
space:
mode:
authorMisha Tyulenev <misha@mongodb.com>2017-09-27 23:23:24 -0400
committerMisha Tyulenev <misha@mongodb.com>2017-09-27 23:23:46 -0400
commiteeee1e2b64f70e8487f017ba579f3ca861c81e4f (patch)
treee1452828e142748f1f03be61a00c32dbb3ed6bc1 /src/mongo/db/logical_time_validator.cpp
parent55637833c707998f685f997d43624c52cde99b45 (diff)
downloadmongo-eeee1e2b64f70e8487f017ba579f3ca861c81e4f.tar.gz
SERVER-30977 add clusterTime to standalone replica set
Diffstat (limited to 'src/mongo/db/logical_time_validator.cpp')
-rw-r--r--src/mongo/db/logical_time_validator.cpp52
1 files changed, 42 insertions, 10 deletions
diff --git a/src/mongo/db/logical_time_validator.cpp b/src/mongo/db/logical_time_validator.cpp
index 9bbb9021ac7..2b336a5e561 100644
--- a/src/mongo/db/logical_time_validator.cpp
+++ b/src/mongo/db/logical_time_validator.cpp
@@ -26,6 +26,8 @@
* it in the license file.
*/
+#define MONGO_LOG_DEFAULT_COMPONENT ::mongo::logger::LogComponent::kReplication
+
#include "mongo/platform/basic.h"
#include "mongo/db/logical_time_validator.h"
@@ -39,6 +41,7 @@
#include "mongo/db/operation_context.h"
#include "mongo/db/service_context.h"
#include "mongo/util/assert_util.h"
+#include "mongo/util/log.h"
namespace mongo {
@@ -104,7 +107,7 @@ SignedLogicalTime LogicalTimeValidator::_getProof(const KeysCollectionDocument&
}
SignedLogicalTime LogicalTimeValidator::trySignLogicalTime(const LogicalTime& newTime) {
- auto keyStatusWith = _keyManager->getKeyForSigning(nullptr, newTime);
+ auto keyStatusWith = _getKeyManagerCopy()->getKeyForSigning(nullptr, newTime);
auto keyStatus = keyStatusWith.getStatus();
if (keyStatus == ErrorCodes::KeyNotFound) {
@@ -118,13 +121,14 @@ SignedLogicalTime LogicalTimeValidator::trySignLogicalTime(const LogicalTime& ne
SignedLogicalTime LogicalTimeValidator::signLogicalTime(OperationContext* opCtx,
const LogicalTime& newTime) {
- auto keyStatusWith = _keyManager->getKeyForSigning(nullptr, newTime);
+ auto keyManager = _getKeyManagerCopy();
+ auto keyStatusWith = keyManager->getKeyForSigning(nullptr, newTime);
auto keyStatus = keyStatusWith.getStatus();
while (keyStatus == ErrorCodes::KeyNotFound) {
- _keyManager->refreshNow(opCtx);
+ keyManager->refreshNow(opCtx);
- keyStatusWith = _keyManager->getKeyForSigning(nullptr, newTime);
+ keyStatusWith = keyManager->getKeyForSigning(nullptr, newTime);
keyStatus = keyStatusWith.getStatus();
if (keyStatus == ErrorCodes::KeyNotFound) {
@@ -144,7 +148,8 @@ Status LogicalTimeValidator::validate(OperationContext* opCtx, const SignedLogic
}
}
- auto keyStatus = _keyManager->getKeyForValidation(opCtx, newTime.getKeyId(), newTime.getTime());
+ auto keyStatus =
+ _getKeyManagerCopy()->getKeyForValidation(opCtx, newTime.getKeyId(), newTime.getTime());
uassertStatusOK(keyStatus.getStatus());
const auto& key = keyStatus.getValue().getKey();
@@ -163,15 +168,15 @@ Status LogicalTimeValidator::validate(OperationContext* opCtx, const SignedLogic
}
void LogicalTimeValidator::init(ServiceContext* service) {
- _keyManager->startMonitoring(service);
+ _getKeyManagerCopy()->startMonitoring(service);
}
void LogicalTimeValidator::shutDown() {
- _keyManager->stopMonitoring();
+ _getKeyManagerCopy()->stopMonitoring();
}
void LogicalTimeValidator::enableKeyGenerator(OperationContext* opCtx, bool doEnable) {
- _keyManager->enableKeyGenerator(opCtx, doEnable);
+ _getKeyManagerCopy()->enableKeyGenerator(opCtx, doEnable);
}
bool LogicalTimeValidator::isAuthorizedToAdvanceClock(OperationContext* opCtx) {
@@ -183,11 +188,38 @@ bool LogicalTimeValidator::isAuthorizedToAdvanceClock(OperationContext* opCtx) {
}
bool LogicalTimeValidator::shouldGossipLogicalTime() {
- return _keyManager->hasSeenKeys();
+ return _getKeyManagerCopy()->hasSeenKeys();
}
void LogicalTimeValidator::forceKeyRefreshNow(OperationContext* opCtx) {
- _keyManager->refreshNow(opCtx);
+ _getKeyManagerCopy()->refreshNow(opCtx);
+}
+
+void LogicalTimeValidator::resetKeyManagerCache(ServiceContext* service) {
+ log() << "XXX resetting key manager cache";
+ if (auto keyManager = _getKeyManagerCopy()) {
+ keyManager->stopMonitoring();
+ keyManager->startMonitoring(service);
+ _lastSeenValidTime = SignedLogicalTime();
+ _timeProofService.resetCache();
+ }
+}
+
+void LogicalTimeValidator::resetKeyManager() {
+ log() << "XXX resetting key manager";
+ stdx::lock_guard<stdx::mutex> lk(_mutexKeyManager);
+ if (_keyManager) {
+ _keyManager->stopMonitoring();
+ _keyManager.reset();
+ _lastSeenValidTime = SignedLogicalTime();
+ _timeProofService.resetCache();
+ }
+}
+
+std::shared_ptr<KeysCollectionManagerSharding> LogicalTimeValidator::_getKeyManagerCopy() {
+ stdx::lock_guard<stdx::mutex> lk(_mutexKeyManager);
+ invariant(_keyManager);
+ return _keyManager;
}
} // namespace mongo