summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@yahoo-inc.com>2017-05-18 09:23:45 +0000
committerTor Egge <Tor.Egge@yahoo-inc.com>2017-05-18 09:23:45 +0000
commita7049f5cc3852c72373325eb58c6ed12bf587c04 (patch)
treef8148b3d97e483f9d82bfeff3f0851274b5490c0 /searchcore
parent9bfdd5618fe19872f0ae584711e05ded012a23fb (diff)
Avoid flush engine busy loop: set flushed time even if not able to flush.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/proton/attribute/attributeflush_test.cpp9
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_populator.cpp6
-rw-r--r--searchcore/src/vespa/searchcore/proton/flushengine/shrink_lid_space_flush_target.cpp7
3 files changed, 15 insertions, 7 deletions
diff --git a/searchcore/src/tests/proton/attribute/attributeflush_test.cpp b/searchcore/src/tests/proton/attribute/attributeflush_test.cpp
index 714e9076d16..705e489f61c 100644
--- a/searchcore/src/tests/proton/attribute/attributeflush_test.cpp
+++ b/searchcore/src/tests/proton/attribute/attributeflush_test.cpp
@@ -530,7 +530,7 @@ Test::requireThatShrinkWorks()
AttributeVector::SP av = f.addAttribute("a10");
av->addDocs(1000 - av->getNumDocs());
- av->commit(10, 10);
+ av->commit(50, 50);
IFlushTarget::SP ft = am.getShrinker("a10");
EXPECT_EQUAL(ft->getApproxMemoryGain().getBefore(),
ft->getApproxMemoryGain().getAfter());
@@ -544,21 +544,22 @@ Test::requireThatShrinkWorks()
EXPECT_FALSE(av->canShrinkLidSpace());
EXPECT_EQUAL(1000u, av->getNumDocs());
EXPECT_EQUAL(100u, av->getCommittedDocIdLimit());
- f._aw.heartBeat(11);
+ f._aw.heartBeat(51);
EXPECT_TRUE(av->wantShrinkLidSpace());
EXPECT_FALSE(av->canShrinkLidSpace());
EXPECT_EQUAL(ft->getApproxMemoryGain().getBefore(),
ft->getApproxMemoryGain().getAfter());
g.reset();
- f._aw.heartBeat(11);
+ f._aw.heartBeat(52);
EXPECT_TRUE(av->wantShrinkLidSpace());
EXPECT_TRUE(av->canShrinkLidSpace());
EXPECT_TRUE(ft->getApproxMemoryGain().getBefore() >
ft->getApproxMemoryGain().getAfter());
EXPECT_EQUAL(1000u, av->getNumDocs());
EXPECT_EQUAL(100u, av->getCommittedDocIdLimit());
+ EXPECT_EQUAL(createSerialNum - 1, ft->getFlushedSerialNum());
vespalib::ThreadStackExecutor exec(1, 128 * 1024);
- vespalib::Executor::Task::UP task = ft->initFlush(11);
+ vespalib::Executor::Task::UP task = ft->initFlush(53);
exec.execute(std::move(task));
exec.sync();
exec.shutdown();
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_populator.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_populator.cpp
index 8d2665c0c3f..c89dbb9efd8 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_populator.cpp
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_populator.cpp
@@ -70,8 +70,10 @@ AttributePopulator::done()
for (const auto &flushTarget : flushTargets) {
assert(flushTarget->getFlushedSerialNum() < _configSerialNum);
auto task = flushTarget->initFlush(_configSerialNum);
- assert(task);
- task->run();
+ // shrink target only return task if able to shrink.
+ if (task) {
+ task->run();
+ }
assert(flushTarget->getFlushedSerialNum() == _configSerialNum);
}
}
diff --git a/searchcore/src/vespa/searchcore/proton/flushengine/shrink_lid_space_flush_target.cpp b/searchcore/src/vespa/searchcore/proton/flushengine/shrink_lid_space_flush_target.cpp
index a2c154e8192..2137d6f5c79 100644
--- a/searchcore/src/vespa/searchcore/proton/flushengine/shrink_lid_space_flush_target.cpp
+++ b/searchcore/src/vespa/searchcore/proton/flushengine/shrink_lid_space_flush_target.cpp
@@ -92,7 +92,12 @@ ShrinkLidSpaceFlushTarget::needUrgentFlush() const
IFlushTarget::Task::UP
ShrinkLidSpaceFlushTarget::initFlush(SerialNum currentSerial)
{
- if (!_target->canShrinkLidSpace() && currentSerial <= _flushedSerialNum) {
+ if (currentSerial < _flushedSerialNum) {
+ _lastFlushTime = fastos::ClockSystem::now();
+ return IFlushTarget::Task::UP();
+ } else if (!_target->canShrinkLidSpace()) {
+ _flushedSerialNum = currentSerial;
+ _lastFlushTime = fastos::ClockSystem::now();
return IFlushTarget::Task::UP();
} else {
return std::make_unique<Flusher>(*this, currentSerial);