summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/create_indexes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/commands/create_indexes.cpp')
-rw-r--r--src/mongo/db/commands/create_indexes.cpp30
1 files changed, 27 insertions, 3 deletions
diff --git a/src/mongo/db/commands/create_indexes.cpp b/src/mongo/db/commands/create_indexes.cpp
index ddf42dfdc00..abcf15f4681 100644
--- a/src/mongo/db/commands/create_indexes.cpp
+++ b/src/mongo/db/commands/create_indexes.cpp
@@ -55,6 +55,7 @@
#include "mongo/db/repl/repl_client_info.h"
#include "mongo/db/repl/repl_set_config.h"
#include "mongo/db/repl/replication_coordinator.h"
+#include "mongo/db/s/collection_sharding_runtime.h"
#include "mongo/db/s/collection_sharding_state.h"
#include "mongo/db/s/database_sharding_state.h"
#include "mongo/db/server_options.h"
@@ -355,10 +356,33 @@ bool indexesAlreadyExist(OperationContext* opCtx,
/**
* Checks database sharding state. Throws exception on error.
*/
-void checkDatabaseShardingState(OperationContext* opCtx, StringData dbName) {
- auto dss = DatabaseShardingState::get(opCtx, dbName);
+void checkDatabaseShardingState(OperationContext* opCtx, const NamespaceString& ns) {
+ auto dss = DatabaseShardingState::get(opCtx, ns.db());
auto dssLock = DatabaseShardingState::DSSLock::lockShared(opCtx, dss);
dss->checkDbVersion(opCtx, dssLock);
+
+ Lock::CollectionLock collLock(opCtx, ns, MODE_IS);
+ try {
+ const auto collDesc =
+ CollectionShardingState::get(opCtx, ns)->getCollectionDescription(opCtx);
+ if (!collDesc.isSharded()) {
+ auto mpsm = dss->getMovePrimarySourceManager(dssLock);
+
+ if (mpsm) {
+ LOGV2(
+ 4909200, "assertMovePrimaryInProgress", "movePrimaryNss"_attr = ns.toString());
+
+ uasserted(ErrorCodes::MovePrimaryInProgress,
+ "movePrimary is in progress for namespace " + ns.toString());
+ }
+ }
+ } catch (const DBException& ex) {
+ if (ex.toStatus() != ErrorCodes::MovePrimaryInProgress) {
+ LOGV2(4909201, "Error when getting colleciton description", "what"_attr = ex.what());
+ return;
+ }
+ throw;
+ }
}
/**
@@ -487,7 +511,7 @@ bool runCreateIndexesWithCoordinator(OperationContext* opCtx,
OptionalCollectionUUID collectionUUID;
{
Lock::DBLock dbLock(opCtx, ns.db(), MODE_IX);
- checkDatabaseShardingState(opCtx, ns.db());
+ checkDatabaseShardingState(opCtx, ns);
if (!repl::ReplicationCoordinator::get(opCtx)->canAcceptWritesFor(opCtx, ns)) {
uasserted(ErrorCodes::NotMaster,
str::stream() << "Not primary while creating indexes in " << ns.ns());