summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-08-21 13:11:17 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-08-21 13:43:52 +0000
commit6036dd3eace7ce564dd446c8307d7c14520ae3a3 (patch)
tree508e056d1a2f704415a4c146d081d0846853605d /searchcore
parentda26039cd02e2eabef4e843d9515cff9797c0e28 (diff)
- Let LidReuseDelayer be owned by FeedView and configured only at construction time.
- No need for ILidReuseDelayer interface. - Update test to reflect that no extra task is dispatched in master thread for reconfiguraion of lid reuse delayer.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp11
-rw-r--r--searchcore/src/tests/proton/documentdb/feedview/feedview_test.cpp25
-rw-r--r--searchcore/src/tests/proton/documentdb/storeonlyfeedview/storeonlyfeedview_test.cpp14
-rw-r--r--searchcore/src/tests/proton/documentmetastore/lidreusedelayer/lidreusedelayer_test.cpp57
-rw-r--r--searchcore/src/vespa/searchcore/proton/documentmetastore/ilidreusedelayer.h39
-rw-r--r--searchcore/src/vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.cpp16
-rw-r--r--searchcore/src/vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.h1
-rw-r--r--searchcore/src/vespa/searchcore/proton/documentmetastore/lidreusedelayer.cpp48
-rw-r--r--searchcore/src/vespa/searchcore/proton/documentmetastore/lidreusedelayer.h27
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/document_subdb_initializer_result.cpp8
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/document_subdb_initializer_result.h11
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.cpp1
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb_configurer.cpp19
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb_configurer.h7
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/searchable_doc_subdb_configurer.cpp19
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/searchable_doc_subdb_configurer.h51
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/searchable_feed_view.cpp1
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp20
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.h6
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.cpp32
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.h7
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp5
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h28
23 files changed, 158 insertions, 295 deletions
diff --git a/searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp b/searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp
index 42dc804523e..7e5006bab38 100644
--- a/searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp
+++ b/searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp
@@ -51,6 +51,7 @@ using Configurer = SearchableDocSubDBConfigurer;
using ConfigurerUP = std::unique_ptr<SearchableDocSubDBConfigurer>;
using SummarySetup = SummaryManager::SummarySetup;
using DocumenttypesConfigSP = proton::DocumentDBConfig::DocumenttypesConfigSP;
+using LidReuseDelayerConfig = documentmetastore::LidReuseDelayerConfig;
const vespalib::string BASE_DIR("baseDir");
const vespalib::string DOC_TYPE("invalid");
@@ -95,7 +96,6 @@ struct ViewSet
ISummaryManager::SP _summaryMgr;
proton::IDocumentMetaStoreContext::SP _dmsc;
std::shared_ptr<IGidToLidChangeHandler> _gidToLidChangeHandler;
- std::unique_ptr<documentmetastore::ILidReuseDelayer> _lidReuseDelayer;
VarHolder<SearchView::SP> searchView;
VarHolder<SearchableFeedView::SP> feedView;
HwInfo _hwInfo;
@@ -124,7 +124,6 @@ ViewSet::ViewSet()
_summaryMgr(),
_dmsc(),
_gidToLidChangeHandler(),
- _lidReuseDelayer(),
searchView(),
feedView(),
_hwInfo()
@@ -203,7 +202,6 @@ Fixture::initViewSet(ViewSet &views)
Schema::SP schema(new Schema());
views._summaryMgr = summaryMgr;
views._dmsc = metaStore;
- views._lidReuseDelayer = std::make_unique<documentmetastore::LidReuseDelayer>(views._writeService, metaStore->get());
IndexSearchable::SP indexSearchable;
auto matchView = std::make_shared<MatchView>(matchers, indexSearchable, attrMgr, sesMgr, metaStore, views._docIdLimit);
views.searchView.set(SearchView::create
@@ -217,7 +215,7 @@ Fixture::initViewSet(ViewSet &views)
*views._gidToLidChangeHandler,
views.repo,
views._writeService,
- *views._lidReuseDelayer),
+ LidReuseDelayerConfig()),
SearchableFeedView::PersistentParams(
views.serialNum,
views.serialNum,
@@ -240,7 +238,6 @@ struct MyFastAccessFeedView
proton::IDocumentMetaStoreContext::SP _dmsc;
std::shared_ptr<IGidToLidChangeHandler> _gidToLidChangeHandler;
- std::unique_ptr<documentmetastore::ILidReuseDelayer> _lidReuseDelayer;
VarHolder<FastAccessFeedView::SP> _feedView;
explicit MyFastAccessFeedView(IThreadingService &writeService)
@@ -250,7 +247,6 @@ struct MyFastAccessFeedView
_hwInfo(),
_dmsc(),
_gidToLidChangeHandler(make_shared<DummyGidToLidChangeHandler>()),
- _lidReuseDelayer(),
_feedView()
{
init();
@@ -262,10 +258,9 @@ struct MyFastAccessFeedView
ISummaryAdapter::SP summaryAdapter(new MySummaryAdapter());
Schema::SP schema(new Schema());
_dmsc = make_shared<DocumentMetaStoreContext>(std::make_shared<BucketDBOwner>());
- _lidReuseDelayer = std::make_unique<documentmetastore::LidReuseDelayer>(_writeService, _dmsc->get());
std::shared_ptr<const DocumentTypeRepo> repo = createRepo();
StoreOnlyFeedView::Context storeOnlyCtx(summaryAdapter, schema, _dmsc, *_gidToLidChangeHandler, repo,
- _writeService, *_lidReuseDelayer);
+ _writeService, LidReuseDelayerConfig());
StoreOnlyFeedView::PersistentParams params(1, 1, DocTypeName(DOC_TYPE), 0, SubDbType::NOTREADY);
auto mgr = make_shared<AttributeManager>(BASE_DIR, "test.subdb", TuneFileAttributes(), _fileHeaderContext,
_writeService.attributeFieldWriter(), _writeService.shared(), _hwInfo);
diff --git a/searchcore/src/tests/proton/documentdb/feedview/feedview_test.cpp b/searchcore/src/tests/proton/documentdb/feedview/feedview_test.cpp
index 9690133d247..315fa1591e4 100644
--- a/searchcore/src/tests/proton/documentdb/feedview/feedview_test.cpp
+++ b/searchcore/src/tests/proton/documentdb/feedview/feedview_test.cpp
@@ -34,6 +34,7 @@ using document::DocumentId;
using document::DocumentUpdate;
using proton::matching::SessionManager;
using proton::test::MockGidToLidChangeHandler;
+using proton::documentmetastore::LidReuseDelayerConfig;
using search::AttributeVector;
using search::CacheStats;
using search::DocumentMetaData;
@@ -519,7 +520,7 @@ struct FixtureBase
vespalib::ThreadStackExecutor _sharedExecutor;
ExecutorThreadingService _writeServiceReal;
test::ThreadingServiceObserver _writeService;
- documentmetastore::LidReuseDelayer _lidReuseDelayer;
+ vespalib::duration _visibilityDelay;
SerialNum serial;
std::shared_ptr<MyGidToLidChangeHandler> _gidToLidChangeHandler;
FixtureBase(vespalib::duration visibilityDelay);
@@ -703,12 +704,11 @@ FixtureBase::FixtureBase(vespalib::duration visibilityDelay)
_sharedExecutor(1, 0x10000),
_writeServiceReal(_sharedExecutor),
_writeService(_writeServiceReal),
- _lidReuseDelayer(_writeService, _dmsc->get()),
+ _visibilityDelay(visibilityDelay),
serial(0),
_gidToLidChangeHandler(std::make_shared<MyGidToLidChangeHandler>())
{
_dmsc->constructFreeList();
- _lidReuseDelayer.setImmediateCommit(visibilityDelay == vespalib::duration::zero());
}
FixtureBase::~FixtureBase() {
@@ -733,12 +733,11 @@ struct SearchableFeedViewFixture : public FixtureBase
*_gidToLidChangeHandler,
sc.getRepo(),
_writeService,
- _lidReuseDelayer),
+ LidReuseDelayerConfig(_visibilityDelay, true)),
pc.getParams(),
FastAccessFeedView::Context(aw, _docIdLimit),
SearchableFeedView::Context(iw))
{
- runInMaster([&]() { _lidReuseDelayer.setHasIndexedOrAttributeFields(true); });
}
virtual IFeedView &getFeedView() override { return fv; }
};
@@ -754,7 +753,7 @@ struct FastAccessFeedViewFixture : public FixtureBase
*_gidToLidChangeHandler,
sc.getRepo(),
_writeService,
- _lidReuseDelayer),
+ LidReuseDelayerConfig(_visibilityDelay, false)),
pc.getParams(),
FastAccessFeedView::Context(aw, _docIdLimit))
{
@@ -915,14 +914,14 @@ assertThreadObserver(uint32_t masterExecuteCnt,
TEST_F("require that remove() calls removeComplete() via delayed thread service",
SearchableFeedViewFixture)
{
- EXPECT_TRUE(assertThreadObserver(1, 0, 0, f.writeServiceObserver()));
+ EXPECT_TRUE(assertThreadObserver(0, 0, 0, f.writeServiceObserver()));
f.putAndWait(f.doc1(10));
// put index fields handled in index thread
- EXPECT_TRUE(assertThreadObserver(2, 1, 1, f.writeServiceObserver()));
+ EXPECT_TRUE(assertThreadObserver(1, 1, 1, f.writeServiceObserver()));
f.removeAndWait(f.doc1(20));
// remove index fields handled in index thread
// delayed remove complete handled in same index thread, then master thread
- EXPECT_TRUE(assertThreadObserver(4, 2, 2, f.writeServiceObserver()));
+ EXPECT_TRUE(assertThreadObserver(3, 2, 2, f.writeServiceObserver()));
EXPECT_EQUAL(1u, f.metaStoreObserver()._removeCompleteCnt);
EXPECT_EQUAL(1u, f.metaStoreObserver()._removeCompleteLid);
}
@@ -1137,11 +1136,11 @@ TEST_F("require that compactLidSpace() propagates to document meta store and doc
SearchableFeedViewFixture)
{
f.populateBeforeCompactLidSpace();
- EXPECT_TRUE(assertThreadObserver(5, 3, 3, f.writeServiceObserver()));
+ EXPECT_TRUE(assertThreadObserver(4, 3, 3, f.writeServiceObserver()));
f.compactLidSpaceAndWait(2);
// performIndexForceCommit in index thread, then completion callback
// in master thread.
- EXPECT_TRUE(assertThreadObserver(7, 5, 4, f.writeServiceObserver()));
+ EXPECT_TRUE(assertThreadObserver(6, 5, 4, f.writeServiceObserver()));
EXPECT_EQUAL(2u, f.metaStoreObserver()._compactLidSpaceLidLimit);
EXPECT_EQUAL(2u, f.getDocumentStore()._compactLidSpaceLidLimit);
EXPECT_EQUAL(1u, f.metaStoreObserver()._holdUnblockShrinkLidSpaceCnt);
@@ -1154,12 +1153,12 @@ TEST_F("require that compactLidSpace() doesn't propagate to "
SearchableFeedViewFixture)
{
f.populateBeforeCompactLidSpace();
- EXPECT_TRUE(assertThreadObserver(5, 3, 3, f.writeServiceObserver()));
+ EXPECT_TRUE(assertThreadObserver(4, 3, 3, f.writeServiceObserver()));
CompactLidSpaceOperation op(0, 2);
op.setSerialNum(0);
f.runInMaster([&] () { f.fv.handleCompactLidSpace(op); });
// Delayed holdUnblockShrinkLidSpace() in index thread, then master thread
- EXPECT_TRUE(assertThreadObserver(6, 4, 3, f.writeServiceObserver()));
+ EXPECT_TRUE(assertThreadObserver(5, 4, 3, f.writeServiceObserver()));
EXPECT_EQUAL(0u, f.metaStoreObserver()._compactLidSpaceLidLimit);
EXPECT_EQUAL(0u, f.getDocumentStore()._compactLidSpaceLidLimit);
EXPECT_EQUAL(0u, f.metaStoreObserver()._holdUnblockShrinkLidSpaceCnt);
diff --git a/searchcore/src/tests/proton/documentdb/storeonlyfeedview/storeonlyfeedview_test.cpp b/searchcore/src/tests/proton/documentdb/storeonlyfeedview/storeonlyfeedview_test.cpp
index eae7425148c..56a19b2d7eb 100644
--- a/searchcore/src/tests/proton/documentdb/storeonlyfeedview/storeonlyfeedview_test.cpp
+++ b/searchcore/src/tests/proton/documentdb/storeonlyfeedview/storeonlyfeedview_test.cpp
@@ -86,7 +86,7 @@ struct MyMinimalFeedView : public MyMinimalFeedViewBase, public StoreOnlyFeedVie
MyMinimalFeedView(const ISummaryAdapter::SP &summaryAdapter,
const DocumentMetaStore::SP &metaStore,
searchcorespi::index::IThreadingService &writeService,
- documentmetastore::ILidReuseDelayer &lidReuseDelayer,
+ documentmetastore::LidReuseDelayerConfig &lidReuseDelayerConfig,
const PersistentParams &params,
int &outstandingMoveOps_) :
MyMinimalFeedViewBase(),
@@ -96,7 +96,7 @@ struct MyMinimalFeedView : public MyMinimalFeedViewBase, public StoreOnlyFeedVie
*gidToLidChangeHandler,
myGetDocumentTypeRepo(),
writeService,
- lidReuseDelayer),
+ lidReuseDelayerConfig),
params),
removeMultiAttributesCount(0),
removeMultiIndexFieldsCount(0),
@@ -134,10 +134,10 @@ struct MoveOperationFeedView : public MyMinimalFeedView {
MoveOperationFeedView(const ISummaryAdapter::SP &summaryAdapter,
const DocumentMetaStore::SP &metaStore,
searchcorespi::index::IThreadingService &writeService,
- documentmetastore::ILidReuseDelayer &lidReuseDelayer,
+ documentmetastore::LidReuseDelayerConfig &lidReuseDelayerConfig,
const PersistentParams &params,
int &outstandingMoveOps_) :
- MyMinimalFeedView(summaryAdapter, metaStore, writeService, lidReuseDelayer,
+ MyMinimalFeedView(summaryAdapter, metaStore, writeService, lidReuseDelayerConfig,
params, outstandingMoveOps_),
putAttributesCount(0),
putIndexFieldsCount(0),
@@ -191,7 +191,7 @@ struct FixtureBase {
DocumentMetaStore::SP metaStore;
vespalib::ThreadStackExecutor sharedExecutor;
ExecutorThreadingService writeService;
- documentmetastore::LidReuseDelayer lidReuseDelayer;
+ documentmetastore::LidReuseDelayerConfig lidReuseDelayerConfig;
typename FeedViewType::UP feedview;
FixtureBase(SubDbType subDbType = SubDbType::READY)
@@ -206,13 +206,13 @@ struct FixtureBase {
subDbType)),
sharedExecutor(1, 0x10000),
writeService(sharedExecutor),
- lidReuseDelayer(writeService, *metaStore),
+ lidReuseDelayerConfig(),
feedview()
{
StoreOnlyFeedView::PersistentParams params(0, 0, DocTypeName("foo"), subdb_id, subDbType);
metaStore->constructFreeList();
ISummaryAdapter::SP adapter = std::make_unique<MySummaryAdapter>(removeCount, putCount, heartbeatCount);
- feedview = std::make_unique<FeedViewType>(adapter, metaStore, writeService, lidReuseDelayer,
+ feedview = std::make_unique<FeedViewType>(adapter, metaStore, writeService, lidReuseDelayerConfig,
params, outstandingMoveOps);
}
diff --git a/searchcore/src/tests/proton/documentmetastore/lidreusedelayer/lidreusedelayer_test.cpp b/searchcore/src/tests/proton/documentmetastore/lidreusedelayer/lidreusedelayer_test.cpp
index 25668f56753..f86829c5b13 100644
--- a/searchcore/src/tests/proton/documentmetastore/lidreusedelayer/lidreusedelayer_test.cpp
+++ b/searchcore/src/tests/proton/documentmetastore/lidreusedelayer/lidreusedelayer_test.cpp
@@ -108,7 +108,7 @@ public:
bool
assertWork(uint32_t expRemoveCompleteCount,
uint32_t expRemoveBatchCompleteCount,
- uint32_t expRemoveCompleteLids)
+ uint32_t expRemoveCompleteLids) const
{
if (!EXPECT_EQUAL(expRemoveCompleteCount, _removeCompleteCount)) {
return false;
@@ -127,18 +127,20 @@ public:
class Fixture
{
public:
+ using LidReuseDelayer = documentmetastore::LidReuseDelayer;
+ using LidReuseDelayerConfig = documentmetastore::LidReuseDelayerConfig;
vespalib::ThreadStackExecutor _sharedExecutor;
ExecutorThreadingService _writeServiceReal;
test::ThreadingServiceObserver _writeService;
MyMetaStore _store;
- documentmetastore::LidReuseDelayer _lidReuseDelayer;
+ std::unique_ptr<LidReuseDelayer> _lidReuseDelayer;
Fixture()
: _sharedExecutor(1, 0x10000),
_writeServiceReal(_sharedExecutor),
_writeService(_writeServiceReal),
_store(),
- _lidReuseDelayer(_writeService, _store)
+ _lidReuseDelayer(std::make_unique<LidReuseDelayer>(_writeService, _store, LidReuseDelayerConfig()))
{
}
@@ -177,7 +179,7 @@ public:
delayReuse(uint32_t lid)
{
bool res = false;
- runInMaster([&] () { res = _lidReuseDelayer.delayReuse(lid); } );
+ runInMaster([&] () { res = _lidReuseDelayer->delayReuse(lid); } );
return res;
}
@@ -185,22 +187,21 @@ public:
delayReuse(const std::vector<uint32_t> &lids)
{
bool res = false;
- runInMaster([&] () { res = _lidReuseDelayer.delayReuse(lids); });
+ runInMaster([&] () { res = _lidReuseDelayer->delayReuse(lids); });
return res;
}
- void setImmediateCommit(bool immediateCommit) {
- runInMaster([&] () { _lidReuseDelayer.
- setImmediateCommit(immediateCommit); } );
- }
-
- void setHasIndexedOrAttributeFields(bool hasIndexedOrAttributeFields) {
- runInMaster([&] () { _lidReuseDelayer.
- setHasIndexedOrAttributeFields(hasIndexedOrAttributeFields); } );
+ void
+ configureLidReuseDelayer(bool immediateCommit, bool hasIndexedOrAttributeFields) {
+ runInMaster([&] () {
+ _lidReuseDelayer = std::make_unique<LidReuseDelayer>(_writeService, _store,
+ LidReuseDelayerConfig(immediateCommit ? vespalib::duration::zero() : 1ms,
+ hasIndexedOrAttributeFields));
+ } );
}
void commit() {
- runInMaster([&] () { cycleLids(_lidReuseDelayer.getReuseLids()); });
+ runInMaster([&] () { cycleLids(_lidReuseDelayer->getReuseLids()); });
}
void
@@ -225,7 +226,7 @@ public:
TEST_F("require that nothing happens before free list is active", Fixture)
{
- f.setHasIndexedOrAttributeFields(true);
+ f.configureLidReuseDelayer(true, true);
EXPECT_FALSE(f.delayReuse(4));
EXPECT_FALSE(f.delayReuse({ 5, 6}));
EXPECT_TRUE(f._store.assertWork(0, 0, 0));
@@ -236,7 +237,7 @@ TEST_F("require that nothing happens before free list is active", Fixture)
TEST_F("require that single lid is delayed", Fixture)
{
f._store._freeListActive = true;
- f.setHasIndexedOrAttributeFields(true);
+ f.configureLidReuseDelayer(true, true);
EXPECT_TRUE(f.delayReuse(4));
f.scheduleDelayReuseLid(4);
EXPECT_TRUE(f._store.assertWork(1, 0, 1));
@@ -247,7 +248,7 @@ TEST_F("require that single lid is delayed", Fixture)
TEST_F("require that lid vector is delayed", Fixture)
{
f._store._freeListActive = true;
- f.setHasIndexedOrAttributeFields(true);
+ f.configureLidReuseDelayer(true, true);
EXPECT_TRUE(f.delayReuse({ 5, 6, 7}));
f.scheduleDelayReuseLids({ 5, 6, 7});
EXPECT_TRUE(f._store.assertWork(0, 1, 3));
@@ -258,45 +259,43 @@ TEST_F("require that lid vector is delayed", Fixture)
TEST_F("require that reuse can be batched", Fixture)
{
f._store._freeListActive = true;
- f.setHasIndexedOrAttributeFields(true);
- f.setImmediateCommit(false);
+ f.configureLidReuseDelayer(false, true);
EXPECT_FALSE(f.delayReuse(4));
EXPECT_FALSE(f.delayReuse({ 5, 6, 7}));
EXPECT_TRUE(f._store.assertWork(0, 0, 0));
- EXPECT_TRUE(assertThreadObserver(4, 0, 0, f._writeService));
+ EXPECT_TRUE(assertThreadObserver(3, 0, 0, f._writeService));
f.commit();
EXPECT_TRUE(f._store.assertWork(0, 1, 4));
- EXPECT_TRUE(assertThreadObserver(6, 1, 0, f._writeService));
+ EXPECT_TRUE(assertThreadObserver(5, 1, 0, f._writeService));
EXPECT_FALSE(f.delayReuse(8));
EXPECT_FALSE(f.delayReuse({ 9, 10}));
EXPECT_TRUE(f._store.assertWork(0, 1, 4));
- EXPECT_TRUE(assertThreadObserver(8, 1, 0, f._writeService));
+ EXPECT_TRUE(assertThreadObserver(7, 1, 0, f._writeService));
}
TEST_F("require that single element array is optimized", Fixture)
{
f._store._freeListActive = true;
- f.setHasIndexedOrAttributeFields(true);
- f.setImmediateCommit(false);
+ f.configureLidReuseDelayer(false, true);
EXPECT_FALSE(f.delayReuse({ 4}));
EXPECT_TRUE(f._store.assertWork(0, 0, 0));
- EXPECT_TRUE(assertThreadObserver(3, 0, 0, f._writeService));
+ EXPECT_TRUE(assertThreadObserver(2, 0, 0, f._writeService));
f.commit();
- f.setImmediateCommit(true);
+ f.configureLidReuseDelayer(true, true);
EXPECT_TRUE(f._store.assertWork(1, 0, 1));
- EXPECT_TRUE(assertThreadObserver(6, 1, 0, f._writeService));
+ EXPECT_TRUE(assertThreadObserver(5, 1, 0, f._writeService));
EXPECT_TRUE(f.delayReuse({ 8}));
f.scheduleDelayReuseLids({ 8});
EXPECT_TRUE(f._store.assertWork(2, 0, 2));
- EXPECT_TRUE(assertThreadObserver(9, 2, 0, f._writeService));
+ EXPECT_TRUE(assertThreadObserver(8, 2, 0, f._writeService));
}
TEST_F("require that lids are reused faster with no indexed fields", Fixture)
{
f._store._freeListActive = true;
- f.setHasIndexedOrAttributeFields(false);
+ f.configureLidReuseDelayer(true, false);
EXPECT_FALSE(f.delayReuse(4));
EXPECT_TRUE(f._store.assertWork(1, 0, 1));
EXPECT_TRUE(assertThreadObserver(2, 0, 0, f._writeService));
diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/ilidreusedelayer.h b/searchcore/src/vespa/searchcore/proton/documentmetastore/ilidreusedelayer.h
deleted file mode 100644
index a01e2bd0642..00000000000
--- a/searchcore/src/vespa/searchcore/proton/documentmetastore/ilidreusedelayer.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-
-#pragma once
-
-#include <cstdint>
-#include <vector>
-namespace proton::documentmetastore {
-
-/**
- * Interface used to delay reuse of lids until references to the lids have
- * been purged from the data structures in memory index and attribute vectors.
- */
-class ILidReuseDelayer
-{
-public:
- virtual ~ILidReuseDelayer() { }
- /**
- * Delay reuse of a single lid.
- *
- * @param lid The lid for which to delay reuse
- *
- * @return bool True if caller must handle lid reuse explicitly
- */
- virtual bool delayReuse(uint32_t lid) = 0;
- /**
- * Delay reuse of multiple lids.
- *
- * @param lids The lids for which to delay reuse
- *
- * @return bool True if caller must handle lid reuse explicitly
- */
- virtual bool delayReuse(const std::vector<uint32_t> &lids) = 0;
- virtual void setImmediateCommit(bool immediateCommit) = 0;
- virtual bool getImmediateCommit() const = 0;
- virtual void setHasIndexedOrAttributeFields(bool hasIndexedFields) = 0;
- virtual std::vector<uint32_t> getReuseLids() = 0;
-};
-
-}
diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.cpp b/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.cpp
index 0cdb97271b1..b04bac5ef26 100644
--- a/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.cpp
+++ b/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.cpp
@@ -5,12 +5,6 @@
namespace proton::documentmetastore {
-LidReuseDelayerConfig::LidReuseDelayerConfig()
- : _visibilityDelay(vespalib::duration::zero()),
- _hasIndexedOrAttributeFields(false)
-{
-}
-
LidReuseDelayerConfig::LidReuseDelayerConfig(const DocumentDBConfig & configSnapshot)
: _visibilityDelay(configSnapshot.getMaintenanceConfigSP()->getVisibilityDelay()),
_hasIndexedOrAttributeFields(configSnapshot.getSchemaSP()->getNumIndexFields() > 0 ||
@@ -18,4 +12,14 @@ LidReuseDelayerConfig::LidReuseDelayerConfig(const DocumentDBConfig & configSnap
{
}
+LidReuseDelayerConfig::LidReuseDelayerConfig()
+ : LidReuseDelayerConfig(vespalib::duration::zero(), false)
+{}
+
+LidReuseDelayerConfig::LidReuseDelayerConfig(vespalib::duration visibilityDelay, bool hasIndexedOrAttributeFields_in)
+ : _visibilityDelay(visibilityDelay),
+ _hasIndexedOrAttributeFields(hasIndexedOrAttributeFields_in)
+{
+}
+
}
diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.h b/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.h
index 867eccb6b20..82dab433a22 100644
--- a/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.h
+++ b/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.h
@@ -18,6 +18,7 @@ private:
bool _hasIndexedOrAttributeFields;
public:
LidReuseDelayerConfig();
+ LidReuseDelayerConfig(vespalib::duration visibilityDelay, bool _hasIndexedOrAttributeFields_in);
explicit LidReuseDelayerConfig(const DocumentDBConfig &configSnapshot);
vespalib::duration visibilityDelay() const { return _visibilityDelay; }
bool hasIndexedOrAttributeFields() const { return _hasIndexedOrAttributeFields; }
diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/lidreusedelayer.cpp b/searchcore/src/vespa/searchcore/proton/documentmetastore/lidreusedelayer.cpp
index bf1ea25b589..b74078691f9 100644
--- a/searchcore/src/vespa/searchcore/proton/documentmetastore/lidreusedelayer.cpp
+++ b/searchcore/src/vespa/searchcore/proton/documentmetastore/lidreusedelayer.cpp
@@ -11,79 +11,52 @@ using searchcorespi::index::IThreadingService;
using vespalib::makeClosure;
using vespalib::makeTask;
-LidReuseDelayer::LidReuseDelayer(IThreadingService &writeService,
- IStore &documentMetaStore)
+LidReuseDelayer::LidReuseDelayer(IThreadingService &writeService, IStore &documentMetaStore,
+ const LidReuseDelayerConfig & config)
: _writeService(writeService),
_documentMetaStore(documentMetaStore),
- _immediateCommit(true),
- _hasIndexedOrAttributeFields(false),
+ _immediateCommit(config.visibilityDelay() == vespalib::duration::zero()),
+ _config(config),
_pendingLids()
{
}
-
LidReuseDelayer::~LidReuseDelayer() = default;
-
bool
LidReuseDelayer::delayReuse(uint32_t lid)
{
assert(_writeService.master().isCurrentThread());
- if (!_documentMetaStore.getFreeListActive())
+ if ( ! _documentMetaStore.getFreeListActive())
return false;
- if (!_immediateCommit) {
+ if ( ! _immediateCommit) {
_pendingLids.push_back(lid);
return false;
}
- if (!_hasIndexedOrAttributeFields) {
+ if ( ! _config.hasIndexedOrAttributeFields() ) {
_documentMetaStore.removeComplete(lid);
return false;
}
return true;
}
-
bool
LidReuseDelayer::delayReuse(const std::vector<uint32_t> &lids)
{
assert(_writeService.master().isCurrentThread());
- if (!_documentMetaStore.getFreeListActive() || lids.empty())
+ if ( ! _documentMetaStore.getFreeListActive() || lids.empty())
return false;
- if (!_immediateCommit) {
+ if ( ! _immediateCommit) {
_pendingLids.insert(_pendingLids.end(), lids.cbegin(), lids.cend());
return false;
}
- if (!_hasIndexedOrAttributeFields) {
+ if ( ! _config.hasIndexedOrAttributeFields()) {
_documentMetaStore.removeBatchComplete(lids);
return false;
}
return true;
}
-
-void
-LidReuseDelayer::setImmediateCommit(bool immediateCommit)
-{
- assert(_pendingLids.empty());
- _immediateCommit = immediateCommit;
-}
-
-
-bool
-LidReuseDelayer::getImmediateCommit() const
-{
- return _immediateCommit;
-}
-
-
-void
-LidReuseDelayer::setHasIndexedOrAttributeFields(bool hasIndexedOrAttributeFields)
-{
- assert(_pendingLids.empty());
- _hasIndexedOrAttributeFields = hasIndexedOrAttributeFields;
-}
-
-
std::vector<uint32_t>
LidReuseDelayer::getReuseLids()
{
@@ -94,6 +67,5 @@ LidReuseDelayer::getReuseLids()
return result;
}
-
}
diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/lidreusedelayer.h b/searchcore/src/vespa/searchcore/proton/documentmetastore/lidreusedelayer.h
index df142890207..5f1de878b4a 100644
--- a/searchcore/src/vespa/searchcore/proton/documentmetastore/lidreusedelayer.h
+++ b/searchcore/src/vespa/searchcore/proton/documentmetastore/lidreusedelayer.h
@@ -2,7 +2,8 @@
#pragma once
-#include "ilidreusedelayer.h"
+#include "lid_reuse_delayer_config.h"
+#include <vector>
namespace searchcorespi::index { struct IThreadingService; }
@@ -21,24 +22,24 @@ struct IStore;
*
* Currently only works correctly when visibility delay is 0.
*/
-class LidReuseDelayer : public ILidReuseDelayer
+class LidReuseDelayer
{
searchcorespi::index::IThreadingService &_writeService;
IStore &_documentMetaStore;
- bool _immediateCommit;
- bool _hasIndexedOrAttributeFields;
+ const bool _immediateCommit;
+ LidReuseDelayerConfig _config;
std::vector<uint32_t> _pendingLids; // lids waiting for commit
public:
- LidReuseDelayer(searchcorespi::index::IThreadingService &writeService,
- IStore &documentMetaStore);
- ~LidReuseDelayer() override;
- bool delayReuse(uint32_t lid) override;
- bool delayReuse(const std::vector<uint32_t> &lids) override;
- void setImmediateCommit(bool immediateCommit) override;
- bool getImmediateCommit() const override;
- void setHasIndexedOrAttributeFields(bool hasIndexedOrAttributeFields) override;
- std::vector<uint32_t> getReuseLids() override;
+ LidReuseDelayer(searchcorespi::index::IThreadingService &writeService, IStore &documentMetaStore,
+ const LidReuseDelayerConfig & config);
+ ~LidReuseDelayer();
+ bool delayReuse(uint32_t lid);
+ bool delayReuse(const std::vector<uint32_t> &lids);
+ std::vector<uint32_t> getReuseLids();
+
+ bool getImmediateCommit() const { return _immediateCommit; }
+ const LidReuseDelayerConfig & getConfig() const { return _config; }
};
}
diff --git a/searchcore/src/vespa/searchcore/proton/server/document_subdb_initializer_result.cpp b/searchcore/src/vespa/searchcore/proton/server/document_subdb_initializer_result.cpp
index 5693e56ccf2..3374d835847 100644
--- a/searchcore/src/vespa/searchcore/proton/server/document_subdb_initializer_result.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/document_subdb_initializer_result.cpp
@@ -12,20 +12,12 @@ DocumentSubDbInitializerResult::DocumentSubDbInitializerResult()
_summaryManager(std::make_shared<SummaryManager::SP>()),
_attributeManager(std::make_shared<AttributeManager::SP>()),
_indexManager(std::make_shared<IIndexManager::SP>()),
- _lidReuseDelayerConfig(),
_flushConfig()
{
}
void
DocumentSubDbInitializerResult::
-setLidReuseDelayerConfig(LidReuseDelayerConfig lidReuseDelayerConfig_in)
-{
- _lidReuseDelayerConfig = lidReuseDelayerConfig_in;
-}
-
-void
-DocumentSubDbInitializerResult::
setFlushConfig(const DocumentDBFlushConfig &flushConfig)
{
_flushConfig = flushConfig;
diff --git a/searchcore/src/vespa/searchcore/proton/server/document_subdb_initializer_result.h b/searchcore/src/vespa/searchcore/proton/server/document_subdb_initializer_result.h
index da628c1ab5d..c41d133eb5f 100644
--- a/searchcore/src/vespa/searchcore/proton/server/document_subdb_initializer_result.h
+++ b/searchcore/src/vespa/searchcore/proton/server/document_subdb_initializer_result.h
@@ -2,12 +2,11 @@
#pragma once
+#include "document_db_flush_config.h"
#include <vespa/searchcore/proton/attribute/attributemanager.h>
#include <vespa/searchcore/proton/docsummary/summarymanager.h>
#include <vespa/searchcore/proton/documentmetastore/document_meta_store_initializer_result.h>
#include <vespa/searchcorespi/index/iindexmanager.h>
-#include <vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.h>
-#include "document_db_flush_config.h"
namespace proton {
@@ -23,8 +22,6 @@ private:
std::shared_ptr<SummaryManager::SP> _summaryManager;
std::shared_ptr<AttributeManager::SP> _attributeManager;
std::shared_ptr<searchcorespi::IIndexManager::SP> _indexManager;
- using LidReuseDelayerConfig = documentmetastore::LidReuseDelayerConfig;
- LidReuseDelayerConfig _lidReuseDelayerConfig;
DocumentDBFlushConfig _flushConfig;
public:
@@ -53,11 +50,7 @@ public:
searchcorespi::IIndexManager::SP indexManager() const {
return *_indexManager;
}
- void setLidReuseDelayerConfig(LidReuseDelayerConfig
- lidReuseDelayerConfig_in);
- const LidReuseDelayerConfig &lidReuseDelayerConfig() const {
- return _lidReuseDelayerConfig;
- }
+
void setFlushConfig(const DocumentDBFlushConfig &flushConfig);
const DocumentDBFlushConfig &getFlushConfig() const { return _flushConfig; }
};
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 a3f4ef2e05e..c7ceade5a57 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
@@ -248,7 +248,6 @@ FastAccessDocSubDB::applyConfig(const DocumentDBConfig &newConfigSnapshot, const
reconfigure(newConfigSnapshot.getStoreConfig());
IReprocessingTask::List tasks;
- updateLidReuseDelayer(&newConfigSnapshot);
/*
* If attribute manager should change then document retriever
* might have to rewrite a different set of fields. If document
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 10c9565f0fe..e0d9f28252f 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
@@ -18,17 +18,18 @@ void
FastAccessDocSubDBConfigurer::reconfigureFeedView(const FastAccessFeedView::SP &curr,
const Schema::SP &schema,
const std::shared_ptr<const DocumentTypeRepo> &repo,
- IAttributeWriter::SP writer)
+ IAttributeWriter::SP writer,
+ const LidReuseDelayerConfig & lidReuseDelayerConfig)
{
_feedView.set(std::make_shared<FastAccessFeedView>(
StoreOnlyFeedView::Context(curr->getSummaryAdapter(),
- schema,
- curr->getDocumentMetaStore(),
- curr->getGidToLidChangeHandler(),
- repo,
- curr->getWriteService(),
- curr->getLidReuseDelayer()),
- curr->getPersistentParams(),
+ schema,
+ curr->getDocumentMetaStore(),
+ curr->getGidToLidChangeHandler(),
+ repo,
+ curr->getWriteService(),
+ lidReuseDelayerConfig),
+ curr->getPersistentParams(),
FastAccessFeedView::Context(std::move(writer),curr->getDocIdLimit())));
}
@@ -50,7 +51,7 @@ FastAccessDocSubDBConfigurer::reconfigure(const DocumentDBConfig &newConfig,
{
FastAccessFeedView::SP oldView = _feedView.get();
IAttributeWriter::SP writer = _factory->create(oldView->getAttributeWriter(), attrSpec);
- reconfigureFeedView(oldView, newConfig.getSchemaSP(), newConfig.getDocumentTypeRepoSP(), writer);
+ reconfigureFeedView(oldView, newConfig.getSchemaSP(), newConfig.getDocumentTypeRepoSP(), writer, LidReuseDelayerConfig(newConfig));
const document::DocumentType *newDocType = newConfig.getDocumentType();
const document::DocumentType *oldDocType = oldConfig.getDocumentType();
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 132f6e61d3a..2c07d904339 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
@@ -5,6 +5,7 @@
#include "fast_access_feed_view.h"
#include "i_attribute_writer_factory.h"
#include <vespa/searchcore/proton/reprocessing/i_reprocessing_initializer.h>
+#include <vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.h>
namespace proton {
@@ -15,7 +16,8 @@ namespace proton {
class FastAccessDocSubDBConfigurer
{
public:
- typedef vespalib::VarHolder<FastAccessFeedView::SP> FeedViewVarHolder;
+ using FeedViewVarHolder = vespalib::VarHolder<FastAccessFeedView::SP>;
+ using LidReuseDelayerConfig = documentmetastore::LidReuseDelayerConfig;
private:
FeedViewVarHolder &_feedView;
@@ -25,7 +27,8 @@ private:
void reconfigureFeedView(const FastAccessFeedView::SP &curr,
const search::index::Schema::SP &schema,
const std::shared_ptr<const document::DocumentTypeRepo> &repo,
- IAttributeWriter::SP attrWriter);
+ IAttributeWriter::SP attrWriter,
+ const LidReuseDelayerConfig & lidReuseDelayerConfig);
public:
FastAccessDocSubDBConfigurer(FeedViewVarHolder &feedView,
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 71b76c64ad5..713256fd809 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
@@ -33,7 +33,8 @@ SearchableDocSubDBConfigurer::reconfigureFeedView(const SearchView::SP &searchVi
curr->getAttributeWriter(),
curr->getSchema(),
curr->getDocumentTypeRepo(),
- searchView);
+ searchView,
+ curr->getLidReuseDelayerConfig());
}
void
@@ -42,7 +43,8 @@ SearchableDocSubDBConfigurer::reconfigureFeedView(const IIndexWriter::SP &indexW
IAttributeWriter::SP attrWriter,
const Schema::SP &schema,
const std::shared_ptr<const DocumentTypeRepo> &repo,
- const SearchView::SP &searchView)
+ const SearchView::SP &searchView,
+ const LidReuseDelayerConfig & lidReuseDelayerConfig)
{
SearchableFeedView::SP curr = _feedView.get();
_feedView.set(std::make_shared<SearchableFeedView>(
@@ -52,7 +54,7 @@ SearchableDocSubDBConfigurer::reconfigureFeedView(const IIndexWriter::SP &indexW
curr->getGidToLidChangeHandler(),
repo,
curr->getWriteService(),
- curr->getLidReuseDelayer()),
+ lidReuseDelayerConfig),
curr->getPersistentParams(),
FastAccessFeedView::Context(std::move(attrWriter), curr->getDocIdLimit()),
SearchableFeedView::Context(indexWriter)));
@@ -127,8 +129,7 @@ SearchableDocSubDBConfigurer::createMatchers(const Schema::SP &schema,
vespalib::string name = profile.name;
search::fef::Properties properties;
for (const auto &property : profile.fef.property) {
- properties.add(property.name,
- property.value);
+ properties.add(property.name, property.value);
}
// schema instance only used during call.
auto profptr = std::make_shared<Matcher>(*schema, properties, _clock, _queryLimiter, _constantValueRepo, _distributionKey);
@@ -199,10 +200,7 @@ SearchableDocSubDBConfigurer::reconfigure(const DocumentDBConfig &newConfig,
Matchers::SP matchers = searchView->getMatchers();
if (params.shouldMatchersChange()) {
_constantValueRepo.reconfigure(newConfig.getRankingConstants());
- Matchers::SP newMatchers(
- createMatchers(newConfig.getSchemaSP(),
- newConfig.getRankProfilesConfig()).
- release());
+ Matchers::SP newMatchers = createMatchers(newConfig.getSchemaSP(),newConfig.getRankProfilesConfig());
matchers = newMatchers;
shouldMatchViewChange = true;
}
@@ -261,7 +259,8 @@ SearchableDocSubDBConfigurer::reconfigure(const DocumentDBConfig &newConfig,
std::move(attrWriter),
newConfig.getSchemaSP(),
newConfig.getDocumentTypeRepoSP(),
- searchView);
+ searchView,
+ LidReuseDelayerConfig(newConfig));
}
return initializer;
}
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 806588e9f70..6b836544735 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
@@ -36,6 +36,7 @@ class SearchableDocSubDBConfigurer
private:
typedef vespalib::VarHolder<SearchView::SP> SearchViewHolder;
typedef vespalib::VarHolder<SearchableFeedView::SP> FeedViewHolder;
+ using LidReuseDelayerConfig = documentmetastore::LidReuseDelayerConfig;
const ISummaryManager::SP &_summaryMgr;
SearchViewHolder &_searchView;
FeedViewHolder &_feedView;
@@ -45,30 +46,25 @@ private:
vespalib::string _subDbName;
uint32_t _distributionKey;
- void
- reconfigureFeedView(const SearchView::SP &searchView);
+ void reconfigureFeedView(const SearchView::SP &searchView);
- void
- reconfigureFeedView(const IIndexWriter::SP &indexWriter,
- const ISummaryAdapter::SP &summaryAdapter,
- IAttributeWriter::SP attrWriter,
- const search::index::Schema::SP &schema,
- const std::shared_ptr<const document::DocumentTypeRepo> &repo,
- const SearchView::SP &searchView);
+ void reconfigureFeedView(const IIndexWriter::SP &indexWriter,
+ const ISummaryAdapter::SP &summaryAdapter,
+ IAttributeWriter::SP attrWriter,
+ const search::index::Schema::SP &schema,
+ const std::shared_ptr<const document::DocumentTypeRepo> &repo,
+ const SearchView::SP &searchView,
+ const LidReuseDelayerConfig & lidReuseDelayerConfig);
- void
- reconfigureMatchView(const searchcorespi::IndexSearchable::SP &indexSearchable);
+ void reconfigureMatchView(const searchcorespi::IndexSearchable::SP &indexSearchable);
- void
- reconfigureMatchView(const Matchers::SP &matchers,
- const searchcorespi::IndexSearchable::SP &indexSearchable,
- const IAttributeManager::SP &attrMgr);
+ void reconfigureMatchView(const Matchers::SP &matchers,
+ const searchcorespi::IndexSearchable::SP &indexSearchable,
+ const IAttributeManager::SP &attrMgr);
- void
- reconfigureSearchView(MatchView::SP matchView);
+ void reconfigureSearchView(MatchView::SP matchView);
- void
- reconfigureSearchView(ISummaryManager::ISummarySetup::SP summarySetup, MatchView::SP matchView);
+ void reconfigureSearchView(ISummaryManager::ISummarySetup::SP summarySetup, MatchView::SP matchView);
public:
SearchableDocSubDBConfigurer(const SearchableDocSubDBConfigurer &) = delete;
@@ -83,18 +79,15 @@ public:
uint32_t distributionKey);
~SearchableDocSubDBConfigurer();
- Matchers::UP
- createMatchers(const search::index::Schema::SP &schema,
- const vespa::config::search::RankProfilesConfig &cfg);
+ Matchers::UP createMatchers(const search::index::Schema::SP &schema,
+ const vespa::config::search::RankProfilesConfig &cfg);
- void
- reconfigureIndexSearchable();
+ void reconfigureIndexSearchable();
- void
- reconfigure(const DocumentDBConfig &newConfig,
- const DocumentDBConfig &oldConfig,
- const ReconfigParams &params,
- IDocumentDBReferenceResolver &resolver);
+ void reconfigure(const DocumentDBConfig &newConfig,
+ const DocumentDBConfig &oldConfig,
+ const ReconfigParams &params,
+ IDocumentDBReferenceResolver &resolver);
IReprocessingInitializer::UP
reconfigure(const DocumentDBConfig &newConfig,
diff --git a/searchcore/src/vespa/searchcore/proton/server/searchable_feed_view.cpp b/searchcore/src/vespa/searchcore/proton/server/searchable_feed_view.cpp
index 479d5230379..aaa76bf44ea 100644
--- a/searchcore/src/vespa/searchcore/proton/server/searchable_feed_view.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/searchable_feed_view.cpp
@@ -4,7 +4,6 @@
#include "forcecommitcontext.h"
#include "operationdonecontext.h"
#include "removedonecontext.h"
-#include <vespa/searchcore/proton/documentmetastore/ilidreusedelayer.h>
#include <vespa/searchcore/proton/feedoperation/compact_lid_space_operation.h>
#include <vespa/vespalib/util/isequencedtaskexecutor.h>
#include <vespa/document/fieldvalue/document.h>
diff --git a/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp b/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp
index 71241d98a5a..790fa7a0125 100644
--- a/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp
@@ -146,7 +146,6 @@ SearchableDocSubDB::applyConfig(const DocumentDBConfig &newConfigSnapshot, const
{
StoreOnlyDocSubDB::reconfigure(newConfigSnapshot.getStoreConfig());
IReprocessingTask::List tasks;
- updateLidReuseDelayer(&newConfigSnapshot);
applyFlushConfig(newConfigSnapshot.getMaintenanceConfigSP()->getFlushConfig());
if (params.shouldMatchersChange() && _addMetrics) {
reconfigureMatchingMetrics(newConfigSnapshot.getRankProfilesConfig());
@@ -157,9 +156,8 @@ SearchableDocSubDB::applyConfig(const DocumentDBConfig &newConfigSnapshot, const
createAttributeSpec(newConfigSnapshot.getAttributesConfig(), serialNum);
IReprocessingInitializer::UP initializer =
_configurer.reconfigure(newConfigSnapshot, oldConfigSnapshot, *attrSpec, params, resolver);
- if (initializer.get() != nullptr && initializer->hasReprocessors()) {
- tasks.push_back(IReprocessingTask::SP(createReprocessingTask(*initializer,
- newConfigSnapshot.getDocumentTypeRepoSP()).release()));
+ if (initializer && initializer->hasReprocessors()) {
+ tasks.emplace_back(createReprocessingTask(*initializer, newConfigSnapshot.getDocumentTypeRepoSP()));
}
proton::IAttributeManager::SP newMgr = getAttributeManager();
if (_addMetrics) {
@@ -261,7 +259,7 @@ reconfigure(vespalib::Closure0<bool>::UP closure)
bool ret = true;
- if (closure.get() != nullptr)
+ if (closure)
ret = closure->call(); // Perform index manager reconfiguration now
reconfigureIndexSearchable();
return ret;
@@ -326,18 +324,6 @@ SearchableDocSubDB::getMatcherStats(const vespalib::string &rankProfile) const
}
void
-SearchableDocSubDB::updateLidReuseDelayer(const LidReuseDelayerConfig &config)
-{
- Parent::updateLidReuseDelayer(config);
- /*
- * The lid reuse delayer should not have any pending lids stored at this
- * time, since DocumentDB::applyConfig() calls forceCommit() on the
- * feed view before applying the new config to the sub dbs.
- */
- _lidReuseDelayer->setHasIndexedOrAttributeFields(config.hasIndexedOrAttributeFields());
-}
-
-void
SearchableDocSubDB::close()
{
_realGidToLidChangeHandler->close();
diff --git a/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.h b/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.h
index 70bb905cb55..31c77acff30 100644
--- a/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.h
+++ b/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.h
@@ -102,10 +102,6 @@ private:
void propagateFlushConfig();
protected:
IFlushTargetList getFlushTargetsInternal() override;
-
- using Parent::updateLidReuseDelayer;
-
- void updateLidReuseDelayer(const LidReuseDelayerConfig &config) override;
public:
SearchableDocSubDB(const Config &cfg, const Context &ctx);
~SearchableDocSubDB() override;
@@ -120,7 +116,7 @@ public:
IReprocessingTask::List
applyConfig(const DocumentDBConfig &newConfigSnapshot, const DocumentDBConfig &oldConfigSnapshot,
SerialNum serialNum, const ReconfigParams &params, IDocumentDBReferenceResolver &resolver) override;
- virtual void setBucketStateCalculator(const std::shared_ptr<IBucketStateCalculator> &calc) override;
+ void setBucketStateCalculator(const std::shared_ptr<IBucketStateCalculator> &calc) override;
void clearViews() override;
diff --git a/searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.cpp b/searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.cpp
index 1e5bbe023c2..97d7e96b5a0 100644
--- a/searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.cpp
@@ -13,7 +13,6 @@
#include <vespa/searchcore/proton/docsummary/summaryflushtarget.h>
#include <vespa/searchcore/proton/docsummary/summarymanagerinitializer.h>
#include <vespa/searchcore/proton/documentmetastore/documentmetastoreinitializer.h>
-#include <vespa/searchcore/proton/documentmetastore/lidreusedelayer.h>
#include <vespa/searchcore/proton/flushengine/shrink_lid_space_flush_target.h>
#include <vespa/searchcore/proton/flushengine/threadedflushtarget.h>
#include <vespa/searchcore/proton/index/index_writer.h>
@@ -43,9 +42,9 @@ using proton::matching::MatchingStats;
using proton::matching::SessionManager;
using vespalib::GenericHeader;
using search::common::FileHeaderContext;
-using proton::documentmetastore::LidReuseDelayer;
using proton::initializer::InitializerTask;
using searchcorespi::IFlushTarget;
+using proton::documentmetastore::LidReuseDelayerConfig;
namespace proton {
@@ -122,7 +121,6 @@ StoreOnlyDocSubDB::StoreOnlyDocSubDB(const Config &cfg, const Context &ctx)
_subDbId(cfg._subDbId),
_subDbType(cfg._subDbType),
_fileHeaderContext(*this, ctx._fileHeaderContext, _docTypeName, _baseDir),
- _lidReuseDelayer(),
_gidToLidChangeHandler(std::make_shared<DummyGidToLidChangeHandler>())
{
vespalib::mkdir(_baseDir, false); // Assume parent is created.
@@ -302,8 +300,6 @@ StoreOnlyDocSubDB::createInitializer(const DocumentDBConfig &configSnapshot, Ser
result->addDependency(summaryTask);
summaryTask->addDependency(dmsInitTask);
- LidReuseDelayerConfig lidReuseDelayerConfig(configSnapshot);
- result->writableResult().setLidReuseDelayerConfig(lidReuseDelayerConfig);
result->writableResult().setFlushConfig(configSnapshot.getMaintenanceConfigSP()->getFlushConfig());
return result;
}
@@ -313,8 +309,6 @@ StoreOnlyDocSubDB::setup(const DocumentSubDbInitializerResult &initResult)
{
setupDocumentMetaStore(initResult.documentMetaStore());
setupSummaryManager(initResult.summaryManager());
- _lidReuseDelayer = std::make_unique<LidReuseDelayer>(_writeService, *_dms);
- updateLidReuseDelayer(initResult.lidReuseDelayerConfig());
}
IFlushTarget::List
@@ -340,8 +334,8 @@ StoreOnlyFeedView::Context
StoreOnlyDocSubDB::getStoreOnlyFeedViewContext(const DocumentDBConfig &configSnapshot)
{
return StoreOnlyFeedView::Context(getSummaryAdapter(), configSnapshot.getSchemaSP(), _metaStoreCtx,
- *_gidToLidChangeHandler, configSnapshot.getDocumentTypeRepoSP(), _writeService,
- *_lidReuseDelayer);
+ *_gidToLidChangeHandler, configSnapshot.getDocumentTypeRepoSP(),
+ _writeService, LidReuseDelayerConfig(configSnapshot));
}
StoreOnlyFeedView::PersistentParams
@@ -404,25 +398,6 @@ StoreOnlyDocSubDB::getSubDbName() const {
return vespalib::make_string("%s.%s", _owner.getName().c_str(), _subName.c_str());
}
-void
-StoreOnlyDocSubDB::updateLidReuseDelayer(const DocumentDBConfig * newConfigSnapshot)
-{
- LidReuseDelayerConfig lidReuseDelayerConfig(*newConfigSnapshot);
- updateLidReuseDelayer(lidReuseDelayerConfig);
-}
-
-void
-StoreOnlyDocSubDB::updateLidReuseDelayer(const LidReuseDelayerConfig &config)
-{
- bool immediateCommit = (config.visibilityDelay() == vespalib::duration::zero());
- /*
- * The lid reuse delayer should not have any pending lids stored at this
- * time, since DocumentDB::applyConfig() calls forceCommit() on the
- * feed view before applying the new config to the sub dbs.
- */
- _lidReuseDelayer->setImmediateCommit(immediateCommit);
-}
-
IReprocessingTask::List
StoreOnlyDocSubDB::applyConfig(const DocumentDBConfig &newConfigSnapshot, const DocumentDBConfig &oldConfigSnapshot,
SerialNum serialNum, const ReconfigParams &params, IDocumentDBReferenceResolver &resolver)
@@ -434,7 +409,6 @@ StoreOnlyDocSubDB::applyConfig(const DocumentDBConfig &newConfigSnapshot, const
assert(_writeService.master().isCurrentThread());
reconfigure(newConfigSnapshot.getStoreConfig());
initFeedView(newConfigSnapshot);
- updateLidReuseDelayer(&newConfigSnapshot);
_owner.syncFeedView();
return IReprocessingTask::List();
}
diff --git a/searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.h b/searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.h
index 633201cd5d3..8d7fce4544d 100644
--- a/searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.h
+++ b/searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.h
@@ -12,7 +12,6 @@
#include <vespa/searchcore/proton/docsummary/summarymanager.h>
#include <vespa/searchcore/proton/documentmetastore/documentmetastorecontext.h>
#include <vespa/searchcore/proton/documentmetastore/documentmetastoreflushtarget.h>
-#include <vespa/searchcore/proton/documentmetastore/ilidreusedelayer.h>
#include <vespa/searchcore/proton/summaryengine/isearchhandler.h>
#include <vespa/searchcore/proton/persistenceengine/i_document_retriever.h>
#include <vespa/searchlib/common/fileheadercontext.h>
@@ -30,7 +29,6 @@ class ShrinkLidSpaceFlushTarget;
namespace initializer { class InitializerTask; }
namespace bucketdb { class IBucketDBHandlerInitializer; }
-namespace documentmetastore { class LidReuseDelayerConfig; }
/**
* Base class for a document sub database.
@@ -164,7 +162,6 @@ protected:
const uint32_t _subDbId;
const SubDbType _subDbType;
StoreOnlySubDBFileHeaderContext _fileHeaderContext;
- std::unique_ptr<documentmetastore::ILidReuseDelayer> _lidReuseDelayer;
std::shared_ptr<IGidToLidChangeHandler> _gidToLidChangeHandler;
std::shared_ptr<initializer::InitializerTask>
@@ -185,11 +182,7 @@ protected:
StoreOnlyFeedView::Context getStoreOnlyFeedViewContext(const DocumentDBConfig &configSnapshot);
StoreOnlyFeedView::PersistentParams getFeedViewPersistentParams();
vespalib::string getSubDbName() const;
- void updateLidReuseDelayer(const DocumentDBConfig *newConfigSnapshot);
- using LidReuseDelayerConfig = documentmetastore::LidReuseDelayerConfig;
-
- virtual void updateLidReuseDelayer(const LidReuseDelayerConfig &config);
void reconfigure(const search::LogDocumentStore::Config & protonConfig);
public:
StoreOnlyDocSubDB(const Config &cfg, const Context &ctx);
diff --git a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp
index c07d30b7f3a..7a3652692fe 100644
--- a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp
@@ -14,7 +14,7 @@
#include <vespa/searchcore/proton/attribute/attribute_utils.h>
#include <vespa/searchcore/proton/attribute/ifieldupdatecallback.h>
#include <vespa/searchcore/proton/common/feedtoken.h>
-#include <vespa/searchcore/proton/documentmetastore/ilidreusedelayer.h>
+#include <vespa/searchcore/proton/documentmetastore/lidreusedelayer.h>
#include <vespa/searchcore/proton/feedoperation/operations.h>
#include <vespa/searchcore/proton/reference/i_gid_to_lid_change_handler.h>
#include <vespa/searchlib/common/gatecallback.h>
@@ -39,6 +39,7 @@ using storage::spi::Timestamp;
using vespalib::IllegalStateException;
using vespalib::makeLambdaTask;
using vespalib::make_string;
+using proton::documentmetastore::LidReuseDelayer;
namespace proton {
@@ -196,7 +197,7 @@ StoreOnlyFeedView::StoreOnlyFeedView(const Context &ctx, const PersistentParams
_documentMetaStoreContext(ctx._documentMetaStoreContext),
_repo(ctx._repo),
_docType(nullptr),
- _lidReuseDelayer(ctx._lidReuseDelayer),
+ _lidReuseDelayer(ctx._writeService, _documentMetaStoreContext->get(), ctx._lidReuseDelayerConfig),
_pendingLidTracker(),
_schema(ctx._schema),
_writeService(ctx._writeService),
diff --git a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h
index 78b0d0a72d2..bb3f7ef28b6 100644
--- a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h
+++ b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h
@@ -13,6 +13,8 @@
#include <vespa/searchcore/proton/common/feeddebugger.h>
#include <vespa/searchcore/proton/documentmetastore/documentmetastore.h>
#include <vespa/searchcore/proton/documentmetastore/documentmetastorecontext.h>
+#include <vespa/searchcore/proton/documentmetastore/lid_reuse_delayer_config.h>
+#include <vespa/searchcore/proton/documentmetastore/lidreusedelayer.h>
#include <vespa/searchcore/proton/feedoperation/lidvectorcontext.h>
#include <vespa/searchcore/proton/persistenceengine/resulthandler.h>
#include <vespa/searchcore/proton/reference/pending_notify_remove_done.h>
@@ -37,8 +39,6 @@ struct IFieldUpdateCallback;
class RemoveDocumentsOperation;
class DocumentOperation;
-namespace documentmetastore { class ILidReuseDelayer; }
-
/**
* The feed view used by the store-only sub database.
*
@@ -48,7 +48,7 @@ class StoreOnlyFeedView : public IFeedView,
protected FeedDebugger
{
protected:
- typedef search::transactionlog::Packet Packet;
+ using Packet = search::transactionlog::Packet;
public:
using UP = std::unique_ptr<StoreOnlyFeedView>;
using SP = std::shared_ptr<StoreOnlyFeedView>;
@@ -68,6 +68,8 @@ public:
using PromisedStream = std::promise<vespalib::nbostream>;
using DocumentSP = std::shared_ptr<Document>;
using DocumentUpdateSP = std::shared_ptr<DocumentUpdate>;
+ using LidReuseDelayerConfig = documentmetastore::LidReuseDelayerConfig;
+ using LidReuseDelayer = documentmetastore::LidReuseDelayer;
using Lid = search::DocumentIdT;
@@ -79,7 +81,7 @@ public:
IGidToLidChangeHandler &_gidToLidChangeHandler;
const std::shared_ptr<const document::DocumentTypeRepo> &_repo;
searchcorespi::index::IThreadingService &_writeService;
- documentmetastore::ILidReuseDelayer &_lidReuseDelayer;
+ LidReuseDelayerConfig _lidReuseDelayerConfig;
Context(const ISummaryAdapter::SP &summaryAdapter,
const search::index::Schema::SP &schema,
@@ -87,14 +89,14 @@ public:
IGidToLidChangeHandler &gidToLidChangeHandler,
const std::shared_ptr<const document::DocumentTypeRepo> &repo,
searchcorespi::index::IThreadingService &writeService,
- documentmetastore::ILidReuseDelayer &lidReuseDelayer)
+ const LidReuseDelayerConfig & lidReuseDelayerConfig)
: _summaryAdapter(summaryAdapter),
_schema(schema),
_documentMetaStoreContext(documentMetaStoreContext),
_gidToLidChangeHandler(gidToLidChangeHandler),
_repo(repo),
_writeService(writeService),
- _lidReuseDelayer(lidReuseDelayer)
+ _lidReuseDelayerConfig(lidReuseDelayerConfig)
{}
};
@@ -136,12 +138,12 @@ protected:
};
private:
- const ISummaryAdapter::SP _summaryAdapter;
- const IDocumentMetaStoreContext::SP _documentMetaStoreContext;
- const std::shared_ptr<const document::DocumentTypeRepo> _repo;
- const document::DocumentType *_docType;
- documentmetastore::ILidReuseDelayer &_lidReuseDelayer;
- PendingLidTracker _pendingLidTracker;
+ const ISummaryAdapter::SP _summaryAdapter;
+ const IDocumentMetaStoreContext::SP _documentMetaStoreContext;
+ const std::shared_ptr<const document::DocumentTypeRepo> _repo;
+ const document::DocumentType *_docType;
+ LidReuseDelayer _lidReuseDelayer;
+ PendingLidTracker _pendingLidTracker;
protected:
const search::index::Schema::SP _schema;
@@ -231,8 +233,8 @@ public:
const search::IDocumentStore &getDocumentStore() const { return _summaryAdapter->getDocumentStore(); }
const IDocumentMetaStoreContext::SP &getDocumentMetaStore() const { return _documentMetaStoreContext; }
searchcorespi::index::IThreadingService &getWriteService() { return _writeService; }
- documentmetastore::ILidReuseDelayer &getLidReuseDelayer() { return _lidReuseDelayer; }
IGidToLidChangeHandler &getGidToLidChangeHandler() const { return _gidToLidChangeHandler; }
+ LidReuseDelayerConfig getLidReuseDelayerConfig() const { return _lidReuseDelayer.getConfig(); }
const std::shared_ptr<const document::DocumentTypeRepo> &getDocumentTypeRepo() const override { return _repo; }
const ISimpleDocumentMetaStore *getDocumentMetaStorePtr() const override;