summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@oath.com>2017-09-06 11:30:41 +0000
committerTor Egge <Tor.Egge@oath.com>2017-09-06 11:30:41 +0000
commit81d1801e29e73c700de8ba233c341e14c34e6d5b (patch)
treefaa2a1b49e18b497e0fae0fd983a9c01238bf069
parent3592926943f4e14f0e18348f8bddaf4ca6f38641 (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.
-rw-r--r--searchlib/src/vespa/searchlib/attribute/imported_attribute_vector_read_guard.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/imported_attribute_vector_read_guard.h4
-rw-r--r--searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/imported_search_context.h4
-rw-r--r--searchlib/src/vespa/searchlib/attribute/reference_attribute.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/reference_mappings.cpp5
-rw-r--r--searchlib/src/vespa/searchlib/attribute/reference_mappings.h9
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;