summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
authorAmirsaman Memaripour <amirsaman.memaripour@mongodb.com>2020-12-08 18:19:44 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-12-09 04:14:49 +0000
commitd13b8b8906ea017d5f015b3df8e644895dcdbff2 (patch)
tree73529e6611878451ee7a313974101602c0332e0d /src/mongo/db
parente9284c8ef915be2b1a5adc27458ba5e1a2eff5dc (diff)
downloadmongo-d13b8b8906ea017d5f015b3df8e644895dcdbff2.tar.gz
SERVER-51247 Remove blocking call from AsyncWorkScheduler::_targetHostAsync()
Diffstat (limited to 'src/mongo/db')
-rw-r--r--src/mongo/db/s/transaction_coordinator_futures_util.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/mongo/db/s/transaction_coordinator_futures_util.cpp b/src/mongo/db/s/transaction_coordinator_futures_util.cpp
index 5c8fef4494e..f2d9aa2a490 100644
--- a/src/mongo/db/s/transaction_coordinator_futures_util.cpp
+++ b/src/mongo/db/s/transaction_coordinator_futures_util.cpp
@@ -226,7 +226,7 @@ Future<AsyncWorkScheduler::HostAndShard> AsyncWorkScheduler::_targetHostAsync(
const ShardId& shardId,
const ReadPreferenceSetting& readPref,
OperationContextFn operationContextFn) {
- return scheduleWork([shardId, readPref, operationContextFn](OperationContext* opCtx) {
+ return scheduleWork([this, shardId, readPref, operationContextFn](OperationContext* opCtx) {
operationContextFn(opCtx);
const auto shardRegistry = Grid::get(opCtx)->shardRegistry();
const auto shard = uassertStatusOK(shardRegistry->getShard(opCtx, shardId));
@@ -236,10 +236,13 @@ Future<AsyncWorkScheduler::HostAndShard> AsyncWorkScheduler::_targetHostAsync(
hangWhileTargetingRemoteHost.pauseWhileSet(opCtx);
}
- // TODO (SERVER-51247): Return a SemiFuture<HostAndShard> rather than using a blocking call
- return HostAndShard{
- shard->getTargeter()->findHostWithMaxWait(readPref, Seconds(20)).get(opCtx),
- std::move(shard)};
+ return shard->getTargeter()
+ ->findHostWithMaxWait(readPref, Seconds(20))
+ .thenRunOn(_executor)
+ .unsafeToInlineFuture()
+ .then([shard = std::move(shard)](HostAndPort host) -> HostAndShard {
+ return {std::move(host), std::move(shard)};
+ });
});
}