summaryrefslogtreecommitdiff
path: root/src/mongo/db/keys_collection_client_direct.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/keys_collection_client_direct.cpp')
-rw-r--r--src/mongo/db/keys_collection_client_direct.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/mongo/db/keys_collection_client_direct.cpp b/src/mongo/db/keys_collection_client_direct.cpp
index 30048be948b..0a2836a8f07 100644
--- a/src/mongo/db/keys_collection_client_direct.cpp
+++ b/src/mongo/db/keys_collection_client_direct.cpp
@@ -164,13 +164,23 @@ Status KeysCollectionClientDirect::_insert(OperationContext* opCtx,
const NamespaceString& nss,
const BSONObj& doc,
const WriteConcernOptions& writeConcern) {
- BatchedCommandRequest request([&] {
+ BatchedCommandRequest batchRequest([&] {
write_ops::InsertCommandRequest insertOp(nss);
insertOp.setDocuments({doc});
return insertOp;
}());
- request.setWriteConcern(writeConcern.toBSON());
- const BSONObj cmdObj = request.toBSON();
+
+ // A request dispatched through a local client is served within the same thread that submits it
+ // (so that the opCtx needs to be used as the vehicle to pass the WC to the ServiceEntryPoint).
+ const auto originalWC = opCtx->getWriteConcern();
+ ScopeGuard resetWCGuard([&] { opCtx->setWriteConcern(originalWC); });
+ opCtx->setWriteConcern(writeConcern);
+
+ const BSONObj cmdObj = [&] {
+ BSONObjBuilder cmdObjBuilder;
+ batchRequest.serialize(&cmdObjBuilder);
+ return cmdObjBuilder.obj();
+ }();
for (int retry = 1; retry <= kOnErrorNumRetries; ++retry) {
// Note: write commands can only be issued against a primary.