diff options
author | Tor Egge <tegge@oath.com> | 2019-01-15 23:42:34 +0000 |
---|---|---|
committer | Tor Egge <tegge@oath.com> | 2019-01-15 23:44:10 +0000 |
commit | 9c0828f85af631b339182a5e81ef0b672fd67829 (patch) | |
tree | a222b51d133a40f4410732568fea90ee90f61767 /searchlib | |
parent | eda8c867de1695a59ab96887d42b5fd158dcb038 (diff) |
Set source to default source from committed docid limit to new guard
when reserving space for source mapping. This reinitializes data
that was set to "undefined" value (-128) in the backing int8_t single
value attribute when compacting lid space.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/tests/attribute/sourceselector/sourceselector_test.cpp | 25 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/fixedsourceselector.cpp | 6 |
2 files changed, 28 insertions, 3 deletions
diff --git a/searchlib/src/tests/attribute/sourceselector/sourceselector_test.cpp b/searchlib/src/tests/attribute/sourceselector/sourceselector_test.cpp index 75a0ccf6ab9..3ad3607ab23 100644 --- a/searchlib/src/tests/attribute/sourceselector/sourceselector_test.cpp +++ b/searchlib/src/tests/attribute/sourceselector/sourceselector_test.cpp @@ -3,6 +3,7 @@ #include <vespa/searchlib/attribute/fixedsourceselector.h> #include <vespa/searchlib/index/dummyfileheadercontext.h> +#include <vespa/searchcommon/common/undefinedvalues.h> #include <vespa/vespalib/testkit/testapp.h> #include <vespa/fastos/file.h> @@ -28,6 +29,7 @@ const string index_dir = "test_data"; const string base_file_name = "test_data/sourcelist"; const string base_file_name2 = "test_data/sourcelist2"; const uint32_t default_source = 7; +const uint32_t invalid_source = (uint8_t)search::attribute::getUndefined<int8_t>(); const uint32_t base_id = 42; class Test : public vespalib::TestApp @@ -50,6 +52,7 @@ private: void requireThatSourcesAreCountedCorrectly(); void requireThatSourcesAreCountedCorrectly(); void requireThatDocIdLimitIsCorrect(); + void requireThatCorrectDefaultValueIsUsedAfterCompaction(); }; int @@ -66,6 +69,7 @@ Test::Main() TEST_DO(requireThatCompleteSourceRangeIsHandled()); TEST_DO(requireThatSourcesAreCountedCorrectly()); TEST_DO(requireThatDocIdLimitIsCorrect()); + TEST_DO(requireThatCorrectDefaultValueIsUsedAfterCompaction()); TEST_DONE(); } @@ -236,6 +240,27 @@ Test::requireThatDocIdLimitIsCorrect() EXPECT_EQUAL(7u, selector2->getDocIdLimit()); } +void +Test::requireThatCorrectDefaultValueIsUsedAfterCompaction() +{ + FixedSourceSelector selector(default_source, base_file_name); + EXPECT_EQUAL(0u, selector.getDocIdLimit()); + auto it(selector.createIterator()); + selector.setSource(8, 4); + EXPECT_EQUAL(default_source, (uint32_t) it->getSource(9)); + EXPECT_EQUAL(default_source, (uint32_t) it->getSource(6)); + selector.compactLidSpace(4); + EXPECT_EQUAL(4u, selector.getDocIdLimit()); + EXPECT_EQUAL(default_source, (uint32_t) it->getSource(4)); + EXPECT_EQUAL(invalid_source, (uint32_t) it->getSource(5)); // beyond guard + selector.setSource(6, 4); + EXPECT_EQUAL(7u, selector.getDocIdLimit()); + EXPECT_EQUAL(default_source, (uint32_t) it->getSource(5)); + EXPECT_EQUAL(4u, (uint8_t) it->getSource(6)); + EXPECT_EQUAL(default_source, (uint32_t) it->getSource(7)); +} + + } // namespace TEST_APPHOOK(Test); diff --git a/searchlib/src/vespa/searchlib/attribute/fixedsourceselector.cpp b/searchlib/src/vespa/searchlib/attribute/fixedsourceselector.cpp index c2d43bf63ec..29dcad9705c 100644 --- a/searchlib/src/vespa/searchlib/attribute/fixedsourceselector.cpp +++ b/searchlib/src/vespa/searchlib/attribute/fixedsourceselector.cpp @@ -70,9 +70,9 @@ void FixedSourceSelector::reserve(uint32_t numDocs) if (newMaxDocIdPlussOne > maxDoc) { uint32_t newDocId(0); for (_source.addDoc(newDocId); newDocId < numDocs; _source.addDoc(newDocId)); - for (uint32_t i = maxDoc; i < newMaxDocIdPlussOne; ++i) { - _source.set(i, getDefaultSource()); - } + } + for (uint32_t i = _source.getCommittedDocIdLimit(); i < newMaxDocIdPlussOne; ++i) { + _source.set(i, getDefaultSource()); } } |