diff options
Diffstat (limited to 'searchcore')
6 files changed, 24 insertions, 25 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastore.cpp b/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastore.cpp index 5d2f358e4c8..d4b0f173087 100644 --- a/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastore.cpp +++ b/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastore.cpp @@ -261,7 +261,8 @@ DocumentMetaStore::onInitSave(vespalib::stringref fileName) GenerationHandler::Guard guard(getGuard()); return std::make_unique<DocumentMetaStoreSaver> (std::move(guard), createAttributeHeader(fileName), - _gidToLidMap.getFrozenView().begin(), _metaDataStore); + _gidToLidMap.getFrozenView().begin(), + vespalib::ConstArrayRef(&_metaDataStore[0], getCommittedDocIdLimit())); } DocumentMetaStore::DocId diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastore.h b/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastore.h index e393ad16178..305b81d58a6 100644 --- a/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastore.h +++ b/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastore.h @@ -178,7 +178,7 @@ public: bool validLidFast(DocId lid) const { return _lidAlloc.validLid(lid); } bool validLid(DocId lid) const override { return validLidFast(lid); } void removeBatch(const std::vector<DocId> &lidsToRemove, const DocId docIdLimit) override; - const RawDocumentMetaData & getRawMetaData(DocId lid) const override { return _metaDataStore[lid]; } + const RawDocumentMetaData & getRawMetaData(DocId lid) const override { return _metaDataStore.acquire_elem_ref(lid); } /** * Implements search::IDocumentMetaStore diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoresaver.cpp b/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoresaver.cpp index 0abe88da719..e4ad9cf8ac2 100644 --- a/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoresaver.cpp +++ b/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoresaver.cpp @@ -14,33 +14,31 @@ namespace { /* * Functor class to write meta data for a single lid. Note that during - * a background save with active feeding, timestamp, bucketused bits + * a background save with active feeding, timestamp, bucket used bits * and size might reflect future values due to missing snapshot - * properties in MetaDataStore. size might also reflect a mix between - * current ant future value due to non-atomic access. + * properties in RcuVector. Size might also reflect a mix between + * current and future value due to non-atomic access. */ class WriteMetaData { - search::BufferWriter &_datWriter; - const RawDocumentMetaData *_metaDataStore; - uint32_t _metaDataStoreSize; - bool _writeDocSize; - using MetaDataStore = DocumentMetaStoreSaver::MetaDataStore; + using MetaDataView = DocumentMetaStoreSaver::MetaDataView; using GlobalId = documentmetastore::IStore::GlobalId; using BucketId = documentmetastore::IStore::BucketId; using Timestamp = documentmetastore::IStore::Timestamp; + search::BufferWriter &_datWriter; + MetaDataView _metaDataView; + bool _writeDocSize; public: - WriteMetaData(search::BufferWriter &datWriter, const MetaDataStore &metaDataStore, bool writeDocSize) + WriteMetaData(search::BufferWriter &datWriter, MetaDataView metaDataView, bool writeDocSize) : _datWriter(datWriter), - _metaDataStore(&metaDataStore[0]), - _metaDataStoreSize(metaDataStore.size()), + _metaDataView(metaDataView), _writeDocSize(writeDocSize) { } void operator()(documentmetastore::GidToLidMapKey key) { auto lid = key.get_lid(); - assert(lid < _metaDataStoreSize); - const RawDocumentMetaData &metaData = _metaDataStore[lid]; + assert(lid < _metaDataView.size()); + const RawDocumentMetaData &metaData = _metaDataView[lid]; const GlobalId &gid = metaData.getGid(); // 6 bits used for bucket bits uint8_t bucketUsedBits = metaData.getBucketUsedBits(); @@ -71,10 +69,10 @@ DocumentMetaStoreSaver:: DocumentMetaStoreSaver(vespalib::GenerationHandler::Guard &&guard, const search::attribute::AttributeHeader &header, const GidIterator &gidIterator, - const MetaDataStore &metaDataStore) + MetaDataView metaDataView) : AttributeSaver(std::move(guard), header), _gidIterator(gidIterator), - _metaDataStore(metaDataStore), + _metaDataView(metaDataView), _writeDocSize(true) { if (header.getVersion() == documentmetastore::NO_DOCUMENT_SIZE_TRACKING_VERSION) { @@ -92,7 +90,7 @@ DocumentMetaStoreSaver::onSave(IAttributeSaveTarget &saveTarget) // write <lid,gid> pairs, sorted on gid std::unique_ptr<search::BufferWriter> datWriter(saveTarget.datWriter().allocBufferWriter()); - _gidIterator.foreach_key(WriteMetaData(*datWriter, _metaDataStore, _writeDocSize)); + _gidIterator.foreach_key(WriteMetaData(*datWriter, _metaDataView, _writeDocSize)); datWriter->flush(); return true; } diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoresaver.h b/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoresaver.h index f0be17540a2..5f97ba1e0b0 100644 --- a/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoresaver.h +++ b/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoresaver.h @@ -25,11 +25,11 @@ public: vespalib::btree::BTreeNoLeafData, vespalib::btree::NoAggregated, const KeyComp &>; - using MetaDataStore = vespalib::RcuVectorBase<RawDocumentMetaData>; + using MetaDataView = vespalib::ConstArrayRef<RawDocumentMetaData>; private: GidIterator _gidIterator; // iterator over frozen tree - const MetaDataStore &_metaDataStore; + MetaDataView _metaDataView; bool _writeDocSize; bool onSave(search::IAttributeSaveTarget &saveTarget) override; @@ -37,7 +37,7 @@ public: DocumentMetaStoreSaver(vespalib::GenerationHandler::Guard &&guard, const search::attribute::AttributeHeader &header, const GidIterator &gidIterator, - const MetaDataStore &metaDataStore); + MetaDataView metaDataView); ~DocumentMetaStoreSaver() override; }; diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_gid_key_comparator.cpp b/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_gid_key_comparator.cpp index d52e87a0871..40cd3c89a6d 100644 --- a/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_gid_key_comparator.cpp +++ b/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_gid_key_comparator.cpp @@ -7,7 +7,7 @@ namespace proton::documentmetastore { LidGidKeyComparator::LidGidKeyComparator(const document::GlobalId &gid, const MetaDataStore &metaDataStore) : _gid(gid), - _metaDataStore(metaDataStore), + _metaDataView(&metaDataStore.acquire_elem_ref(0)), _gidCompare() { } @@ -15,7 +15,7 @@ LidGidKeyComparator::LidGidKeyComparator(const document::GlobalId &gid, LidGidKeyComparator::LidGidKeyComparator(const RawDocumentMetaData &metaData, const MetaDataStore &metaDataStore) : _gid(metaData.getGid()), - _metaDataStore(metaDataStore), + _metaDataView(&metaDataStore.acquire_elem_ref(0)), _gidCompare() { } diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_gid_key_comparator.h b/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_gid_key_comparator.h index c18224370e1..5970342c750 100644 --- a/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_gid_key_comparator.h +++ b/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_gid_key_comparator.h @@ -21,12 +21,12 @@ private: typedef vespalib::RcuVectorBase<RawDocumentMetaData> MetaDataStore; const document::GlobalId &_gid; - const MetaDataStore &_metaDataStore; + const RawDocumentMetaData* _metaDataView; const document::GlobalId::BucketOrderCmp _gidCompare; const document::GlobalId &getGid(const GidToLidMapKey &key) const { if (!key.is_find_key()) { - return _metaDataStore[key.get_lid()].getGid(); + return _metaDataView[key.get_lid()].getGid(); } return _gid; } |