summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/collection_cloner.cpp
diff options
context:
space:
mode:
authorMatthew Russotto <matthew.russotto@10gen.com>2018-09-20 13:01:26 -0400
committerMatthew Russotto <matthew.russotto@10gen.com>2018-10-02 09:20:47 -0400
commit5a6ee566f608c46654133de17a4e8bb3464d680d (patch)
tree4adf72a0db949e1fe3138263e1ce81f179c9f703 /src/mongo/db/repl/collection_cloner.cpp
parent1f306300a246c94b3274f6741b9ff92572e91a09 (diff)
downloadmongo-5a6ee566f608c46654133de17a4e8bb3464d680d.tar.gz
SERVER-36535 Shut down the collection cloner DBClientCursor upon failure in the oplog fetching thread
Diffstat (limited to 'src/mongo/db/repl/collection_cloner.cpp')
-rw-r--r--src/mongo/db/repl/collection_cloner.cpp20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/mongo/db/repl/collection_cloner.cpp b/src/mongo/db/repl/collection_cloner.cpp
index f8761c32c38..ae409dc37f2 100644
--- a/src/mongo/db/repl/collection_cloner.cpp
+++ b/src/mongo/db/repl/collection_cloner.cpp
@@ -258,14 +258,15 @@ void CollectionCloner::shutdown() {
void CollectionCloner::_cancelRemainingWork_inlock() {
_countScheduler.shutdown();
_listIndexesFetcher.shutdown();
- if (_establishCollectionCursorsScheduler) {
- _establishCollectionCursorsScheduler->shutdown();
- }
if (_verifyCollectionDroppedScheduler) {
_verifyCollectionDroppedScheduler->shutdown();
}
- _queryState =
- _queryState == QueryState::kRunning ? QueryState::kCanceling : QueryState::kFinished;
+ if (_queryState == QueryState::kRunning) {
+ _queryState = QueryState::kCanceling;
+ _clientConnection->shutdownAndDisallowReconnect();
+ } else {
+ _queryState = QueryState::kFinished;
+ }
_dbWorkTaskRunner.cancel();
}
@@ -488,6 +489,7 @@ void CollectionCloner::_beginCollectionCallback(const executor::TaskExecutor::Ca
{
stdx::lock_guard<stdx::mutex> lock(_mutex);
_queryState = QueryState::kFinished;
+ _clientConnection.reset();
}
_condition.notify_all();
});
@@ -530,13 +532,13 @@ void CollectionCloner::_runQuery(const executor::TaskExecutor::CallbackArgs& cal
}
}
- auto conn = _createClientFn();
- Status clientConnectionStatus = conn->connect(_source, StringData());
+ _clientConnection = _createClientFn();
+ Status clientConnectionStatus = _clientConnection->connect(_source, StringData());
if (!clientConnectionStatus.isOK()) {
_finishCallback(clientConnectionStatus);
return;
}
- if (!replAuthenticate(conn.get())) {
+ if (!replAuthenticate(_clientConnection.get())) {
_finishCallback({ErrorCodes::AuthenticationFailed,
str::stream() << "Failed to authenticate to " << _source});
return;
@@ -549,7 +551,7 @@ void CollectionCloner::_runQuery(const executor::TaskExecutor::CallbackArgs& cal
std::make_shared<OnCompletionGuard>(cancelRemainingWorkInLock, finishCallbackFn);
try {
- conn->query(
+ _clientConnection->query(
[this, onCompletionGuard](DBClientCursorBatchIterator& iter) {
_handleNextBatch(onCompletionGuard, iter);
},