From 6080808539edc9f07e6f96c0c36d0b897a303395 Mon Sep 17 00:00:00 2001 From: Tor Brede Vekterli Date: Thu, 31 May 2018 13:25:58 +0000 Subject: Clean up visitors that we've already initiated --- storage/src/tests/visiting/visitormanagertest.cpp | 47 ++++++++++++++++++----- 1 file changed, 37 insertions(+), 10 deletions(-) (limited to 'storage/src') diff --git a/storage/src/tests/visiting/visitormanagertest.cpp b/storage/src/tests/visiting/visitormanagertest.cpp index e64ec21c72d..c7b6097d4cf 100644 --- a/storage/src/tests/visiting/visitormanagertest.cpp +++ b/storage/src/tests/visiting/visitormanagertest.cpp @@ -19,9 +19,11 @@ #include #include #include +#include using document::test::makeDocumentBucket; using document::test::makeBucketSpace; +using documentapi::Priority; namespace storage { namespace { @@ -78,8 +80,9 @@ public: std::vector& docs, std::vector& docIds, api::ReturnCode::Result returnCode = api::ReturnCode::OK, - documentapi::Priority::Value priority = documentapi::Priority::PRI_NORMAL_4); + std::optional priority = documentapi::Priority::PRI_NORMAL_4); uint32_t getMatchingDocuments(std::vector& docs); + void finishAndWaitForVisitorSessionCompletion(uint32_t sessionIndex); void testNormalUsage(); void testResending(); @@ -289,7 +292,7 @@ VisitorManagerTest::getMessagesAndReply( std::vector& docs, std::vector& docIds, api::ReturnCode::Result result, - documentapi::Priority::Value priority) + std::optional priority) { for (int i = 0; i < expectedCount; i++) { session.waitForMessages(i + 1); @@ -297,8 +300,10 @@ VisitorManagerTest::getMessagesAndReply( { vespalib::MonitorGuard guard(session.getMonitor()); - CPPUNIT_ASSERT_EQUAL(priority, - session.sentMessages[i]->getPriority()); + if (priority) { + CPPUNIT_ASSERT_EQUAL(*priority, + session.sentMessages[i]->getPriority()); + } switch (session.sentMessages[i]->getType()) { case documentapi::DocumentProtocol::MESSAGE_PUTDOCUMENT: @@ -975,14 +980,26 @@ VisitorManagerTest::testPrioritizedVisitorQueing() // Finish the first visitor std::vector docs; std::vector docIds; - getMessagesAndReply(1, getSession(0), docs, docIds, api::ReturnCode::OK, - documentapi::Priority::PRI_HIGHEST); + getMessagesAndReply(1, getSession(0), docs, docIds, api::ReturnCode::OK, Priority::PRI_HIGHEST); verifyCreateVisitorReply(api::ReturnCode::OK); // We should now start the highest priority visitor. - getMessagesAndReply(1, getSession(4), docs, docIds, api::ReturnCode::OK, - documentapi::Priority::PRI_VERY_HIGH); + getMessagesAndReply(1, getSession(4), docs, docIds, api::ReturnCode::OK, Priority::PRI_VERY_HIGH); CPPUNIT_ASSERT_EQUAL(ids[9], verifyCreateVisitorReply(api::ReturnCode::OK)); + + // 3 pending, 3 in queue. Clean them up + std::vector pending_sessions = {1, 2, 3, 5, 6, 7}; + for (auto session : pending_sessions) { + finishAndWaitForVisitorSessionCompletion(session); + } + CPPUNIT_ASSERT_EQUAL(0u, _manager->getActiveVisitorCount()); +} + +void VisitorManagerTest::finishAndWaitForVisitorSessionCompletion(uint32_t sessionIndex) { + std::vector docs; + std::vector docIds; + getMessagesAndReply(1, getSession(sessionIndex), docs, docIds, api::ReturnCode::OK, std::optional()); + verifyCreateVisitorReply(api::ReturnCode::OK); } void @@ -1089,6 +1106,7 @@ VisitorManagerTest::testPrioritizedMaxConcurrentVisitors() { CPPUNIT_ASSERT(finishedVisitors.find(ids[11]) != finishedVisitors.end()); CPPUNIT_ASSERT(finishedVisitors.find(ids[14]) != finishedVisitors.end()); + CPPUNIT_ASSERT_EQUAL(0u, _manager->getActiveVisitorCount()); } void @@ -1108,6 +1126,9 @@ VisitorManagerTest::testVisitorQueingZeroQueueSize() { sendCreateVisitor(1000, *_top, 100 - i); verifyCreateVisitorReply(api::ReturnCode::BUSY); } + for (uint32_t session = 0; session < 4; ++session) { + finishAndWaitForVisitorSessionCompletion(session); + } } void @@ -1121,8 +1142,10 @@ VisitorManagerTest::testStatusPage() { sendCreateVisitor(1000000, *_top, 1); sendCreateVisitor(1000000, *_top, 128); - TestVisitorMessageSession& session = getSession(0); - session.waitForMessages(1); + { + TestVisitorMessageSession& session = getSession(0); + session.waitForMessages(1); + } std::ostringstream ss; static_cast(*_manager).reportHtmlStatus(ss, path); @@ -1135,6 +1158,10 @@ VisitorManagerTest::testStatusPage() { CPPUNIT_ASSERT(str.find("Visitor thread 0") != std::string::npos); CPPUNIT_ASSERT(str.find("Disconnected visitor timeout") != std::string::npos); // verbose per thread CPPUNIT_ASSERT(str.find("Message #1 putdocumentmessage") != std::string::npos); // 1 active + + for (uint32_t session = 0; session < 2 ; ++session){ + finishAndWaitForVisitorSessionCompletion(session); + } } } -- cgit v1.2.3