aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2023-02-06 16:18:49 +0100
committerTor Egge <Tor.Egge@online.no>2023-02-06 18:56:51 +0100
commit5337bc72e789586875f4732950841c9720eaff5b (patch)
tree4c9a9a5979e196b053e6162dd315970b5ef3e208
parent1a37850993a673e79182eb62220d063878d48410 (diff)
Reapply make attribute collection spec serial num optional.
Pass reconfig serial num explicitly to various reconfigure member functions since it might not be available from attribute collection spec.
-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();
}