summaryrefslogtreecommitdiff
path: root/src/mongo/s/query/async_results_merger_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/s/query/async_results_merger_test.cpp')
-rw-r--r--src/mongo/s/query/async_results_merger_test.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/mongo/s/query/async_results_merger_test.cpp b/src/mongo/s/query/async_results_merger_test.cpp
index ec9f155b20e..2dd95b9708b 100644
--- a/src/mongo/s/query/async_results_merger_test.cpp
+++ b/src/mongo/s/query/async_results_merger_test.cpp
@@ -1437,6 +1437,48 @@ TEST_F(AsyncResultsMergerTest, GetMoreRequestWithoutAwaitDataCantHaveMaxTime) {
executor->waitForEvent(killEvent);
}
+TEST_F(AsyncResultsMergerTest, ShardCanErrorInBetweenReadyAndNextEvent) {
+ BSONObj findCmd = fromjson("{find: 'testcoll', tailable: true}");
+ makeCursorFromFindCmd(findCmd, {kTestShardIds[0]});
+
+ ASSERT_FALSE(arm->ready());
+ auto readyEvent = unittest::assertGet(arm->nextEvent());
+ scheduleErrorResponse({ErrorCodes::BadValue, "bad thing happened"});
+
+ ASSERT_EQ(ErrorCodes::BadValue, arm->nextEvent().getStatus());
+
+ // Required to kill the 'arm' on error before destruction.
+ auto killEvent = arm->kill();
+ executor->waitForEvent(killEvent);
+}
+
+TEST_F(AsyncResultsMergerTest, RetryWhenShardHasRetriableErrorInBetweenReadyAndNextEvent) {
+ BSONObj findCmd = fromjson("{find: 'testcoll'}");
+ makeCursorFromFindCmd(findCmd, {kTestShardIds[0]});
+
+ ASSERT_FALSE(arm->ready());
+
+ // First attempt returns a retriable error.
+ auto readyEvent = unittest::assertGet(arm->nextEvent());
+ scheduleErrorResponse({ErrorCodes::NotMasterNoSlaveOk, "not master and not slave"});
+
+ // We expect to be able to retrieve another event, and be waiting on the retry to succeed.
+ readyEvent = unittest::assertGet(arm->nextEvent());
+ std::vector<CursorResponse> responses;
+ std::vector<BSONObj> batch = {fromjson("{_id: 1}"), fromjson("{_id: 2}")};
+ responses.emplace_back(_nss, CursorId(0), batch);
+ scheduleNetworkResponses(std::move(responses), CursorResponse::ResponseType::InitialResponse);
+
+ executor->waitForEvent(readyEvent);
+ ASSERT_TRUE(arm->ready());
+ ASSERT_EQ(fromjson("{_id: 1}"), *unittest::assertGet(arm->nextReady()));
+ ASSERT_TRUE(arm->ready());
+ ASSERT_EQ(fromjson("{_id: 2}"), *unittest::assertGet(arm->nextReady()));
+ ASSERT_TRUE(arm->ready());
+ ASSERT_TRUE(arm->remotesExhausted());
+ ASSERT(!unittest::assertGet(arm->nextReady()));
+}
+
} // namespace
} // namespace mongo