diff options
author | Tor Egge <Tor.Egge@oath.com> | 2017-09-06 11:30:41 +0000 |
---|---|---|
committer | Tor Egge <Tor.Egge@oath.com> | 2017-09-06 11:30:41 +0000 |
commit | 81d1801e29e73c700de8ba233c341e14c34e6d5b (patch) | |
tree | faa2a1b49e18b497e0fae0fd983a9c01238bf069 | |
parent | 3592926943f4e14f0e18348f8bddaf4ca6f38641 (diff) |
Remove boundary check for mapping from lid to referenced lid since
target attribute is populated before referenced lid is added to
mapping.
Adjust getReferencedLids() method to return const array ref with
safe size.
7 files changed, 13 insertions, 14 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector_read_guard.cpp b/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector_read_guard.cpp index 563834e6cdb..e1f32f87444 100644 --- a/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector_read_guard.cpp +++ b/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector_read_guard.cpp @@ -12,13 +12,11 @@ ImportedAttributeVectorReadGuard::ImportedAttributeVectorReadGuard( bool stableEnumGuard) : ImportedAttributeVector(name, std::move(reference_attribute), std::move(target_attribute)), _referencedLids(), - _referencedLidLimit(0u), _reference_attribute_guard(_reference_attribute), _target_attribute_guard(stableEnumGuard ? std::shared_ptr<AttributeVector>() : _target_attribute), _target_attribute_enum_guard(stableEnumGuard ? _target_attribute : std::shared_ptr<AttributeVector>()) { _referencedLids = _reference_attribute->getReferencedLids(); - _referencedLidLimit = _target_attribute->getCommittedDocIdLimit(); } ImportedAttributeVectorReadGuard::~ImportedAttributeVectorReadGuard() { diff --git a/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector_read_guard.h b/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector_read_guard.h index f4db2b538d5..852aa8761ea 100644 --- a/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector_read_guard.h +++ b/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector_read_guard.h @@ -17,14 +17,12 @@ class ImportedAttributeVectorReadGuard : public ImportedAttributeVector { using ReferencedLids = vespalib::ConstArrayRef<uint32_t>; ReferencedLids _referencedLids; - uint32_t _referencedLidLimit; AttributeGuard _reference_attribute_guard; AttributeGuard _target_attribute_guard; AttributeEnumGuard _target_attribute_enum_guard; uint32_t getReferencedLid(uint32_t lid) const { - uint32_t referencedLid = _referencedLids[lid]; - return ((referencedLid >= _referencedLidLimit) ? 0u : referencedLid); + return _referencedLids[lid]; } public: diff --git a/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp b/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp index 5a040941e67..2ab9ef101a0 100644 --- a/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp +++ b/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp @@ -28,7 +28,6 @@ ImportedSearchContext::ImportedSearchContext( _target_attribute(*_imported_attribute.getTargetAttribute()), _target_search_context(_target_attribute.getSearch(std::move(term), params)), _referencedLids(_reference_attribute.getReferencedLids()), - _referencedLidLimit(_target_attribute.getCommittedDocIdLimit()), _merger(_reference_attribute.getCommittedDocIdLimit()), _fetchPostingsDone(false) { diff --git a/searchlib/src/vespa/searchlib/attribute/imported_search_context.h b/searchlib/src/vespa/searchlib/attribute/imported_search_context.h index c4a6101ac0a..8970d5f5aaa 100644 --- a/searchlib/src/vespa/searchlib/attribute/imported_search_context.h +++ b/searchlib/src/vespa/searchlib/attribute/imported_search_context.h @@ -30,13 +30,11 @@ class ImportedSearchContext : public ISearchContext { const AttributeVector& _target_attribute; std::unique_ptr<AttributeVector::SearchContext> _target_search_context; ReferencedLids _referencedLids; - uint32_t _referencedLidLimit; PostingListMerger<int32_t> _merger; bool _fetchPostingsDone; uint32_t getReferencedLid(uint32_t lid) const { - uint32_t referencedLid = _referencedLids[lid]; - return ((referencedLid >= _referencedLidLimit) ? 0u : referencedLid); + return _referencedLids[lid]; } void makeMergedPostings(bool isFilter); diff --git a/searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp b/searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp index 8666f0bdced..f286d7a5fa4 100644 --- a/searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp +++ b/searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp @@ -35,7 +35,7 @@ ReferenceAttribute::ReferenceAttribute(const vespalib::stringref baseFileName, _indices(getGenerationHolder()), _cachedUniqueStoreMemoryUsage(), _gidToLidMapperFactory(), - _referenceMappings(getGenerationHolder()) + _referenceMappings(getGenerationHolder(), getCommittedDocIdLimitRef()) { setEnum(true); enableEnumeratedSave(true); diff --git a/searchlib/src/vespa/searchlib/attribute/reference_mappings.cpp b/searchlib/src/vespa/searchlib/attribute/reference_mappings.cpp index ae93dfba225..41a2c52de1c 100644 --- a/searchlib/src/vespa/searchlib/attribute/reference_mappings.cpp +++ b/searchlib/src/vespa/searchlib/attribute/reference_mappings.cpp @@ -7,11 +7,12 @@ namespace search::attribute { -ReferenceMappings::ReferenceMappings(GenerationHolder &genHolder) +ReferenceMappings::ReferenceMappings(GenerationHolder &genHolder, const uint32_t &committedDocIdLimit) : _reverseMappingIndices(genHolder), _referencedLidLimit(0), _reverseMapping(), - _referencedLids(genHolder) + _referencedLids(genHolder), + _committedDocIdLimit(committedDocIdLimit) { } diff --git a/searchlib/src/vespa/searchlib/attribute/reference_mappings.h b/searchlib/src/vespa/searchlib/attribute/reference_mappings.h index 43ae8a5bdb8..9ba6dd5853e 100644 --- a/searchlib/src/vespa/searchlib/attribute/reference_mappings.h +++ b/searchlib/src/vespa/searchlib/attribute/reference_mappings.h @@ -35,6 +35,7 @@ class ReferenceMappings ReverseMapping _reverseMapping; // vector containing referenced lid given referencing lid RcuVectorBase<uint32_t> _referencedLids; + const uint32_t &_committedDocIdLimit; void syncForwardMapping(const Reference &entry); void syncReverseMappingIndices(const Reference &entry); @@ -43,7 +44,7 @@ public: using ReferencedLids = vespalib::ConstArrayRef<uint32_t>; using ReverseMappingRefs = vespalib::ConstArrayRef<EntryRef>; - ReferenceMappings(GenerationHolder &genHolder); + ReferenceMappings(GenerationHolder &genHolder, const uint32_t &committedDocIdLimit); ~ReferenceMappings(); @@ -78,7 +79,11 @@ public: void foreach_lid(uint32_t referencedLid, FunctionType &&func) const; - ReferencedLids getReferencedLids() const { return ReferencedLids(&_referencedLids[0], _referencedLids.size()); } + ReferencedLids getReferencedLids() const { + uint32_t committedDocIdLimit = _committedDocIdLimit; + std::atomic_thread_fence(std::memory_order_acquire); + return ReferencedLids(&_referencedLids[0], committedDocIdLimit); + } uint32_t getReferencedLid(uint32_t doc) const { return _referencedLids[doc]; } ReverseMappingRefs getReverseMappingRefs() const { uint32_t referencedLidLimit = _referencedLidLimit; |