aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--searchcore/src/tests/proton/attribute/attribute_initializer/attribute_initializer_test.cpp13
-rw-r--r--searchcore/src/tests/proton/attribute/attribute_manager/attribute_manager_test.cpp33
-rw-r--r--searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp52
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/CMakeLists.txt1
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec.h7
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.h3
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_factory.cpp6
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_factory.h2
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp15
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.h7
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_reconfig.cpp28
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_reconfig.h28
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp28
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h3
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attributes_initializer_base.cpp5
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attributes_initializer_base.h2
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/filter_attribute_manager.cpp6
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/filter_attribute_manager.h1
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/i_attribute_factory.h3
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/i_attribute_manager.h3
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.cpp4
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.h2
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb_configurer.cpp8
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb_configurer.h3
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/searchable_doc_subdb_configurer.cpp13
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/searchable_doc_subdb_configurer.h6
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp4
-rw-r--r--searchcore/src/vespa/searchcore/proton/test/mock_attribute_manager.h4
31 files changed, 227 insertions, 69 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 106bdf5cc98..52b7a7ce60a 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
@@ -95,7 +95,7 @@ struct Fixture
vespalib::ThreadStackExecutor _executor;
Fixture();
~Fixture();
- std::unique_ptr<AttributeInitializer> createInitializer(AttributeSpec && spec, SerialNum serialNum);
+ std::unique_ptr<AttributeInitializer> createInitializer(AttributeSpec && spec, std::optional<SerialNum> serialNum);
};
Fixture::Fixture()
@@ -109,7 +109,7 @@ Fixture::Fixture()
Fixture::~Fixture() = default;
std::unique_ptr<AttributeInitializer>
-Fixture::createInitializer(AttributeSpec &&spec, SerialNum serialNum)
+Fixture::createInitializer(AttributeSpec &&spec, std::optional<SerialNum> serialNum)
{
return std::make_unique<AttributeInitializer>(_diskLayout->createAttributeDir(spec.getName()), "test.subdb", std::move(spec), serialNum, _factory, _executor);
}
@@ -241,6 +241,15 @@ TEST("require that transient memory usage is reported for attribute load without
EXPECT_EQUAL(0u, avi->get_transient_memory_usage());
}
+TEST("require that saved attribute is ignored when serial num is not set")
+{
+ saveAttr("a", int32_sv, 10, 2);
+ Fixture f;
+ auto av = f.createInitializer({"a", int32_sv}, std::nullopt)->init().getAttribute();
+ EXPECT_EQUAL(0u, av->getCreateSerialNum());
+ EXPECT_EQUAL(1u, av->getNumDocs());
+}
+
}
TEST_MAIN()
diff --git a/searchcore/src/tests/proton/attribute/attribute_manager/attribute_manager_test.cpp b/searchcore/src/tests/proton/attribute/attribute_manager/attribute_manager_test.cpp
index 616bf9edf6a..29639448023 100644
--- a/searchcore/src/tests/proton/attribute/attribute_manager/attribute_manager_test.cpp
+++ b/searchcore/src/tests/proton/attribute/attribute_manager/attribute_manager_test.cpp
@@ -2,6 +2,7 @@
#include <vespa/searchcore/proton/attribute/attribute_collection_spec_factory.h>
#include <vespa/searchcore/proton/attribute/attribute_manager_initializer.h>
+#include <vespa/searchcore/proton/attribute/attribute_manager_reconfig.h>
#include <vespa/searchcore/proton/attribute/attribute_writer.h>
#include <vespa/searchcore/proton/attribute/attributemanager.h>
#include <vespa/searchcore/proton/attribute/exclusive_attribute_read_accessor.h>
@@ -222,7 +223,7 @@ SequentialAttributeManager::SequentialAttributeManager(const AttributeManager &c
: initializer(newSpec.getDocIdLimit()),
mgr(currMgr, std::move(newSpec), initializer)
{
- mgr.addInitializedAttributes(initializer.getInitializedAttributes());
+ mgr.addInitializedAttributes(initializer.getInitializedAttributes(), std::nullopt, std::nullopt);
}
SequentialAttributeManager::~SequentialAttributeManager() = default;
@@ -877,6 +878,36 @@ TEST_F("transient resource usage is zero in steady state", Fixture)
EXPECT_EQUAL(0u, usage.memory());
}
+TEST_F("late create serial number is set on new attributes", Fixture)
+{
+ auto am1 = f.make_manager();
+ am1->addAttribute({"a1", INT32_SINGLE}, 4);
+ auto a1 = am1->getAttribute("a1")->getSP();
+ uint32_t docid = 0;
+ a1->addDoc(docid);
+ EXPECT_EQUAL(1u, docid);
+ a1->clearDoc(docid);
+ a1->commit(CommitParam(5));
+ AttrSpecList new_spec;
+ new_spec.emplace_back("a1", INT32_SINGLE);
+ new_spec.emplace_back("a2", INT32_SINGLE);
+ // late serial number
+ auto am2 = am1->prepare_create(AttrMgrSpec(std::move(new_spec), 10, std::nullopt))->create(14, 20);
+ auto am3 = std::dynamic_pointer_cast<AttributeManager>(am2);
+ EXPECT_TRUE(a1 == am3->getAttribute("a1")->getSP());
+ auto a2 = am3->getAttribute("a2")->getSP();
+ TEST_DO(assertCreateSerialNum(*am3, "a1", 4));
+ TEST_DO(assertCreateSerialNum(*am3, "a2", 20));
+ TEST_DO(assertShrinkTargetSerial(*am3, "a1", 3));
+ TEST_DO(assertShrinkTargetSerial(*am3, "a2", 19));
+ EXPECT_EQUAL(0u, am3->getFlushedSerialNum("a1"));
+ EXPECT_EQUAL(0u, am3->getFlushedSerialNum("a2"));
+ EXPECT_EQUAL(2u, a1->getNumDocs());
+ EXPECT_EQUAL(2u, a1->getCommittedDocIdLimit());
+ EXPECT_EQUAL(14u, a2->getNumDocs());
+ EXPECT_EQUAL(14u, a2->getCommittedDocIdLimit());
+}
+
TEST_MAIN()
{
std::filesystem::remove_all(std::filesystem::path(test_dir));
diff --git a/searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp b/searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp
index db5fb1ae294..2877005e2c1 100644
--- a/searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp
+++ b/searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp
@@ -47,6 +47,7 @@ using namespace vespa::config::search;
using namespace vespalib;
using proton::matching::SessionManager;
+using search::SerialNum;
using searchcorespi::IndexSearchable;
using searchcorespi::index::IThreadingService;
using proton::test::MockGidToLidChangeHandler;
@@ -165,12 +166,14 @@ struct Fixture
void reconfigure(const DocumentDBConfig& new_config_snapshot,
const DocumentDBConfig& old_config_snapshot,
const ReconfigParams& reconfig_params,
- IDocumentDBReferenceResolver& resolver);
+ IDocumentDBReferenceResolver& resolver,
+ SerialNum serial_num);
IReprocessingInitializer::UP reconfigure(const DocumentDBConfig& new_config_snapshot,
const DocumentDBConfig& old_config_snapshot,
AttributeCollectionSpec&& attr_spec,
const ReconfigParams& reconfig_params,
- IDocumentDBReferenceResolver& resolver);
+ IDocumentDBReferenceResolver& resolver,
+ SerialNum serial_num);
};
Fixture::Fixture()
@@ -240,10 +243,11 @@ void
Fixture::reconfigure(const DocumentDBConfig& new_config_snapshot,
const DocumentDBConfig& old_config_snapshot,
const ReconfigParams& reconfig_params,
- IDocumentDBReferenceResolver& resolver)
+ IDocumentDBReferenceResolver& resolver,
+ SerialNum serial_num)
{
auto prepared_reconfig = _configurer->prepare_reconfig(new_config_snapshot, old_config_snapshot, reconfig_params);
- _configurer->reconfigure(new_config_snapshot, old_config_snapshot, reconfig_params, resolver, *prepared_reconfig);
+ _configurer->reconfigure(new_config_snapshot, old_config_snapshot, reconfig_params, resolver, *prepared_reconfig, serial_num);
}
IReprocessingInitializer::UP
@@ -251,10 +255,11 @@ Fixture::reconfigure(const DocumentDBConfig& new_config_snapshot,
const DocumentDBConfig& old_config_snapshot,
AttributeCollectionSpec&& attr_spec,
const ReconfigParams& reconfig_params,
- IDocumentDBReferenceResolver& resolver)
+ IDocumentDBReferenceResolver& resolver,
+ SerialNum serial_num)
{
auto prepared_reconfig = _configurer->prepare_reconfig(new_config_snapshot, old_config_snapshot, reconfig_params);
- return _configurer->reconfigure(new_config_snapshot, old_config_snapshot, std::move(attr_spec), reconfig_params, resolver, *prepared_reconfig);
+ return _configurer->reconfigure(new_config_snapshot, old_config_snapshot, std::move(attr_spec), reconfig_params, resolver, *prepared_reconfig, serial_num);
}
using MySummaryAdapter = test::MockSummaryAdapter;
@@ -325,17 +330,19 @@ struct FastAccessFixture
IReprocessingInitializer::UP
reconfigure(const DocumentDBConfig& new_config_snapshot,
const DocumentDBConfig& old_config_snapshot,
- AttributeCollectionSpec&& attr_spec);
+ AttributeCollectionSpec&& attr_spec,
+ SerialNum serial_num);
};
IReprocessingInitializer::UP
FastAccessFixture::reconfigure(const DocumentDBConfig& new_config_snapshot,
const DocumentDBConfig& old_config_snapshot,
- AttributeCollectionSpec&& attr_spec)
+ AttributeCollectionSpec&& attr_spec,
+ SerialNum serial_num)
{
ReconfigParams reconfig_params{CCR()};
auto prepared_reconfig = _configurer.prepare_reconfig(new_config_snapshot, old_config_snapshot, reconfig_params);
- return _configurer.reconfigure(new_config_snapshot, old_config_snapshot, std::move(attr_spec), *prepared_reconfig);
+ return _configurer.reconfigure(new_config_snapshot, old_config_snapshot, std::move(attr_spec), *prepared_reconfig, serial_num);
}
DocumentDBConfig::SP
@@ -500,9 +507,10 @@ TEST_F("require that we can reconfigure attribute manager", Fixture)
ViewPtrs o = f._views.getViewPtrs();
ReconfigParams params(CCR().setAttributesChanged(true).setSchemaChanged(true));
// Use new config snapshot == old config snapshot (only relevant for reprocessing)
+ SerialNum reconfig_serial_num = 0;
f.reconfigure(*createConfig(), *createConfig(),
- AttributeCollectionSpec(AttributeCollectionSpec::AttributeList(), 1, 0),
- params, f._resolver);
+ AttributeCollectionSpec(AttributeCollectionSpec::AttributeList(), 1, reconfig_serial_num),
+ params, f._resolver, reconfig_serial_num);
ViewPtrs n = f._views.getViewPtrs();
{ // verify search view
@@ -538,9 +546,10 @@ checkAttributeWriterChangeOnRepoChange(Fixture &f, bool docTypeRepoChanged)
auto oldAttributeWriter = getAttributeWriter(f);
ReconfigParams params(CCR().setDocumentTypeRepoChanged(docTypeRepoChanged));
// Use new config snapshot == old config snapshot (only relevant for reprocessing)
+ SerialNum reconfig_serial_num = 0;
f.reconfigure(*createConfig(), *createConfig(),
- AttributeCollectionSpec(AttributeCollectionSpec::AttributeList(), 1, 0),
- params, f._resolver);
+ AttributeCollectionSpec(AttributeCollectionSpec::AttributeList(), 1, reconfig_serial_num),
+ params, f._resolver, reconfig_serial_num);
auto newAttributeWriter = getAttributeWriter(f);
if (docTypeRepoChanged) {
EXPECT_NOT_EQUAL(oldAttributeWriter, newAttributeWriter);
@@ -558,10 +567,11 @@ TEST_F("require that we get new attribute writer if document type repo changes",
TEST_F("require that reconfigure returns reprocessing initializer when changing attributes", Fixture)
{
ReconfigParams params(CCR().setAttributesChanged(true).setSchemaChanged(true));
+ SerialNum reconfig_serial_num = 0;
IReprocessingInitializer::UP init =
f.reconfigure(*createConfig(), *createConfig(),
- AttributeCollectionSpec(AttributeCollectionSpec::AttributeList(), 1, 0),
- params, f._resolver);
+ AttributeCollectionSpec(AttributeCollectionSpec::AttributeList(), 1, reconfig_serial_num),
+ params, f._resolver, reconfig_serial_num);
EXPECT_TRUE(init.get() != nullptr);
EXPECT_TRUE((dynamic_cast<AttributeReprocessingInitializer *>(init.get())) != nullptr);
@@ -571,8 +581,9 @@ TEST_F("require that reconfigure returns reprocessing initializer when changing
TEST_F("require that we can reconfigure attribute writer", FastAccessFixture)
{
FastAccessFeedView::SP o = f._view._feedView.get();
+ SerialNum reconfig_serial_num = 0;
f.reconfigure(*createConfig(), *createConfig(),
- AttributeCollectionSpec(AttributeCollectionSpec::AttributeList(), 1, 0));
+ AttributeCollectionSpec(AttributeCollectionSpec::AttributeList(), 1, reconfig_serial_num), reconfig_serial_num);
FastAccessFeedView::SP n = f._view._feedView.get();
FastAccessFeedViewComparer cmp(o, n);
@@ -584,8 +595,9 @@ TEST_F("require that we can reconfigure attribute writer", FastAccessFixture)
TEST_F("require that reconfigure returns reprocessing initializer", FastAccessFixture)
{
+ SerialNum reconfig_serial_num = 0;
IReprocessingInitializer::UP init = f.reconfigure(*createConfig(), *createConfig(),
- AttributeCollectionSpec(AttributeCollectionSpec::AttributeList(), 1, 0));
+ AttributeCollectionSpec(AttributeCollectionSpec::AttributeList(), 1, reconfig_serial_num), reconfig_serial_num);
EXPECT_TRUE(init.get() != nullptr);
EXPECT_TRUE((dynamic_cast<AttributeReprocessingInitializer *>(init.get())) != nullptr);
@@ -597,7 +609,8 @@ TEST_F("require that we can reconfigure summary manager", Fixture)
ViewPtrs o = f._views.getViewPtrs();
ReconfigParams params(CCR().setSummaryChanged(true));
// Use new config snapshot == old config snapshot (only relevant for reprocessing)
- f.reconfigure(*createConfig(), *createConfig(), params, f._resolver);
+ SerialNum reconfig_serial_num = 0;
+ f.reconfigure(*createConfig(), *createConfig(), params, f._resolver, reconfig_serial_num);
ViewPtrs n = f._views.getViewPtrs();
{ // verify search view
@@ -616,8 +629,9 @@ TEST_F("require that we can reconfigure matchers", Fixture)
{
ViewPtrs o = f._views.getViewPtrs();
// Use new config snapshot == old config snapshot (only relevant for reprocessing)
+ SerialNum reconfig_serial_num = 0;
f.reconfigure(*createConfig(o.fv->getSchema()), *createConfig(o.fv->getSchema()),
- ReconfigParams(CCR().setRankProfilesChanged(true)), f._resolver);
+ ReconfigParams(CCR().setRankProfilesChanged(true)), f._resolver, reconfig_serial_num);
ViewPtrs n = f._views.getViewPtrs();
{ // verify search view
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/CMakeLists.txt b/searchcore/src/vespa/searchcore/proton/attribute/CMakeLists.txt
index 856c89eae37..82bb188870f 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/CMakeLists.txt
+++ b/searchcore/src/vespa/searchcore/proton/attribute/CMakeLists.txt
@@ -12,6 +12,7 @@ vespa_add_library(searchcore_attribute STATIC
attribute_initializer_result.cpp
attribute_manager_explorer.cpp
attribute_manager_initializer.cpp
+ attribute_manager_reconfig.cpp
attribute_populator.cpp
attribute_spec.cpp
attribute_transient_memory_calculator.cpp
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec.cpp
index 35c54d31fd0..9f23e8bb50b 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec.cpp
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec.cpp
@@ -4,7 +4,7 @@
namespace proton {
-AttributeCollectionSpec::AttributeCollectionSpec(AttributeList && attributes, uint32_t docIdLimit, SerialNum currentSerialNum)
+AttributeCollectionSpec::AttributeCollectionSpec(AttributeList && attributes, uint32_t docIdLimit, std::optional<SerialNum> currentSerialNum)
: _attributes(std::move(attributes)),
_docIdLimit(docIdLimit),
_currentSerialNum(currentSerialNum)
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec.h b/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec.h
index 1ee9e92ce8c..406739aac94 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec.h
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec.h
@@ -4,6 +4,7 @@
#include "attribute_spec.h"
#include <vespa/searchlib/common/serialnum.h>
+#include <optional>
#include <vector>
namespace proton {
@@ -21,10 +22,10 @@ private:
AttributeList _attributes;
uint32_t _docIdLimit;
- SerialNum _currentSerialNum;
+ std::optional<SerialNum> _currentSerialNum;
public:
- AttributeCollectionSpec(AttributeList && attributes, uint32_t docIdLimit, SerialNum currentSerialNum);
+ AttributeCollectionSpec(AttributeList && attributes, uint32_t docIdLimit, std::optional<SerialNum> currentSerialNum);
~AttributeCollectionSpec();
const AttributeList &getAttributes() const {
return _attributes;
@@ -35,7 +36,7 @@ public:
uint32_t getDocIdLimit() const {
return _docIdLimit;
}
- SerialNum getCurrentSerialNum() const {
+ const std::optional<SerialNum>& getCurrentSerialNum() const noexcept {
return _currentSerialNum;
}
bool hasAttribute(const vespalib::string &name) const;
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.cpp
index 663491e9c64..2be0e0a58f8 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.cpp
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.cpp
@@ -20,7 +20,7 @@ AttributeCollectionSpecFactory::~AttributeCollectionSpecFactory() = default;
std::unique_ptr<AttributeCollectionSpec>
AttributeCollectionSpecFactory::create(const AttributesConfig &attrCfg,
uint32_t docIdLimit,
- search::SerialNum serialNum) const
+ std::optional<search::SerialNum> serialNum) const
{
AttributeCollectionSpec::AttributeList attrs;
// Amortize memory spike cost over N docs
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.h b/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.h
index 8ef06f20bac..06b3f677640 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.h
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.h
@@ -5,6 +5,7 @@
#include "attribute_collection_spec.h"
#include <vespa/searchcore/proton/common/alloc_strategy.h>
#include <vespa/searchlib/common/serialnum.h>
+#include <optional>
namespace vespa::config::search::internal { class InternalAttributesType; };
@@ -26,7 +27,7 @@ public:
AttributeCollectionSpecFactory(const AllocStrategy& alloc_strategy, bool fastAccessOnly);
~AttributeCollectionSpecFactory();
- std::unique_ptr<AttributeCollectionSpec> create(const AttributesConfig &attrCfg, uint32_t docIdLimit, search::SerialNum serialNum) const;
+ std::unique_ptr<AttributeCollectionSpec> create(const AttributesConfig &attrCfg, uint32_t docIdLimit, std::optional<search::SerialNum> serialNum) const;
};
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_factory.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_factory.cpp
index 45b1dc41057..707b70510f8 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_factory.cpp
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_factory.cpp
@@ -19,9 +19,11 @@ AttributeFactory::create(const vespalib::string &name, const search::attribute::
}
void
-AttributeFactory::setupEmpty(const AttributeVector::SP &vec, search::SerialNum serialNum) const
+AttributeFactory::setupEmpty(const AttributeVector::SP &vec, std::optional<search::SerialNum> serialNum) const
{
- vec->setCreateSerialNum(serialNum);
+ if (serialNum.has_value()) {
+ vec->setCreateSerialNum(serialNum.value());
+ }
vec->addReservedDoc();
}
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_factory.h b/searchcore/src/vespa/searchcore/proton/attribute/attribute_factory.h
index 4b8021d1bc0..7901b55801c 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_factory.h
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_factory.h
@@ -16,7 +16,7 @@ public:
AttributeFactory();
AttributeVectorSP create(const vespalib::string &name, const search::attribute::Config &cfg) const override;
- void setupEmpty(const AttributeVectorSP &vec, search::SerialNum serialNum) const override;
+ void setupEmpty(const AttributeVectorSP &vec, std::optional<search::SerialNum> serialNum) const override;
};
}
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp
index 19e387a2b64..16be2c1bd25 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp
@@ -209,11 +209,12 @@ void
AttributeInitializer::setupEmptyAttribute(AttributeVectorSP &attr, search::SerialNum serialNum,
const AttributeHeader &header) const
{
- if (header.getCreateSerialNum() > _currentSerialNum) {
- logAttributeTooNew(header, _currentSerialNum);
+ assert(_currentSerialNum.has_value());
+ if (header.getCreateSerialNum() > _currentSerialNum.value()) {
+ logAttributeTooNew(header, _currentSerialNum.value());
}
- if (serialNum < _currentSerialNum) {
- logAttributeTooOld(header, serialNum, _currentSerialNum);
+ if (serialNum < _currentSerialNum.value()) {
+ logAttributeTooOld(header, serialNum, _currentSerialNum.value());
}
if (!headerTypeOK(header, attr->getConfig())) {
logAttributeWrongType(attr, header);
@@ -234,7 +235,7 @@ AttributeInitializer::createAndSetupEmptyAttribute() const
AttributeInitializer::AttributeInitializer(const std::shared_ptr<AttributeDirectory> &attrDir,
const vespalib::string &documentSubDbName,
AttributeSpec && spec,
- uint64_t currentSerialNum,
+ std::optional<uint64_t> currentSerialNum,
const IAttributeFactory &factory,
vespalib::Executor& shared_executor)
: _attrDir(attrDir),
@@ -246,7 +247,9 @@ AttributeInitializer::AttributeInitializer(const std::shared_ptr<AttributeDirect
_header(),
_header_ok(false)
{
- readHeader();
+ if (_currentSerialNum.has_value()) {
+ readHeader();
+ }
}
AttributeInitializer::~AttributeInitializer() = default;
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.h b/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.h
index c83fe404cde..e56877bdded 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.h
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.h
@@ -6,6 +6,7 @@
#include "attribute_initializer_result.h"
#include <vespa/vespalib/stllike/string.h>
#include <vespa/searchlib/common/serialnum.h>
+#include <optional>
namespace search::attribute { class AttributeHeader; }
namespace vespalib { class Executor; }
@@ -28,7 +29,7 @@ private:
std::shared_ptr<AttributeDirectory> _attrDir;
const vespalib::string _documentSubDbName;
const AttributeSpec _spec;
- const uint64_t _currentSerialNum;
+ const std::optional<uint64_t> _currentSerialNum;
const IAttributeFactory &_factory;
vespalib::Executor &_shared_executor;
std::unique_ptr<const search::attribute::AttributeHeader> _header;
@@ -47,12 +48,12 @@ private:
public:
AttributeInitializer(const std::shared_ptr<AttributeDirectory> &attrDir, const vespalib::string &documentSubDbName,
- AttributeSpec && spec, uint64_t currentSerialNum, const IAttributeFactory &factory,
+ AttributeSpec && spec, std::optional<uint64_t> currentSerialNum, const IAttributeFactory &factory,
vespalib::Executor& shared_executor);
~AttributeInitializer();
AttributeInitializerResult init() const;
- uint64_t getCurrentSerialNum() const { return _currentSerialNum; }
+ const std::optional<uint64_t>& getCurrentSerialNum() const noexcept { return _currentSerialNum; }
size_t get_transient_memory_usage() const;
};
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp
index 3d6d522dd44..c15a15e44e5 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp
@@ -86,7 +86,7 @@ void
AttributeManagerInitializerTask::run()
{
_attrMgr->addExtraAttribute(_documentMetaStore);
- _attrMgr->addInitializedAttributes(_attributesResult.get());
+ _attrMgr->addInitializedAttributes(_attributesResult.get(), std::nullopt, std::nullopt);
_attrMgr->pruneRemovedFields(_configSerialNum);
_promise.set_value();
}
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_reconfig.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_reconfig.cpp
new file mode 100644
index 00000000000..2942256f534
--- /dev/null
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_reconfig.cpp
@@ -0,0 +1,28 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "attribute_manager_reconfig.h"
+#include "attributemanager.h"
+#include "sequential_attributes_initializer.h"
+#include <cassert>
+
+namespace proton {
+
+AttributeManagerReconfig::AttributeManagerReconfig(std::shared_ptr<AttributeManager> mgr,
+ std::unique_ptr<SequentialAttributesInitializer> initializer)
+ : _mgr(std::move(mgr)),
+ _initializer(std::move(initializer))
+{
+}
+
+AttributeManagerReconfig::~AttributeManagerReconfig() = default;
+
+std::shared_ptr<AttributeManager>
+AttributeManagerReconfig::create(std::optional<uint32_t> docid_limit, std::optional<search::SerialNum> serial_num)
+{
+ assert(_mgr);
+ _mgr->addInitializedAttributes(_initializer->getInitializedAttributes(), docid_limit, serial_num);
+ return std::move(_mgr);
+}
+
+
+}
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_reconfig.h b/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_reconfig.h
new file mode 100644
index 00000000000..da8ae163fb5
--- /dev/null
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_reconfig.h
@@ -0,0 +1,28 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/searchlib/common/serialnum.h>
+#include <memory>
+#include <optional>
+
+namespace proton {
+
+class AttributeManager;
+class SequentialAttributesInitializer;
+
+/**
+ * Class representing the result of the prepare step of an AttributeManager
+ * reconfig.
+ */
+class AttributeManagerReconfig {
+ std::shared_ptr<AttributeManager> _mgr;
+ std::unique_ptr<SequentialAttributesInitializer> _initializer;
+public:
+ AttributeManagerReconfig(std::shared_ptr<AttributeManager> mgr,
+ std::unique_ptr<SequentialAttributesInitializer> initializer);
+ ~AttributeManagerReconfig();
+ std::shared_ptr<AttributeManager> create(std::optional<uint32_t> docid_limit, std::optional<search::SerialNum> serial_num);
+};
+
+}
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp
index c03ae3b2f1f..e27fae65de3 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp
@@ -3,6 +3,7 @@
#include "attributemanager.h"
#include "attribute_directory.h"
#include "attribute_factory.h"
+#include "attribute_manager_reconfig.h"
#include "attribute_type_matcher.h"
#include "attributedisklayout.h"
#include "flushableattribute.h"
@@ -210,7 +211,7 @@ AttributeManager::addNewAttributes(const Spec &newSpec,
{
for (auto &aspec : toBeAdded) {
LOG(debug, "Creating initializer for attribute vector '%s': docIdLimit=%u, serialNumber=%" PRIu64,
- aspec.getName().c_str(), newSpec.getDocIdLimit(), newSpec.getCurrentSerialNum());
+ aspec.getName().c_str(), newSpec.getDocIdLimit(), newSpec.getCurrentSerialNum().value_or(0));
auto initializer = std::make_unique<AttributeInitializer>(_diskLayout->createAttributeDir(aspec.getName()),
_documentSubDbName, std::move(aspec), newSpec.getCurrentSerialNum(),
@@ -324,11 +325,17 @@ AttributeManager::addAttribute(AttributeSpec && spec, uint64_t serialNum)
}
void
-AttributeManager::addInitializedAttributes(const std::vector<AttributeInitializerResult> &attributes)
+AttributeManager::addInitializedAttributes(const std::vector<AttributeInitializerResult> &attributes, std::optional<uint32_t> docid_limit, std::optional<SerialNum> serial_num)
{
for (const auto &result : attributes) {
assert(result);
auto attr = result.getAttribute();
+ if (docid_limit.has_value()) {
+ AttributeManager::padAttribute(*attr, docid_limit.value());
+ }
+ if (serial_num.has_value()) {
+ attr->setCreateSerialNum(serial_num.value());
+ }
attr->setInterlock(_interlock);
auto shrinker = allocShrinker(attr, _attributeFieldWriter, *_diskLayout);
addAttribute(AttributeWrap::normalAttribute(std::move(attr)), shrinker);
@@ -484,13 +491,20 @@ AttributeManager::createContext() const
return std::make_unique<AttributeContext>(*this);
}
+std::unique_ptr<AttributeManagerReconfig>
+AttributeManager::prepare_create(Spec&& spec) const
+{
+ auto initializer = std::make_unique<SequentialAttributesInitializer>(spec.getDocIdLimit());
+ auto result = std::make_shared<AttributeManager>(*this, std::move(spec), *initializer);
+ return std::make_unique<AttributeManagerReconfig>(std::move(result), std::move(initializer));
+}
+
proton::IAttributeManager::SP
-AttributeManager::create(Spec && spec) const
+AttributeManager::create(Spec&& spec) const
{
- SequentialAttributesInitializer initializer(spec.getDocIdLimit());
- proton::AttributeManager::SP result = std::make_shared<AttributeManager>(*this, std::move(spec), initializer);
- result->addInitializedAttributes(initializer.getInitializedAttributes());
- return result;
+ assert(spec.getCurrentSerialNum().has_value());
+ auto prepared_result = prepare_create(std::move(spec));
+ return prepared_result->create(std::nullopt, std::nullopt);
}
std::vector<IFlushTarget::SP>
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h b/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h
index 65729767dbb..35895e5422c 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h
@@ -123,7 +123,7 @@ public:
AttributeVectorSP addAttribute(AttributeSpec && spec, uint64_t serialNum);
- void addInitializedAttributes(const std::vector<AttributeInitializerResult> &attributes);
+ void addInitializedAttributes(const std::vector<AttributeInitializerResult> &attributes, std::optional<uint32_t> docid_limit, std::optional<SerialNum> serial_num);
void addExtraAttribute(const AttributeVectorSP &attribute);
@@ -151,6 +151,7 @@ public:
// Implements proton::IAttributeManager
+ std::unique_ptr<AttributeManagerReconfig> prepare_create(Spec && spec) const override;
proton::IAttributeManager::SP create(Spec && spec) const override;
std::vector<IFlushTargetSP> getFlushTargets() const override;
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attributes_initializer_base.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attributes_initializer_base.cpp
index 7fcf541fd02..391e188e3fd 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attributes_initializer_base.cpp
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attributes_initializer_base.cpp
@@ -8,7 +8,7 @@ namespace proton {
void
AttributesInitializerBase::considerPadAttribute(search::AttributeVector &attribute,
- search::SerialNum currentSerialNum,
+ std::optional<search::SerialNum> currentSerialNum,
uint32_t newDocIdLimit)
{
/*
@@ -32,7 +32,8 @@ AttributesInitializerBase::considerPadAttribute(search::AttributeVector &attribu
* 1, since a replay of a non-corrupted transaction log should
* grow the attribute as needed.
*/
- if (attribute.getStatus().getLastSyncToken() < currentSerialNum) {
+ if (!currentSerialNum.has_value() ||
+ attribute.getStatus().getLastSyncToken() < currentSerialNum.value()) {
AttributeManager::padAttribute(attribute, newDocIdLimit);
attribute.commit();
assert(newDocIdLimit <= attribute.getNumDocs());
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attributes_initializer_base.h b/searchcore/src/vespa/searchcore/proton/attribute/attributes_initializer_base.h
index de300b7bc52..9eae1b40f17 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/attributes_initializer_base.h
+++ b/searchcore/src/vespa/searchcore/proton/attribute/attributes_initializer_base.h
@@ -21,7 +21,7 @@ protected:
public:
static void considerPadAttribute(search::AttributeVector &attribute,
- search::SerialNum currentSerialNum,
+ std::optional<search::SerialNum> currentSerialNum,
uint32_t newDocIdLimit);
AttributesInitializerBase();
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/filter_attribute_manager.cpp b/searchcore/src/vespa/searchcore/proton/attribute/filter_attribute_manager.cpp
index 88475db472c..8f57546d3c5 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/filter_attribute_manager.cpp
+++ b/searchcore/src/vespa/searchcore/proton/attribute/filter_attribute_manager.cpp
@@ -77,6 +77,12 @@ FilterAttributeManager::createContext() const {
throw vespalib::IllegalArgumentException("Not implemented");
}
+std::unique_ptr<AttributeManagerReconfig>
+FilterAttributeManager::prepare_create(AttributeCollectionSpec&&) const
+{
+ throw vespalib::IllegalArgumentException("Not implemented");
+}
+
IAttributeManager::SP
FilterAttributeManager::create(AttributeCollectionSpec &&) const {
throw vespalib::IllegalArgumentException("Not implemented");
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/filter_attribute_manager.h b/searchcore/src/vespa/searchcore/proton/attribute/filter_attribute_manager.h
index 1a10000978e..4397bf81107 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/filter_attribute_manager.h
+++ b/searchcore/src/vespa/searchcore/proton/attribute/filter_attribute_manager.h
@@ -38,6 +38,7 @@ public:
std::unique_ptr<search::attribute::AttributeReadGuard> getAttributeReadGuard(const vespalib::string &name, bool stableEnumGuard) const override;
// Implements proton::IAttributeManager
+ std::unique_ptr<AttributeManagerReconfig> prepare_create(AttributeCollectionSpec&& spec) const override;
IAttributeManager::SP create(AttributeCollectionSpec &&) const override;
std::vector<searchcorespi::IFlushTarget::SP> getFlushTargets() const override;
search::SerialNum getOldestFlushedSerialNumber() const override;
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/i_attribute_factory.h b/searchcore/src/vespa/searchcore/proton/attribute/i_attribute_factory.h
index 6405ca79a4d..caa576e483e 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/i_attribute_factory.h
+++ b/searchcore/src/vespa/searchcore/proton/attribute/i_attribute_factory.h
@@ -5,6 +5,7 @@
#include <vespa/searchlib/common/serialnum.h>
#include <vespa/vespalib/stllike/string.h>
#include <memory>
+#include <optional>
namespace search { class AttributeVector; }
namespace search::attribute { class Config; }
@@ -23,7 +24,7 @@ struct IAttributeFactory
virtual AttributeVectorSP create(const vespalib::string &name,
const search::attribute::Config &cfg) const = 0;
virtual void setupEmpty(const AttributeVectorSP &vec,
- search::SerialNum serialNum) const = 0;
+ std::optional<search::SerialNum> serialNum) const = 0;
};
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/i_attribute_manager.h b/searchcore/src/vespa/searchcore/proton/attribute/i_attribute_manager.h
index ce163827d42..00a95607010 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/i_attribute_manager.h
+++ b/searchcore/src/vespa/searchcore/proton/attribute/i_attribute_manager.h
@@ -21,6 +21,7 @@ namespace vespalib {
namespace proton {
+class AttributeManagerReconfig;
class ImportedAttributesRepo;
/**
@@ -36,6 +37,8 @@ struct IAttributeManager : public search::IAttributeManager
using IAttributeFunctor = search::attribute::IAttributeFunctor;
using IConstAttributeFunctor = search::attribute::IConstAttributeFunctor;
+ virtual std::unique_ptr<AttributeManagerReconfig> prepare_create(AttributeCollectionSpec&& spec) const = 0;
+
/**
* Create a new attribute manager based on the content of the current one and
* the given attribute collection spec.
diff --git a/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.cpp b/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.cpp
index 3e2bd4f520a..5a2e9447f9c 100644
--- a/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.cpp
@@ -102,7 +102,7 @@ FastAccessDocSubDB::setupAttributeManager(AttributeManager::SP attrMgrResult)
std::unique_ptr<AttributeCollectionSpec>
-FastAccessDocSubDB::createAttributeSpec(const AttributesConfig &attrCfg, const AllocStrategy& alloc_strategy, SerialNum serialNum) const
+FastAccessDocSubDB::createAttributeSpec(const AttributesConfig &attrCfg, const AllocStrategy& alloc_strategy, std::optional<SerialNum> serialNum) const
{
uint32_t docIdLimit(_dms->getCommittedDocIdLimit());
AttributeCollectionSpecFactory factory(alloc_strategy, _fastAccessAttributesOnly);
@@ -270,7 +270,7 @@ FastAccessDocSubDB::applyConfig(const DocumentDBConfig &newConfigSnapshot, const
std::unique_ptr<AttributeCollectionSpec> attrSpec =
createAttributeSpec(newConfigSnapshot.getAttributesConfig(), alloc_strategy, serialNum);
IReprocessingInitializer::UP initializer =
- _configurer.reconfigure(newConfigSnapshot, oldConfigSnapshot, std::move(*attrSpec), prepared_reconfig);
+ _configurer.reconfigure(newConfigSnapshot, oldConfigSnapshot, std::move(*attrSpec), prepared_reconfig, serialNum);
if (initializer->hasReprocessors()) {
tasks.push_back(IReprocessingTask::SP(createReprocessingTask(*initializer,
newConfigSnapshot.getDocumentTypeRepoSP()).release()));
diff --git a/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.h b/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.h
index dec8dd3687b..cec2e8595cf 100644
--- a/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.h
+++ b/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.h
@@ -91,7 +91,7 @@ protected:
std::shared_ptr<search::attribute::Interlock> _attribute_interlock;
DocIdLimit _docIdLimit;
- std::unique_ptr<AttributeCollectionSpec> createAttributeSpec(const AttributesConfig &attrCfg, const AllocStrategy& alloc_strategy, SerialNum serialNum) const;
+ std::unique_ptr<AttributeCollectionSpec> createAttributeSpec(const AttributesConfig &attrCfg, const AllocStrategy& alloc_strategy, std::optional<SerialNum> serialNum) const;
AttributeManager::SP getAndResetInitAttributeManager();
virtual IFlushTargetList getFlushTargetsInternal() override;
void reconfigureAttributeMetrics(const IAttributeManager &newMgr, const IAttributeManager &oldMgr);
diff --git a/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb_configurer.cpp b/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb_configurer.cpp
index 80c609caf61..a8211d246e1 100644
--- a/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb_configurer.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb_configurer.cpp
@@ -58,11 +58,13 @@ IReprocessingInitializer::UP
FastAccessDocSubDBConfigurer::reconfigure(const DocumentDBConfig &newConfig,
const DocumentDBConfig &oldConfig,
AttributeCollectionSpec && attrSpec,
- const DocumentSubDBReconfig& prepared_reconfig)
+ const DocumentSubDBReconfig& prepared_reconfig,
+ search::SerialNum serial_num)
{
(void) prepared_reconfig;
FastAccessFeedView::SP oldView = _feedView.get();
- search::SerialNum currentSerialNum = attrSpec.getCurrentSerialNum();
+ auto& attr_spec_serial_num = attrSpec.getCurrentSerialNum();
+ assert(!attr_spec_serial_num.has_value() || attr_spec_serial_num.value() == serial_num);
IAttributeWriter::SP writer = _factory->create(oldView->getAttributeWriter(), std::move(attrSpec));
reconfigureFeedView(*oldView, newConfig.getSchemaSP(), newConfig.getDocumentTypeRepoSP(), writer);
@@ -75,7 +77,7 @@ FastAccessDocSubDBConfigurer::reconfigure(const DocumentDBConfig &newConfig,
return std::make_unique<AttributeReprocessingInitializer>
(ARIConfig(writer->getAttributeManager(), *newConfig.getSchemaSP()),
ARIConfig(oldView->getAttributeWriter()->getAttributeManager(), *oldConfig.getSchemaSP()),
- inspector, oldIndexschemaInspector, _subDbName, currentSerialNum);
+ inspector, oldIndexschemaInspector, _subDbName, serial_num);
}
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb_configurer.h b/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb_configurer.h
index d39a41519a6..6d57a9cc3de 100644
--- a/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb_configurer.h
+++ b/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb_configurer.h
@@ -38,7 +38,8 @@ public:
IReprocessingInitializer::UP reconfigure(const DocumentDBConfig &newConfig,
const DocumentDBConfig &oldConfig,
AttributeCollectionSpec && attrSpec,
- const DocumentSubDBReconfig& prepared_reconfig);
+ const DocumentSubDBReconfig& prepared_reconfig,
+ search::SerialNum serial_num);
};
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/server/searchable_doc_subdb_configurer.cpp b/searchcore/src/vespa/searchcore/proton/server/searchable_doc_subdb_configurer.cpp
index 2263876c04e..f3b83e08546 100644
--- a/searchcore/src/vespa/searchcore/proton/server/searchable_doc_subdb_configurer.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/searchable_doc_subdb_configurer.cpp
@@ -158,11 +158,12 @@ reconfigure(const DocumentDBConfig &newConfig,
const DocumentDBConfig &oldConfig,
const ReconfigParams &params,
IDocumentDBReferenceResolver &resolver,
- const DocumentSubDBReconfig& prepared_reconfig)
+ const DocumentSubDBReconfig& prepared_reconfig,
+ search::SerialNum serial_num)
{
assert(!params.shouldAttributeManagerChange());
AttributeCollectionSpec attrSpec(AttributeCollectionSpec::AttributeList(), 0, 0);
- reconfigure(newConfig, oldConfig, std::move(attrSpec), params, resolver, prepared_reconfig);
+ reconfigure(newConfig, oldConfig, std::move(attrSpec), params, resolver, prepared_reconfig, serial_num);
}
namespace {
@@ -195,12 +196,14 @@ SearchableDocSubDBConfigurer::reconfigure(const DocumentDBConfig &newConfig,
AttributeCollectionSpec && attrSpec,
const ReconfigParams &params,
IDocumentDBReferenceResolver &resolver,
- const DocumentSubDBReconfig& prepared_reconfig)
+ const DocumentSubDBReconfig& prepared_reconfig,
+ search::SerialNum serial_num)
{
bool shouldMatchViewChange = prepared_reconfig.has_matchers_changed();
bool shouldSearchViewChange = false;
bool shouldFeedViewChange = params.shouldSchemaChange();
- search::SerialNum currentSerialNum = attrSpec.getCurrentSerialNum();
+ auto& attr_spec_serial_num = attrSpec.getCurrentSerialNum();
+ assert(!attr_spec_serial_num.has_value() || attr_spec_serial_num.value() == serial_num);
SearchView::SP searchView = _searchView.get();
auto matchers = prepared_reconfig.matchers();
IReprocessingInitializer::UP initializer;
@@ -219,7 +222,7 @@ SearchableDocSubDBConfigurer::reconfigure(const DocumentDBConfig &newConfig,
attrWriter = newAttrWriter;
shouldFeedViewChange = true;
initializer = createAttributeReprocessingInitializer(newConfig, newAttrMgr, oldConfig, oldAttrMgr,
- _subDbName, currentSerialNum);
+ _subDbName, serial_num);
} else if (params.shouldAttributeWriterChange()) {
attrWriter = std::make_shared<AttributeWriter>(attrMgr);
shouldFeedViewChange = true;
diff --git a/searchcore/src/vespa/searchcore/proton/server/searchable_doc_subdb_configurer.h b/searchcore/src/vespa/searchcore/proton/server/searchable_doc_subdb_configurer.h
index 0937a754640..b3ec169afeb 100644
--- a/searchcore/src/vespa/searchcore/proton/server/searchable_doc_subdb_configurer.h
+++ b/searchcore/src/vespa/searchcore/proton/server/searchable_doc_subdb_configurer.h
@@ -84,7 +84,8 @@ public:
const DocumentDBConfig &oldConfig,
const ReconfigParams &params,
IDocumentDBReferenceResolver &resolver,
- const DocumentSubDBReconfig& prepared_reconfig);
+ const DocumentSubDBReconfig& prepared_reconfig,
+ search::SerialNum serial_num);
IReprocessingInitializer::UP
reconfigure(const DocumentDBConfig &newConfig,
@@ -92,7 +93,8 @@ public:
AttributeCollectionSpec && attrSpec,
const ReconfigParams &params,
IDocumentDBReferenceResolver &resolver,
- const DocumentSubDBReconfig& prepared_reconfig);
+ const DocumentSubDBReconfig& prepared_reconfig,
+ search::SerialNum serial_num);
};
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp b/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp
index 3f79b02830d..89925e8a77d 100644
--- a/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp
@@ -154,7 +154,7 @@ SearchableDocSubDB::applyConfig(const DocumentDBConfig &newConfigSnapshot, const
std::unique_ptr<AttributeCollectionSpec> attrSpec =
createAttributeSpec(newConfigSnapshot.getAttributesConfig(), alloc_strategy, serialNum);
IReprocessingInitializer::UP initializer =
- _configurer.reconfigure(newConfigSnapshot, oldConfigSnapshot, std::move(*attrSpec), params, resolver, prepared_reconfig);
+ _configurer.reconfigure(newConfigSnapshot, oldConfigSnapshot, std::move(*attrSpec), params, resolver, prepared_reconfig, serialNum);
if (initializer && initializer->hasReprocessors()) {
tasks.emplace_back(createReprocessingTask(*initializer, newConfigSnapshot.getDocumentTypeRepoSP()));
}
@@ -163,7 +163,7 @@ SearchableDocSubDB::applyConfig(const DocumentDBConfig &newConfigSnapshot, const
reconfigureAttributeMetrics(*newMgr, *oldMgr);
}
} else {
- _configurer.reconfigure(newConfigSnapshot, oldConfigSnapshot, params, resolver, prepared_reconfig);
+ _configurer.reconfigure(newConfigSnapshot, oldConfigSnapshot, params, resolver, prepared_reconfig, serialNum);
}
syncViews();
return tasks;
diff --git a/searchcore/src/vespa/searchcore/proton/test/mock_attribute_manager.h b/searchcore/src/vespa/searchcore/proton/test/mock_attribute_manager.h
index 987d60dff01..2261fccd628 100644
--- a/searchcore/src/vespa/searchcore/proton/test/mock_attribute_manager.h
+++ b/searchcore/src/vespa/searchcore/proton/test/mock_attribute_manager.h
@@ -2,6 +2,7 @@
#pragma once
#include <vespa/searchcore/proton/attribute/i_attribute_manager.h>
+#include <vespa/searchcore/proton/attribute/attribute_manager_reconfig.h>
#include <vespa/searchcore/proton/attribute/imported_attributes_repo.h>
#include <vespa/searchlib/test/mock_attribute_manager.h>
#include <vespa/vespalib/util/hdr_abort.h>
@@ -49,6 +50,9 @@ public:
search::attribute::IAttributeContext::UP createContext() const override {
return _mock.createContext();
}
+ std::unique_ptr<AttributeManagerReconfig> prepare_create(AttributeCollectionSpec&&) const override {
+ return {};
+ }
IAttributeManager::SP create(AttributeCollectionSpec &&) const override {
return IAttributeManager::SP();
}