diff options
author | Geir Storli <geirst@verizonmedia.com> | 2019-05-31 12:09:33 +0000 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2019-05-31 12:09:33 +0000 |
commit | 38a7db76c5d6f4c6c6f1c55218d5671768768692 (patch) | |
tree | 775211700e47e67b7027904df74ff150a0da69df /searchcore/src/tests/proton | |
parent | cb165b874d9d7bdc31c0081d7ec26bb6cd963bac (diff) |
Fix bug in lid space compaction where partial updates to attributes were lost when moving a document.
Instead of using the document store directly (when reading the document to move) the document retriever must be used.
The document retriever patches in attribute values and also correctly waits for the thread writing to the document store.
The job moving documents between the "ready" and "not ready" sub databases was already doing this correctly.
Diffstat (limited to 'searchcore/src/tests/proton')
3 files changed, 47 insertions, 36 deletions
diff --git a/searchcore/src/tests/proton/documentdb/documentbucketmover/documentbucketmover_test.cpp b/searchcore/src/tests/proton/documentdb/documentbucketmover/documentbucketmover_test.cpp index af6a9d38385..10b1c829674 100644 --- a/searchcore/src/tests/proton/documentdb/documentbucketmover/documentbucketmover_test.cpp +++ b/searchcore/src/tests/proton/documentdb/documentbucketmover/documentbucketmover_test.cpp @@ -191,7 +191,7 @@ MySubDb::MySubDb(const std::shared_ptr<const DocumentTypeRepo> &repo, std::share _metaStore(*_metaStoreSP), _realRetriever(std::make_shared<MyDocumentRetriever>(repo)), _retriever(_realRetriever), - _subDb(_metaStoreSP, _retriever, subDbId), _docs(), + _subDb("my_sub_db", subDbId, _metaStoreSP, _retriever, IFeedView::SP()), _docs(), _bucketDBHandler(*bucketDB) { _bucketDBHandler.addDocumentMetaStore(_metaStoreSP.get(), 0); @@ -238,7 +238,11 @@ struct MoveFixture void setupForBucket(const BucketId &bucket, uint32_t sourceSubDbId, uint32_t targetSubDbId) { - _source._subDb._subDbId = sourceSubDbId; + _source._subDb = MaintenanceDocumentSubDB(_source._subDb.name(), + sourceSubDbId, + _source._subDb.meta_store(), + _source._subDb.retriever(), + _source._subDb.feed_view()); _mover.setupForBucket(bucket, &_source._subDb, targetSubDbId, _handler, _bucketDb); } void moveDocuments(size_t maxDocsToMove) { diff --git a/searchcore/src/tests/proton/documentdb/lid_space_compaction/lid_space_compaction_test.cpp b/searchcore/src/tests/proton/documentdb/lid_space_compaction/lid_space_compaction_test.cpp index 82566025a30..5305ff15003 100644 --- a/searchcore/src/tests/proton/documentdb/lid_space_compaction/lid_space_compaction_test.cpp +++ b/searchcore/src/tests/proton/documentdb/lid_space_compaction/lid_space_compaction_test.cpp @@ -160,51 +160,59 @@ struct MyFrozenBucketHandler : public IFrozenBucketHandler virtual void removeListener(IBucketFreezeListener *) override { } }; -struct MyFeedView : public test::DummyFeedView -{ - MyFeedView(const std::shared_ptr<const DocumentTypeRepo> &repo) - : test::DummyFeedView(repo) +struct MyFeedView : public test::DummyFeedView { + MyFeedView(std::shared_ptr<const DocumentTypeRepo> repo) + : test::DummyFeedView(std::move(repo)) { } }; -struct MyDocumentStore : public test::DummyDocumentStore -{ +struct MyDocumentStore : public test::DummyDocumentStore { Document::SP _readDoc; mutable uint32_t _readLid; MyDocumentStore() : _readDoc(), _readLid(0) {} - virtual document::Document::UP - read(search::DocumentIdT lid, const document::DocumentTypeRepo &) const override { + ~MyDocumentStore(); + document::Document::UP read(search::DocumentIdT lid, const document::DocumentTypeRepo &) const override { _readLid = lid; return Document::UP(_readDoc->clone()); } }; -struct MySummaryManager : public test::DummySummaryManager -{ - MyDocumentStore _store; - MySummaryManager() : _store() {} - virtual search::IDocumentStore &getBackingStore() override { return _store; } -}; +MyDocumentStore::~MyDocumentStore() = default; -struct MySubDb : public test::DummyDocumentSubDb -{ - std::shared_ptr<const DocumentTypeRepo> _repo; - MySubDb(const std::shared_ptr<const DocumentTypeRepo> &repo, std::shared_ptr<BucketDBOwner> bucketDB); - ~MySubDb(); - virtual IFeedView::SP getFeedView() const override { - return IFeedView::SP(new MyFeedView(_repo)); +struct MyDocumentRetriever : public DocumentRetrieverBaseForTest { + std::shared_ptr<const DocumentTypeRepo> repo; + const MyDocumentStore& store; + MyDocumentRetriever(std::shared_ptr<const DocumentTypeRepo> repo_in, const MyDocumentStore& store_in) + : repo(repo_in), + store(store_in) + { + } + const document::DocumentTypeRepo& getDocumentTypeRepo() const override { return *repo; } + void getBucketMetaData(const storage::spi::Bucket&, DocumentMetaData::Vector& ) const override { abort(); } + DocumentMetaData getDocumentMetaData(const DocumentId& ) const override { abort(); } + Document::UP getDocument(DocumentIdT lid) const override { + return store.read(lid, *repo); } + CachedSelect::SP parseSelect(const vespalib::string &) const override { abort(); } }; +struct MySubDb { + test::DummyDocumentSubDb sub_db; + MaintenanceDocumentSubDB maintenance_sub_db; + MySubDb(std::shared_ptr<BucketDBOwner> bucket_db, const MyDocumentStore& store, std::shared_ptr<const DocumentTypeRepo> repo); + ~MySubDb(); +}; -MySubDb::MySubDb(const std::shared_ptr<const DocumentTypeRepo> &repo, std::shared_ptr<BucketDBOwner> bucketDB) - : test::DummyDocumentSubDb(bucketDB, SUBDB_ID), - _repo(repo) +MySubDb::MySubDb(std::shared_ptr<BucketDBOwner> bucket_db, const MyDocumentStore& store, std::shared_ptr<const DocumentTypeRepo> repo) + : sub_db(std::move(bucket_db), SUBDB_ID), + maintenance_sub_db(sub_db.getName(), sub_db.getSubDbId(), sub_db.getDocumentMetaStoreContext().getSP(), + std::make_shared<MyDocumentRetriever>(repo, store), + std::make_shared<MyFeedView>(repo)) { - _summaryManager.reset(new MySummaryManager()); } -MySubDb::~MySubDb() {} + +MySubDb::~MySubDb() = default; struct MyDirectJobRunner : public IMaintenanceJobRunner { IMaintenanceJob &_job; @@ -350,17 +358,15 @@ struct HandlerFixture { DocBuilder _docBuilder; std::shared_ptr<BucketDBOwner> _bucketDB; + MyDocumentStore _docStore; MySubDb _subDb; - MySummaryManager &_summaryMgr; - MyDocumentStore &_docStore; LidSpaceCompactionHandler _handler; HandlerFixture() : _docBuilder(Schema()), _bucketDB(std::make_shared<BucketDBOwner>()), - _subDb(_docBuilder.getDocumentTypeRepo(), _bucketDB), - _summaryMgr(static_cast<MySummaryManager &>(*_subDb.getSummaryManager())), - _docStore(_summaryMgr._store), - _handler(_subDb, "test") + _docStore(), + _subDb(_bucketDB, _docStore, _docBuilder.getDocumentTypeRepo()), + _handler(_subDb.maintenance_sub_db, "test") { _docStore._readDoc = _docBuilder.startDocument(DOC_ID).endDocument(); } diff --git a/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp b/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp index c3974368e54..a4f2aeb767d 100644 --- a/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp +++ b/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp @@ -523,9 +523,10 @@ MyDocumentSubDB::getSubDB() { IDocumentRetriever::SP retriever(new MyDocumentRetriever(*this)); - return MaintenanceDocumentSubDB(_metaStoreSP, + return MaintenanceDocumentSubDB("my_sub_db", _subDBId, + _metaStoreSP, retriever, - _subDBId); + IFeedView::SP()); } |