summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/active_shard_collection_registry.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/s/active_shard_collection_registry.h')
-rw-r--r--src/mongo/db/s/active_shard_collection_registry.h181
1 files changed, 0 insertions, 181 deletions
diff --git a/src/mongo/db/s/active_shard_collection_registry.h b/src/mongo/db/s/active_shard_collection_registry.h
deleted file mode 100644
index 6c0c5333457..00000000000
--- a/src/mongo/db/s/active_shard_collection_registry.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * Copyright (C) 2018-present MongoDB, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the Server Side Public License, version 1,
- * as published by MongoDB, Inc.
- *
- * 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
- * Server Side Public License for more details.
- *
- * You should have received a copy of the Server Side Public License
- * along with this program. If not, see
- * <http://www.mongodb.com/licensing/server-side-public-license>.
- *
- * 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 Server Side 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.
- */
-
-#pragma once
-
-#include <boost/optional.hpp>
-#include <memory>
-
-#include "mongo/platform/mutex.h"
-#include "mongo/s/request_types/shard_collection_gen.h"
-#include "mongo/s/request_types/sharded_ddl_commands_gen.h"
-#include "mongo/util/concurrency/notification.h"
-#include "mongo/util/string_map.h"
-
-namespace mongo {
-
-class OperationContext;
-class ScopedShardCollection;
-template <typename T>
-class StatusWith;
-
-/**
- * Thread-safe object that keeps track of any active shardCollection commands running. There is only
- * one instance of this object per shard.
- */
-class ActiveShardCollectionRegistry {
- ActiveShardCollectionRegistry(const ActiveShardCollectionRegistry&) = delete;
- ActiveShardCollectionRegistry& operator=(const ActiveShardCollectionRegistry&) = delete;
-
-public:
- ActiveShardCollectionRegistry();
- ~ActiveShardCollectionRegistry();
-
- static ActiveShardCollectionRegistry& get(ServiceContext* service);
- static ActiveShardCollectionRegistry& get(OperationContext* opCtx);
-
- /**
- * If the collection being requested to shard is not already being sharded on this shard,
- * registers an active shardCollection with the specified arguments. Returns a
- * ScopedShardCollection object, which must be signaled by the caller before it goes out of
- * scope.
- *
- * If this collection is already being sharded on this shard and it has the exact same
- * arguments, returns a ScopedShardCollection. The ScopedShardCollection can be used to join the
- * already running shard collection.
- *
- * Otherwise returns a ConflictingOperationInProgress error.
- */
- StatusWith<ScopedShardCollection> registerShardCollection(
- const ShardsvrShardCollectionRequest& request);
-
-private:
- friend class ScopedShardCollection;
-
- // Describes the state of a currently active shardCollection operation
- struct ActiveShardCollectionState {
- ActiveShardCollectionState(ShardsvrShardCollectionRequest inRequest)
- : activeRequest(std::move(inRequest)) {}
-
- /**
- * Constructs an error status to return in the case of conflicting operations.
- */
- Status constructErrorStatus(const ShardsvrShardCollectionRequest& request) const;
-
- // Exact arguments of the currently active operation
- ShardsvrShardCollectionRequest activeRequest;
-
- /**
- * Promise that contains the response of the command so that a shardCollection object that
- * is in 'join' mode has access to the response object.
- */
- SharedPromise<boost::optional<CreateCollectionResponse>> _responsePromise;
- };
-
- /**
- * Unregisters a previously registered namespace with an ongoing shardCollection. Must only be
- * called if a previous call to registerShardCollection has succeeded.
- */
- void _clearShardCollection(std::string nss);
-
- // Fulfills the promise and stores the response for the command if the status is OK or sets an
- // error on the promise if it is not.
- void _setResponseOrError(std::string nss,
- StatusWith<boost::optional<CreateCollectionResponse>> swResponse);
-
- // Protects the state below
- Mutex _mutex = MONGO_MAKE_LATCH("ActiveShardCollectionRegistry::_mutex");
-
- // Map containing any collections currently being sharded
- StringMap<std::shared_ptr<ActiveShardCollectionState>> _activeShardCollectionMap;
-};
-
-/**
- * Object of this class is returned from the registerShardCollection call of the active shard
- * collection registry. It can exist in two modes - 'execute' and 'join'. See the comments for
- * registerShardCollection method for more details.
- */
-class ScopedShardCollection {
- ScopedShardCollection(const ScopedShardCollection&) = delete;
- ScopedShardCollection& operator=(const ScopedShardCollection&) = delete;
-
-public:
- ScopedShardCollection(
- std::string nss,
- ActiveShardCollectionRegistry* registry,
- bool shouldExecute,
- SharedSemiFuture<boost::optional<CreateCollectionResponse>> responseFuture);
- ~ScopedShardCollection();
-
- ScopedShardCollection(ScopedShardCollection&&);
- ScopedShardCollection& operator=(ScopedShardCollection&&);
-
- /**
- * Returns true if the shardCollection object is in the 'execute' mode. This means that the
- * caller can execute the shardCollection command. The holder must execute the command and call
- * signalComplete with a status.
- */
- bool mustExecute() const {
- return _shouldExecute;
- }
-
- /**
- * Must only be called if the object is in the 'execute' mode when the shardCollection command
- * was invoked (the command immediately executed). Will either emplace the response on the
- * promise stored in the ActiveShardCollectionRegistry for this nss if status is OK or sets an
- * error if it is not.
- */
- void emplaceResponse(StatusWith<boost::optional<CreateCollectionResponse>> swResponse);
-
- /**
- * Must only be called if the object is in the 'join' mode. Gets a future that contains the
- * response for the command.
- */
- SharedSemiFuture<boost::optional<CreateCollectionResponse>> getResponse();
-
-private:
- // Namespace of collection being sharded
- std::string _nss;
-
- // Registry from which to unregister the migration. Not owned.
- ActiveShardCollectionRegistry* _registry;
-
- /**
- * Whether the holder is the first in line for a newly started shardCollection (in which case
- * the destructor must unregister) or the caller is joining on an already-running
- * shardCollection (in which case the caller must block and wait for completion).
- */
- bool _shouldExecute;
-
- // Future that will be signaled at the end of shardCollection, contains the response for the
- // command.
- SharedSemiFuture<boost::optional<CreateCollectionResponse>> _responseFuture;
-};
-
-} // namespace mongo