summaryrefslogtreecommitdiffstats
path: root/searchcore/src/tests/proton/flushengine/flushengine_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'searchcore/src/tests/proton/flushengine/flushengine_test.cpp')
-rw-r--r--searchcore/src/tests/proton/flushengine/flushengine_test.cpp44
1 files changed, 42 insertions, 2 deletions
diff --git a/searchcore/src/tests/proton/flushengine/flushengine_test.cpp b/searchcore/src/tests/proton/flushengine/flushengine_test.cpp
index 3fdc5a8ce9f..caa88e7305b 100644
--- a/searchcore/src/tests/proton/flushengine/flushengine_test.cpp
+++ b/searchcore/src/tests/proton/flushengine/flushengine_test.cpp
@@ -235,6 +235,7 @@ protected:
SimpleTarget(const std::string &name, const Type &type, search::SerialNum flushedSerial = 0, bool proceedImmediately = true) :
test::DummyFlushTarget(name, type, Component::OTHER),
_flushedSerial(flushedSerial),
+ _currentSerial(0),
_proceed(),
_initDone(),
_taskStart(),
@@ -266,7 +267,7 @@ public:
{ }
SimpleTarget(const std::string &name, search::SerialNum flushedSerial = 0, bool proceedImmediately = true)
- : SimpleTarget(name, Type::OTHER, flushedSerial, proceedImmediately)
+ : SimpleTarget(name, Type::OTHER, flushedSerial, proceedImmediately)
{ }
Time getLastFlushTime() const override { return vespalib::system_clock::now(); }
@@ -288,8 +289,19 @@ public:
class GCTarget : public SimpleTarget {
public:
GCTarget(const vespalib::string &name, search::SerialNum flushedSerial)
- : SimpleTarget(name, Type::GC, flushedSerial)
+ : SimpleTarget(name, Type::GC, flushedSerial)
+ {}
+};
+
+class HighPriorityTarget : public SimpleTarget {
+public:
+ HighPriorityTarget(const vespalib::string &name, search::SerialNum flushedSerial, bool proceed)
+ : SimpleTarget(name, Type::OTHER, flushedSerial, proceed)
{}
+
+ Priority getPriority() const override {
+ return Priority::HIGH;
+ }
};
class AssertedTarget : public SimpleTarget {
@@ -705,6 +717,34 @@ TEST_F("require that concurrency works", Fixture(2, 1ms))
target2->_proceed.countDown();
}
+TEST_F("require that high pri concurrency works", Fixture(2, 1ms))
+{
+ auto target1 = std::make_shared<SimpleTarget>("target1", 1, false);
+ auto target2 = std::make_shared<SimpleTarget>("target2", 2, false);
+ auto target3 = std::make_shared<SimpleTarget>("target3", 2, false);
+ auto target4 = std::make_shared<HighPriorityTarget>("target4", 3, false);
+ auto handler = std::make_shared<SimpleHandler>(Targets({target1, target2, target3, target4}), "handler", 9);
+ f.putFlushHandler("handler", handler);
+ f.engine.start();
+
+ EXPECT_TRUE(target1->_initDone.await(LONG_TIMEOUT));
+ EXPECT_TRUE(target2->_initDone.await(LONG_TIMEOUT));
+ EXPECT_TRUE(!target3->_initDone.await(SHORT_TIMEOUT));
+ EXPECT_TRUE(target4->_initDone.await(SHORT_TIMEOUT));
+ assertThatHandlersInCurrentSet(f.engine, {"handler.target1", "handler.target2", "handler.target4"});
+ EXPECT_TRUE(!target3->_initDone.await(SHORT_TIMEOUT));
+ target1->_proceed.countDown();
+ EXPECT_TRUE(target1->_taskDone.await(LONG_TIMEOUT));
+ EXPECT_TRUE(!target3->_initDone.await(SHORT_TIMEOUT));
+ assertThatHandlersInCurrentSet(f.engine, {"handler.target2", "handler.target4"});
+ target2->_proceed.countDown();
+ EXPECT_TRUE(target2->_taskDone.await(LONG_TIMEOUT));
+ EXPECT_TRUE(target3->_initDone.await(LONG_TIMEOUT));
+ assertThatHandlersInCurrentSet(f.engine, {"handler.target4", "handler.target3"});
+ target3->_proceed.countDown();
+ target4->_proceed.countDown();
+}
+
TEST_F("require that concurrency works with triggerFlush", Fixture(2, 1ms))
{
auto target1 = std::make_shared<SimpleTarget>("target1", 1, false);