diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-08-21 13:11:17 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-08-21 13:43:52 +0000 |
commit | 6036dd3eace7ce564dd446c8307d7c14520ae3a3 (patch) | |
tree | 508e056d1a2f704415a4c146d081d0846853605d /searchcore | |
parent | da26039cd02e2eabef4e843d9515cff9797c0e28 (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')
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 ¶ms, 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 ¶ms, 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 ¶ms, - IDocumentDBReferenceResolver &resolver); + void reconfigure(const DocumentDBConfig &newConfig, + const DocumentDBConfig &oldConfig, + const ReconfigParams ¶ms, + 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 ¶ms, 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 ¶ms, 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; |