summaryrefslogtreecommitdiff
path: root/src/mongo/db/keys_collection_cache_reader_and_updater.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/keys_collection_cache_reader_and_updater.cpp')
-rw-r--r--src/mongo/db/keys_collection_cache_reader_and_updater.cpp147
1 files changed, 0 insertions, 147 deletions
diff --git a/src/mongo/db/keys_collection_cache_reader_and_updater.cpp b/src/mongo/db/keys_collection_cache_reader_and_updater.cpp
deleted file mode 100644
index 7c959c5f6c0..00000000000
--- a/src/mongo/db/keys_collection_cache_reader_and_updater.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/**
- * Copyright (C) 2017 MongoDB, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * As a special exception, the copyright holders give permission to link the
- * code of portions of this program with the OpenSSL library under certain
- * conditions as described in each individual source file and distribute
- * linked combinations including the program with the OpenSSL library. You
- * must comply with the GNU Affero General Public License in all respects for
- * all of the code used other than as permitted herein. If you modify file(s)
- * with this exception, you may extend this exception to your version of the
- * file(s), but you are not obligated to do so. If you do not wish to do so,
- * delete this exception statement from your version. If you delete this
- * exception statement from all source files in the program, then also delete
- * it in the license file.
- */
-
-#include "mongo/platform/basic.h"
-
-#include "mongo/db/keys_collection_cache_reader_and_updater.h"
-
-#include "mongo/client/read_preference.h"
-#include "mongo/db/logical_clock.h"
-#include "mongo/db/operation_context.h"
-#include "mongo/s/catalog/sharding_catalog_client.h"
-#include "mongo/s/client/shard_registry.h"
-#include "mongo/s/grid.h"
-
-namespace mongo {
-
-namespace {
-
-/**
- * Inserts a new key to the keys collection.
- *
- * Note: this relies on the fact that ShardRegistry returns a ShardLocal for config in config
- * servers. In other words, it is relying on the fact that this will always execute the write
- * locally and never remotely even if this node is no longer primary.
- */
-Status insertNewKey(OperationContext* opCtx,
- long long keyId,
- const std::string& purpose,
- const LogicalTime& expiresAt) {
- KeysCollectionDocument newKey(keyId, purpose, TimeProofService::generateRandomKey(), expiresAt);
- return Grid::get(opCtx)->catalogClient(opCtx)->insertConfigDocument(
- opCtx,
- KeysCollectionDocument::ConfigNS,
- newKey.toBSON(),
- ShardingCatalogClient::kMajorityWriteConcern);
-}
-
-/**
- * Returns a new LogicalTime with the seconds argument added to it.
- */
-LogicalTime addSeconds(const LogicalTime& logicalTime, const Seconds& seconds) {
- return LogicalTime(Timestamp(logicalTime.asTimestamp().getSecs() + seconds.count(), 0));
-}
-
-} // unnamed namespace
-
-KeysCollectionCacheReaderAndUpdater::KeysCollectionCacheReaderAndUpdater(
- std::string purpose, Seconds keyValidForInterval)
- : KeysCollectionCacheReader(purpose),
- _purpose(std::move(purpose)),
- _keyValidForInterval(keyValidForInterval) {}
-
-StatusWith<KeysCollectionDocument> KeysCollectionCacheReaderAndUpdater::refresh(
- OperationContext* opCtx) {
-
- auto currentTime = LogicalClock::get(opCtx)->getClusterTime().getTime();
- auto keyStatus = Grid::get(opCtx)->catalogClient(opCtx)->getNewKeys(
- opCtx, _purpose, currentTime, repl::ReadConcernLevel::kLocalReadConcern);
-
- if (!keyStatus.isOK()) {
- return keyStatus.getStatus();
- }
-
- const auto& newKeys = keyStatus.getValue();
- auto keyIter = newKeys.cbegin();
-
- LogicalTime currentKeyExpiresAt;
-
- long long keyId = currentTime.asTimestamp().asLL();
-
- if (keyIter == newKeys.cend()) {
- currentKeyExpiresAt = addSeconds(currentTime, _keyValidForInterval);
- auto status = insertNewKey(opCtx, keyId, _purpose, currentKeyExpiresAt);
-
- if (!status.isOK()) {
- return status;
- }
-
- keyId++;
- } else if (keyIter->getExpiresAt() < currentTime) {
- currentKeyExpiresAt = addSeconds(currentTime, _keyValidForInterval);
- auto status = insertNewKey(opCtx, keyId, _purpose, currentKeyExpiresAt);
-
- if (!status.isOK()) {
- return status;
- }
-
- keyId++;
- ++keyIter;
- } else {
- currentKeyExpiresAt = keyIter->getExpiresAt();
- ++keyIter;
- }
-
- // Create a new key in advance if we don't have a key on standby after the current one
- // expires.
- // Note: Convert this block into a loop if more reserved keys are desired.
- if (keyIter == newKeys.cend()) {
- auto reserveKeyExpiresAt = addSeconds(currentKeyExpiresAt, _keyValidForInterval);
- auto status = insertNewKey(opCtx, keyId, _purpose, reserveKeyExpiresAt);
-
- if (!status.isOK()) {
- return status;
- }
- } else if (keyIter->getExpiresAt() < currentTime) {
- currentKeyExpiresAt = addSeconds(currentKeyExpiresAt, _keyValidForInterval);
- auto status = insertNewKey(opCtx, keyId, _purpose, currentKeyExpiresAt);
-
- if (!status.isOK()) {
- return status;
- }
- }
-
- return KeysCollectionCacheReader::refresh(opCtx);
-}
-
-StatusWith<KeysCollectionDocument> KeysCollectionCacheReaderAndUpdater::getKey(
- const LogicalTime& forThisTime) {
- return KeysCollectionCacheReader::getKey(forThisTime);
-}
-
-} // namespace mongo