diff options
author | Tor Egge <Tor.Egge@yahooinc.com> | 2023-04-14 13:29:38 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@yahooinc.com> | 2023-04-14 13:29:38 +0200 |
commit | af5510ee4e0fefb516cf2198d684cc399f0d3cd5 (patch) | |
tree | 3ac76a56ced74d70efdc08dafef3daf8caf408ef | |
parent | b66f35888ad413800ac16f841582da5bf067cb7f (diff) |
Set reserved doc values after attribute vector has been loaded.
4 files changed, 50 insertions, 1 deletions
diff --git a/searchcore/src/tests/proton/attribute/attribute_initializer/attribute_initializer_test.cpp b/searchcore/src/tests/proton/attribute/attribute_initializer/attribute_initializer_test.cpp index 52b7a7ce60a..4af23a1d7fb 100644 --- a/searchcore/src/tests/proton/attribute/attribute_initializer/attribute_initializer_test.cpp +++ b/searchcore/src/tests/proton/attribute/attribute_initializer/attribute_initializer_test.cpp @@ -7,8 +7,11 @@ #include <vespa/searchcore/proton/test/attribute_utils.h> #include <vespa/searchlib/attribute/attributefactory.h> #include <vespa/searchlib/attribute/integerbase.h> +#include <vespa/searchlib/attribute/stringbase.h> #include <vespa/searchlib/test/directory_handler.h> #include <vespa/searchcommon/attribute/config.h> +#include <vespa/searchcommon/attribute/i_multi_value_attribute.h> +#include <vespa/vespalib/util/stash.h> #include <vespa/vespalib/util/threadstackexecutor.h> #include <vespa/vespalib/testkit/testapp.h> @@ -18,8 +21,10 @@ LOG_SETUP("attribute_initializer_test"); using search::attribute::Config; using search::attribute::BasicType; using search::attribute::CollectionType; +using search::attribute::IMultiValueAttribute; using search::SerialNum; using search::test::DirectoryHandler; +using vespalib::Stash; const vespalib::string test_dir = "test_output"; @@ -60,7 +65,7 @@ Config get_int32_wset_fs() } void -saveAttr(const vespalib::string &name, const Config &cfg, SerialNum serialNum, SerialNum createSerialNum) +saveAttr(const vespalib::string &name, const Config &cfg, SerialNum serialNum, SerialNum createSerialNum, bool mutate_reserved_doc = false) { auto diskLayout = AttributeDiskLayout::create(test_dir); auto dir = diskLayout->createAttributeDir(name); @@ -81,6 +86,15 @@ saveAttr(const vespalib::string &name, const Config &cfg, SerialNum serialNum, S iav.append(docId, 10, 1); iav.append(docId, 11, 1); } + if (mutate_reserved_doc) { + av->clearDoc(0u); + if (cfg.basicType().type() == BasicType::Type::STRING && + cfg.collectionType().type() == CollectionType::Type::WSET) { + auto &sav = dynamic_cast<search::StringAttribute &>(*av); + sav.append(0u, "badly", 15); + sav.append(0u, "broken", 20); + } + } av->save(); writer->markValidSnapshot(serialNum); } @@ -250,6 +264,26 @@ TEST("require that saved attribute is ignored when serial num is not set") EXPECT_EQUAL(1u, av->getNumDocs()); } +TEST("require that reserved document is reinitialized during load") +{ + saveAttr("a", string_wset, 10, 2, true); + Fixture f; + auto av = f.createInitializer({"a", string_wset}, 5)->init().getAttribute(); + EXPECT_EQUAL(2u, av->getCreateSerialNum()); + EXPECT_EQUAL(2u, av->getNumDocs()); + auto mvav = av->as_multi_value_attribute(); + ASSERT_TRUE(mvav != nullptr); + Stash stash; + auto read_view = mvav->make_read_view(IMultiValueAttribute::WeightedSetTag<const char*>(), stash); + ASSERT_TRUE(read_view != nullptr); + auto reserved_values = read_view->get_values(0u); + EXPECT_EQUAL(1u, reserved_values.size()); + if (reserved_values.size() >= 1) { + EXPECT_EQUAL(1, reserved_values[0].weight()); + EXPECT_EQUAL(vespalib::string(""), vespalib::string(reserved_values[0].value())); + } +} + } TEST_MAIN() diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp index d39d2873edb..f6200bb14ee 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp @@ -200,6 +200,7 @@ AttributeInitializer::loadAttribute(const AttributeVectorSP &attr, attr->getBaseFileName().c_str()); return false; } else { + attr->set_reserved_doc_values(); attr->commit(CommitParam(serialNum)); EventLogger::loadAttributeComplete(_documentSubDbName, attr->getName(), timer.elapsed()); } diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.cpp b/searchlib/src/vespa/searchlib/attribute/attributevector.cpp index f0c8d9a2191..1a2c8c43b94 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributevector.cpp +++ b/searchlib/src/vespa/searchlib/attribute/attributevector.cpp @@ -440,6 +440,16 @@ AttributeVector::addReservedDoc() addDoc(docId); // Reserved assert(docId == 0u); assert(docId < getNumDocs()); + set_reserved_doc_values(); +} + +void +AttributeVector::set_reserved_doc_values() +{ + uint32_t docId = 0; + if (docId >= getNumDocs()) { + return; + } clearDoc(docId); if (hasMultiValue()) { if (isFloatingPointType()) { diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.h b/searchlib/src/vespa/searchlib/attribute/attributevector.h index e40785911ea..b58060a05bf 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributevector.h +++ b/searchlib/src/vespa/searchlib/attribute/attributevector.h @@ -478,6 +478,10 @@ public: * Add reserved initial document with docId 0 and undefined value. */ void addReservedDoc(); + /** + * set undefined values for reserved document 0. + */ + void set_reserved_doc_values(); bool getEnumeratedSave() const { return _hasEnum; } virtual attribute::IPostingListAttributeBase * getIPostingListAttributeBase(); |