summaryrefslogtreecommitdiff
path: root/src/mongo/db/s
diff options
context:
space:
mode:
authorJordi Serra Torrens <jordi.serra-torrens@mongodb.com>2022-03-22 17:59:51 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-03-22 20:54:09 +0000
commit07c3d2ebcd3ca8127ed5a5aaabf439b57697b530 (patch)
treeef9f4fce9eb25c798f5f4a38e22ef361a252ea67 /src/mongo/db/s
parent4f948f1d54efadcbe7e3eaa0f1c2de88566dc3bd (diff)
downloadmongo-07c3d2ebcd3ca8127ed5a5aaabf439b57697b530.tar.gz
SERVER-63724 ShardingDDLCoordinators should forward the WriteBlockBypass flag when running commands on participant shards
Diffstat (limited to 'src/mongo/db/s')
-rw-r--r--src/mongo/db/s/forwardable_operation_metadata.cpp5
-rw-r--r--src/mongo/db/s/forwardable_operation_metadata.idl3
-rw-r--r--src/mongo/db/s/sharding_ddl_coordinator_service.cpp9
-rw-r--r--src/mongo/db/s/sharding_ddl_coordinator_service.h11
-rw-r--r--src/mongo/db/s/sharding_ddl_util.cpp5
-rw-r--r--src/mongo/db/s/shardsvr_set_user_write_block_mode_command.cpp17
6 files changed, 40 insertions, 10 deletions
diff --git a/src/mongo/db/s/forwardable_operation_metadata.cpp b/src/mongo/db/s/forwardable_operation_metadata.cpp
index b49c73f9fc9..d3ca368cfb8 100644
--- a/src/mongo/db/s/forwardable_operation_metadata.cpp
+++ b/src/mongo/db/s/forwardable_operation_metadata.cpp
@@ -32,6 +32,7 @@
#include "mongo/db/s/forwardable_operation_metadata.h"
#include "mongo/db/auth/authorization_session.h"
+#include "mongo/db/write_block_bypass.h"
#include "mongo/rpc/metadata/impersonated_user_metadata.h"
namespace mongo {
@@ -48,6 +49,8 @@ ForwardableOperationMetadata::ForwardableOperationMetadata(OperationContext* opC
if (const auto authMetadata = rpc::getImpersonatedUserMetadata(opCtx)) {
setImpersonatedUserMetadata({{authMetadata->getUsers(), authMetadata->getRoles()}});
}
+
+ setMayBypassWriteBlocking(WriteBlockBypass::get(opCtx).isWriteBlockBypassEnabled());
}
void ForwardableOperationMetadata::setOn(OperationContext* opCtx) const {
@@ -64,6 +67,8 @@ void ForwardableOperationMetadata::setOn(OperationContext* opCtx) const {
authMetadata.getRoles());
}
}
+
+ WriteBlockBypass::get(opCtx).set(getMayBypassWriteBlocking());
}
} // namespace mongo
diff --git a/src/mongo/db/s/forwardable_operation_metadata.idl b/src/mongo/db/s/forwardable_operation_metadata.idl
index 0d70bebfed6..68c8c74042c 100644
--- a/src/mongo/db/s/forwardable_operation_metadata.idl
+++ b/src/mongo/db/s/forwardable_operation_metadata.idl
@@ -59,3 +59,6 @@ structs:
type: AuthenticationMetadata
description: "The impersonated users associated with the operation."
optional: true
+ mayBypassWriteBlocking:
+ type: optionalBool
+ description: "Whether this operation is allowed to bypass user write blocking."
diff --git a/src/mongo/db/s/sharding_ddl_coordinator_service.cpp b/src/mongo/db/s/sharding_ddl_coordinator_service.cpp
index e684b6f4355..3d889877423 100644
--- a/src/mongo/db/s/sharding_ddl_coordinator_service.cpp
+++ b/src/mongo/db/s/sharding_ddl_coordinator_service.cpp
@@ -169,15 +169,16 @@ void ShardingDDLCoordinatorService::waitForCoordinatorsOfGivenTypeToComplete(
});
}
-void ShardingDDLCoordinatorService::waitForOngoingCoordinatorsToFinish(OperationContext* opCtx) {
+void ShardingDDLCoordinatorService::waitForOngoingCoordinatorsToFinish(
+ OperationContext* opCtx, std::function<bool(const ShardingDDLCoordinator&)> pred) {
std::vector<SharedSemiFuture<void>> futuresToWait;
const auto instances = getAllInstances(opCtx);
for (const auto& instance : instances) {
auto typedInstance = checked_pointer_cast<ShardingDDLCoordinator>(instance);
- // TODO: SERVER-63724 Wait only for coordinators that don't have the user-write-blocking
- // bypass enabled.
- futuresToWait.emplace_back(typedInstance->getCompletionFuture());
+ if (pred(*typedInstance)) {
+ futuresToWait.emplace_back(typedInstance->getCompletionFuture());
+ }
}
for (auto&& future : futuresToWait) {
diff --git a/src/mongo/db/s/sharding_ddl_coordinator_service.h b/src/mongo/db/s/sharding_ddl_coordinator_service.h
index a2c4aae17cc..d0fb1d023f9 100644
--- a/src/mongo/db/s/sharding_ddl_coordinator_service.h
+++ b/src/mongo/db/s/sharding_ddl_coordinator_service.h
@@ -35,6 +35,8 @@
namespace mongo {
+class ShardingDDLCoordinator;
+
class ShardingDDLCoordinatorService final : public repl::PrimaryOnlyService {
public:
static constexpr StringData kServiceName = "ShardingDDLCoordinator"_sd;
@@ -76,10 +78,13 @@ public:
DDLCoordinatorTypeEnum type) const;
/**
- * Waits for all currently running coordinators to finish. While waiting here, new coordinators
- * may start, but they will not be waited for.
+ * Waits for all currently running coordinators matching the predicate 'pred' to finish. While
+ * waiting here, new coordinators may start, but they will not be waited for.
*/
- void waitForOngoingCoordinatorsToFinish(OperationContext* opCtx);
+ void waitForOngoingCoordinatorsToFinish(
+ OperationContext* opCtx,
+ std::function<bool(const ShardingDDLCoordinator&)> pred = {
+ [](const ShardingDDLCoordinator&) { return true; }});
private:
ExecutorFuture<void> _rebuildService(std::shared_ptr<executor::ScopedTaskExecutor> executor,
diff --git a/src/mongo/db/s/sharding_ddl_util.cpp b/src/mongo/db/s/sharding_ddl_util.cpp
index c66375b6c06..8a0c739d051 100644
--- a/src/mongo/db/s/sharding_ddl_util.cpp
+++ b/src/mongo/db/s/sharding_ddl_util.cpp
@@ -42,7 +42,9 @@
#include "mongo/db/s/shard_filtering_metadata_refresh.h"
#include "mongo/db/s/sharding_logging.h"
#include "mongo/db/s/sharding_util.h"
+#include "mongo/db/server_feature_flags_gen.h"
#include "mongo/db/vector_clock.h"
+#include "mongo/db/write_block_bypass.h"
#include "mongo/logv2/log.h"
#include "mongo/rpc/metadata/impersonated_user_metadata.h"
#include "mongo/s/catalog/type_chunk.h"
@@ -209,6 +211,9 @@ std::vector<AsyncRequestsSender::Response> sendAuthenticatedCommandToShards(
// the command
BSONObjBuilder bob(command);
rpc::writeAuthDataToImpersonatedUserMetadata(opCtx, &bob);
+ if (gFeatureFlagUserWriteBlocking.isEnabled(serverGlobalParams.featureCompatibility)) {
+ WriteBlockBypass::get(opCtx).writeAsMetadata(&bob);
+ }
auto authenticatedCommand = bob.obj();
return sharding_util::sendCommandToShards(
opCtx, dbName, authenticatedCommand, shardIds, executor);
diff --git a/src/mongo/db/s/shardsvr_set_user_write_block_mode_command.cpp b/src/mongo/db/s/shardsvr_set_user_write_block_mode_command.cpp
index 71053ef77a6..e5b7515398f 100644
--- a/src/mongo/db/s/shardsvr_set_user_write_block_mode_command.cpp
+++ b/src/mongo/db/s/shardsvr_set_user_write_block_mode_command.cpp
@@ -33,6 +33,7 @@
#include "mongo/db/auth/authorization_session.h"
#include "mongo/db/commands.h"
+#include "mongo/db/s/sharding_ddl_coordinator.h"
#include "mongo/db/s/sharding_ddl_coordinator_service.h"
#include "mongo/db/s/user_writes_recoverable_critical_section_service.h"
#include "mongo/logv2/log.h"
@@ -76,9 +77,19 @@ public:
// Wait for ongoing ShardingDDLCoordinators to finish. This ensures that all
// coordinators that started before enabling blocking have finish, and that
// any new coordinator that is started after this point will see the
- // blocking is enabled.
- ShardingDDLCoordinatorService::getService(opCtx)
- ->waitForOngoingCoordinatorsToFinish(opCtx);
+ // blocking is enabled. Wait only for coordinators that don't have
+ // the user-write-blocking bypass enabled -- the ones allowed to bypass user
+ // write blocking don't care about the write blocking state.
+ {
+ const auto mayNotBypassUserWriteBlockPred =
+ [](const ShardingDDLCoordinator& coordinatorInstance) -> bool {
+ return !coordinatorInstance.getForwardableOpMetadata()
+ .getMayBypassWriteBlocking();
+ };
+ ShardingDDLCoordinatorService::getService(opCtx)
+ ->waitForOngoingCoordinatorsToFinish(
+ opCtx, mayNotBypassUserWriteBlockPred);
+ }
break;
case ShardsvrSetUserWriteBlockModePhaseEnum::kComplete:
UserWritesRecoverableCriticalSectionService::get(opCtx)