aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorTor Egge <tegge@oath.com>2019-01-15 23:42:34 +0000
committerTor Egge <tegge@oath.com>2019-01-15 23:44:10 +0000
commit9c0828f85af631b339182a5e81ef0b672fd67829 (patch)
treea222b51d133a40f4410732568fea90ee90f61767 /searchlib
parenteda8c867de1695a59ab96887d42b5fd158dcb038 (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.cpp25
-rw-r--r--searchlib/src/vespa/searchlib/attribute/fixedsourceselector.cpp6
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());
}
}