summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorGeir Storli <geirst@oath.com>2018-09-03 13:24:15 +0000
committerGeir Storli <geirst@oath.com>2018-09-04 11:06:09 +0000
commitc5cf573c43fe903a8ca2808ba0f7d0a0f95cf841 (patch)
tree00af72c47d755f28eb109f15d9c20323aa82e9f3 /searchcore
parent3e1a5f2d7e0f1387fc6c2503ec2b18f0bb722131 (diff)
Ignore GC flush targets when calculating oldest flushed serial number.
The oldest flushed serial number is used to prune the transaction log up to this point in time. As GC flush targets are not dependent on data stored in the transaction log they should not affect pruning.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/proton/flushengine/flushengine_test.cpp66
-rw-r--r--searchcore/src/vespa/searchcore/proton/flushengine/flushengine.cpp4
2 files changed, 53 insertions, 17 deletions
diff --git a/searchcore/src/tests/proton/flushengine/flushengine_test.cpp b/searchcore/src/tests/proton/flushengine/flushengine_test.cpp
index 9471efb5566..f668072b9fd 100644
--- a/searchcore/src/tests/proton/flushengine/flushengine_test.cpp
+++ b/searchcore/src/tests/proton/flushengine/flushengine_test.cpp
@@ -245,39 +245,45 @@ public:
vespalib::Gate _taskDone;
Task::UP _task;
-public:
- typedef std::shared_ptr<SimpleTarget> SP;
-
- SimpleTarget(Task::UP task, const std::string &name) :
- test::DummyFlushTarget(name),
- _flushedSerial(0),
- _currentSerial(0),
+protected:
+ SimpleTarget(const std::string &name, const Type &type, search::SerialNum flushedSerial = 0, bool proceedImmediately = true) :
+ test::DummyFlushTarget(name, type, Component::OTHER),
+ _flushedSerial(flushedSerial),
_proceed(),
_initDone(),
_taskStart(),
_taskDone(),
- _task(std::move(task))
+ _task(std::make_unique<SimpleTask>(_taskStart, _taskDone, &_proceed,
+ _flushedSerial, _currentSerial))
{
+ if (proceedImmediately) {
+ _proceed.countDown();
+ }
}
- SimpleTarget(const std::string &name, search::SerialNum flushedSerial = 0, bool proceedImmediately = true) :
+public:
+ using SP = std::shared_ptr<SimpleTarget>;
+
+ SimpleTarget(Task::UP task, const std::string &name) :
test::DummyFlushTarget(name),
- _flushedSerial(flushedSerial),
+ _flushedSerial(0),
+ _currentSerial(0),
_proceed(),
_initDone(),
_taskStart(),
_taskDone(),
- _task(std::make_unique<SimpleTask>(_taskStart, _taskDone, &_proceed,
- _flushedSerial, _currentSerial))
+ _task(std::move(task))
{
- if (proceedImmediately) {
- _proceed.countDown();
- }
}
+
SimpleTarget(search::SerialNum flushedSerial = 0, bool proceedImmediately = true)
: SimpleTarget("anon", flushedSerial, proceedImmediately)
{ }
+ SimpleTarget(const std::string &name, search::SerialNum flushedSerial = 0, bool proceedImmediately = true)
+ : SimpleTarget(name, Type::OTHER, flushedSerial, proceedImmediately)
+ { }
+
virtual Time
getLastFlushTime() const override { return fastos::ClockSystem::now(); }
@@ -301,6 +307,13 @@ public:
};
+class GCTarget : public SimpleTarget {
+public:
+ GCTarget(const vespalib::string &name, search::SerialNum flushedSerial)
+ : SimpleTarget(name, Type::GC, flushedSerial)
+ {}
+};
+
class AssertedTarget : public SimpleTarget {
public:
mutable bool _mgain;
@@ -473,7 +486,6 @@ struct Fixture
}
};
-
TEST_F("require that strategy controls flush target", Fixture(1, IINTERVAL))
{
vespalib::Gate fooG, barG;
@@ -523,6 +535,28 @@ TEST_F("require that oldest serial is found", Fixture(1, IINTERVAL))
EXPECT_EQUAL(FlushDoneHistory({ 10, 20, 25 }), handlerFlushDoneHistory);
}
+TEST_F("require that GC targets are not considered when oldest serial is found", Fixture(1, IINTERVAL))
+{
+ auto foo = std::make_shared<SimpleTarget>("foo", 5);
+ auto bar = std::make_shared<GCTarget>("bar", 10);
+ auto baz = std::make_shared<SimpleTarget>("baz", 20);
+ f.addTargetToStrategy(foo);
+ f.addTargetToStrategy(bar);
+ f.addTargetToStrategy(baz);
+
+ auto handler = std::make_shared<SimpleHandler>(Targets({foo, bar, baz}), "handler", 25);
+ f.putFlushHandler("handler", handler);
+ f.engine.start();
+
+ // The targets are flushed in sequence: 'foo', 'bar', 'baz'
+ EXPECT_TRUE(handler->_done.await(LONG_TIMEOUT));
+ EXPECT_EQUAL(25ul, handler->_oldestSerial);
+
+ // Before anything is flushed the oldest serial is 5.
+ // After 'foo' has been flushed the oldest serial is 20 as GC target 'bar' is not considered.
+ EXPECT_EQUAL(FlushDoneHistory({ 5, 20, 20, 25 }), handler->getFlushDoneHistory());
+}
+
TEST_F("require that oldest serial is found in group", Fixture(2, IINTERVAL))
{
auto fooT1 = std::make_shared<SimpleTarget>("fooT1", 10);
diff --git a/searchcore/src/vespa/searchcore/proton/flushengine/flushengine.cpp b/searchcore/src/vespa/searchcore/proton/flushengine/flushengine.cpp
index 0d2c556b4d6..4866ec0d710 100644
--- a/searchcore/src/vespa/searchcore/proton/flushengine/flushengine.cpp
+++ b/searchcore/src/vespa/searchcore/proton/flushengine/flushengine.cpp
@@ -27,7 +27,9 @@ findOldestFlushedSerial(const IFlushTarget::List &lst, const IFlushHandler &hand
{
search::SerialNum ret(handler.getCurrentSerialNumber());
for (const IFlushTarget::SP & target : lst) {
- ret = std::min(ret, target->getFlushedSerialNum());
+ if (target->getType() != IFlushTarget::Type::GC) {
+ ret = std::min(ret, target->getFlushedSerialNum());
+ }
}
LOG(debug, "Oldest flushed serial for '%s' is %" PRIu64 ".", handler.getName().c_str(), ret);
return ret;