aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-05-09 21:14:19 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-05-09 21:18:12 +0000
commit8c35625d8c6d65f42d392ec93721548bad606a8c (patch)
treee53666fce81c3667d7f990fb2b662f1d525e5173 /searchlib
parentbb565352a9126272451b9b3cf5679d98b1f47536 (diff)
Wire the metastore read guard all the way and use it, if present.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/attribute/bitvector_search_cache/bitvector_search_cache_test.cpp1
-rw-r--r--searchlib/src/tests/attribute/multi_value_read_view/multi_value_read_view_test.cpp1
-rw-r--r--searchlib/src/vespa/searchcommon/attribute/i_document_meta_store_context.h (renamed from searchlib/src/vespa/searchlib/common/i_document_meta_store_context.h)4
-rw-r--r--searchlib/src/vespa/searchcommon/attribute/search_context_params.h16
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp70
-rw-r--r--searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.h2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/imported_attribute_vector.h4
-rw-r--r--searchlib/src/vespa/searchlib/attribute/imported_attribute_vector_read_guard.h2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp9
-rw-r--r--searchlib/src/vespa/searchlib/attribute/imported_search_context.h2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/irequestcontext.h2
-rw-r--r--searchlib/src/vespa/searchlib/test/imported_attribute_fixture.h1
12 files changed, 55 insertions, 59 deletions
diff --git a/searchlib/src/tests/attribute/bitvector_search_cache/bitvector_search_cache_test.cpp b/searchlib/src/tests/attribute/bitvector_search_cache/bitvector_search_cache_test.cpp
index 273cbeba13a..b9c82892a97 100644
--- a/searchlib/src/tests/attribute/bitvector_search_cache/bitvector_search_cache_test.cpp
+++ b/searchlib/src/tests/attribute/bitvector_search_cache/bitvector_search_cache_test.cpp
@@ -3,7 +3,6 @@
#include <vespa/vespalib/testkit/test_kit.h>
#include <vespa/searchlib/attribute/bitvector_search_cache.h>
#include <vespa/searchlib/common/bitvector.h>
-#include <vespa/searchlib/common/i_document_meta_store_context.h>
using namespace search;
using namespace search::attribute;
diff --git a/searchlib/src/tests/attribute/multi_value_read_view/multi_value_read_view_test.cpp b/searchlib/src/tests/attribute/multi_value_read_view/multi_value_read_view_test.cpp
index b5798bfdcc8..b092de766a5 100644
--- a/searchlib/src/tests/attribute/multi_value_read_view/multi_value_read_view_test.cpp
+++ b/searchlib/src/tests/attribute/multi_value_read_view/multi_value_read_view_test.cpp
@@ -13,7 +13,6 @@
#include <vespa/searchlib/attribute/integerbase.h>
#include <vespa/searchlib/attribute/reference_attribute.h>
#include <vespa/searchlib/attribute/stringbase.h>
-#include <vespa/searchlib/common/i_document_meta_store_context.h>
#include <vespa/searchlib/test/mock_gid_to_lid_mapping.h>
#include <vespa/vespalib/gtest/gtest.h>
#include <vespa/vespalib/util/stash.h>
diff --git a/searchlib/src/vespa/searchlib/common/i_document_meta_store_context.h b/searchlib/src/vespa/searchcommon/attribute/i_document_meta_store_context.h
index 93492427372..0b4d5c80a50 100644
--- a/searchlib/src/vespa/searchlib/common/i_document_meta_store_context.h
+++ b/searchlib/src/vespa/searchcommon/attribute/i_document_meta_store_context.h
@@ -21,7 +21,7 @@ struct IDocumentMetaStoreContext {
using SP = std::shared_ptr<IReadGuard>;
- virtual ~IReadGuard() {}
+ virtual ~IReadGuard() = default;
/**
* Access to read interface.
@@ -29,7 +29,7 @@ struct IDocumentMetaStoreContext {
virtual const search::IDocumentMetaStore &get() const = 0;
};
- virtual ~IDocumentMetaStoreContext() {}
+ virtual ~IDocumentMetaStoreContext() = default;
/**
* Access to read interface.
diff --git a/searchlib/src/vespa/searchcommon/attribute/search_context_params.h b/searchlib/src/vespa/searchcommon/attribute/search_context_params.h
index 168f4215ef6..8ed7eadf919 100644
--- a/searchlib/src/vespa/searchcommon/attribute/search_context_params.h
+++ b/searchlib/src/vespa/searchcommon/attribute/search_context_params.h
@@ -2,6 +2,7 @@
#pragma once
+#include "i_document_meta_store_context.h"
#include <cstddef>
#include <limits>
#include <cstdint>
@@ -15,14 +16,16 @@ class IAttributeVector;
*/
class SearchContextParams {
private:
- const IAttributeVector * _diversityAttribute;
- uint32_t _diversityCutoffGroups;
- bool _useBitVector;
- bool _diversityCutoffStrict;
+ const IAttributeVector * _diversityAttribute;
+ const IDocumentMetaStoreContext::IReadGuard::SP * _metaStoreReadGuard;
+ uint32_t _diversityCutoffGroups;
+ bool _useBitVector;
+ bool _diversityCutoffStrict;
public:
SearchContextParams()
: _diversityAttribute(nullptr),
+ _metaStoreReadGuard(nullptr),
_diversityCutoffGroups(std::numeric_limits<uint32_t>::max()),
_useBitVector(false),
_diversityCutoffStrict(false)
@@ -31,6 +34,7 @@ public:
const IAttributeVector * diversityAttribute() const { return _diversityAttribute; }
uint32_t diversityCutoffGroups() const { return _diversityCutoffGroups; }
bool diversityCutoffStrict() const { return _diversityCutoffStrict; }
+ const IDocumentMetaStoreContext::IReadGuard::SP * metaStoreReadGuard() const { return _metaStoreReadGuard; }
SearchContextParams &useBitVector(bool value) {
_useBitVector = value;
@@ -48,6 +52,10 @@ public:
_diversityCutoffStrict = strict;
return *this;
}
+ SearchContextParams &metaStoreReadGuard(const IDocumentMetaStoreContext::IReadGuard::SP * readGuard) {
+ _metaStoreReadGuard = readGuard;
+ return *this;
+ }
};
}
diff --git a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp
index 692b86fdc75..5335d0fde18 100644
--- a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp
@@ -126,6 +126,11 @@ private:
enum Type {INT, FLOAT, OTHER};
Type _type;
+public:
+ AttributeFieldBlueprint(const FieldSpec &field, const IAttributeVector &attribute,
+ const string &query_stack, const attribute::SearchContextParams &params)
+ : AttributeFieldBlueprint(field, attribute, QueryTermDecoder::decodeTerm(query_stack), params)
+ { }
AttributeFieldBlueprint(const FieldSpec &field, const IAttributeVector &attribute,
QueryTermSimple::UP term, const attribute::SearchContextParams &params)
: SimpleLeafBlueprint(field),
@@ -144,31 +149,6 @@ private:
}
}
- AttributeFieldBlueprint(const FieldSpec &field, const IAttributeVector &attribute,
- const string &query_stack, const attribute::SearchContextParams &params)
- : AttributeFieldBlueprint(field, attribute, QueryTermDecoder::decodeTerm(query_stack), params)
- { }
-
-public:
- AttributeFieldBlueprint(const FieldSpec &field, const IAttributeVector &attribute, QueryTermSimple::UP term)
- : AttributeFieldBlueprint(field, attribute, std::move(term),
- attribute::SearchContextParams().useBitVector(field.isFilter()))
- {}
- AttributeFieldBlueprint(const FieldSpec &field, const IAttributeVector &attribute, const string &query_stack)
- : AttributeFieldBlueprint(field, attribute, QueryTermDecoder::decodeTerm(query_stack))
- {}
-
- AttributeFieldBlueprint(const FieldSpec &field, const IAttributeVector &attribute,
- const IAttributeVector &diversity, const string &query_stack,
- size_t diversityCutoffGroups, bool diversityCutoffStrict)
- : AttributeFieldBlueprint(field, attribute, query_stack,
- attribute::SearchContextParams()
- .diversityAttribute(&diversity)
- .useBitVector(field.isFilter())
- .diversityCutoffGroups(diversityCutoffGroups)
- .diversityCutoffStrict(diversityCutoffStrict))
- {}
-
SearchIteratorUP createLeafSearch(const TermFieldMatchDataArray &tfmda, bool strict) const override {
assert(tfmda.size() == 1);
return _search_context->createIterator(tfmda[0], strict);
@@ -253,7 +233,7 @@ private:
bool _should_use;
public:
- LocationPreFilterBlueprint(const FieldSpec &field, const IAttributeVector &attribute, const ZCurve::RangeVector &rangeVector)
+ LocationPreFilterBlueprint(const FieldSpec &field, const IAttributeVector &attribute, const ZCurve::RangeVector &rangeVector, const attribute::SearchContextParams & scParams)
: ComplexLeafBlueprint(field),
_attribute(attribute),
_rangeSearches(),
@@ -265,8 +245,7 @@ public:
query::Range qr(r.min(), r.max());
query::SimpleRangeTerm rt(qr, "", 0, query::Weight(0));
string stack(StackDumpCreator::create(rt));
- _rangeSearches.push_back(attr.createSearchContext(QueryTermDecoder::decodeTerm(stack),
- attribute::SearchContextParams()));
+ _rangeSearches.push_back(attr.createSearchContext(QueryTermDecoder::decodeTerm(stack), scParams));
estHits += _rangeSearches.back()->approximateHits();
LOG(debug, "Range '%s' estHits %" PRId64, qr.getRangeString().c_str(), estHits);
}
@@ -371,7 +350,8 @@ public:
//-----------------------------------------------------------------------------
Blueprint::UP
-make_location_blueprint(const FieldSpec &field, const IAttributeVector &attribute, const Location &loc) {
+make_location_blueprint(const FieldSpec &field, const IAttributeVector &attribute, const Location &loc,
+ const attribute::SearchContextParams & scParams) {
LOG(debug, "make_location_blueprint(fieldId[%u], p[%d,%d], r[%u], aspect[%u], bb[[%d,%d],[%d,%d]])",
field.getFieldId(),
loc.point.x, loc.point.y, loc.radius,
@@ -390,7 +370,7 @@ make_location_blueprint(const FieldSpec &field, const IAttributeVector &attribut
location.bounding_box.y.low,
location.bounding_box.x.high,
location.bounding_box.y.high);
- auto pre_filter = std::make_unique<LocationPreFilterBlueprint>(field, attribute, rangeVector);
+ auto pre_filter = std::make_unique<LocationPreFilterBlueprint>(field, attribute, rangeVector, scParams);
if (!pre_filter->should_use()) {
LOG(debug, "only use post filter");
return post_filter;
@@ -720,13 +700,19 @@ public:
NodeAsKey key(n, _scratchPad);
setResult(std::make_unique<DirectAttributeBlueprint>(_field, _attr.getName(), _attr, *_dwa, key));
} else {
+ attribute::SearchContextParams scParams;
+ scParams.useBitVector(_field.isFilter())
+ .metaStoreReadGuard(getRequestContext().getMetaStoreReadGuard());
const string stack = StackDumpCreator::create(n);
- setResult(std::make_unique<AttributeFieldBlueprint>(_field, _attr, stack));
+ setResult(std::make_unique<AttributeFieldBlueprint>(_field, _attr, stack, scParams));
}
}
void visitLocation(LocationTerm &node) {
- setResult(make_location_blueprint(_field, _attr, node.getTerm()));
+ attribute::SearchContextParams scParams;
+ scParams.useBitVector(_field.isFilter())
+ .metaStoreReadGuard(getRequestContext().getMetaStoreReadGuard());
+ setResult(make_location_blueprint(_field, _attr, node.getTerm(), scParams));
}
void visitPredicate(PredicateQuery &query) {
@@ -747,17 +733,21 @@ public:
const string stack = StackDumpCreator::create(n);
const string term = queryeval::termAsString(n);
QueryTermSimple parsed_term(term, QueryTermSimple::Type::WORD);
+ attribute::SearchContextParams scParams;
+ scParams.useBitVector(_field.isFilter())
+ .metaStoreReadGuard(getRequestContext().getMetaStoreReadGuard());
if (parsed_term.getMaxPerGroup() > 0) {
const IAttributeVector *diversity(getRequestContext().getAttribute(parsed_term.getDiversityAttribute()));
if (check_valid_diversity_attr(diversity)) {
- setResult(std::make_unique<AttributeFieldBlueprint>(_field, _attr, *diversity, stack,
- parsed_term.getDiversityCutoffGroups(),
- parsed_term.getDiversityCutoffStrict()));
+ scParams.diversityAttribute(diversity)
+ .diversityCutoffGroups(parsed_term.getDiversityCutoffGroups())
+ .diversityCutoffStrict(parsed_term.getDiversityCutoffStrict());
+ setResult(std::make_unique<AttributeFieldBlueprint>(_field, _attr, stack, scParams));
} else {
setResult(std::make_unique<queryeval::EmptyBlueprint>(_field));
}
} else {
- setResult(std::make_unique<AttributeFieldBlueprint>(_field, _attr, stack));
+ setResult(std::make_unique<AttributeFieldBlueprint>(_field, _attr, stack, scParams));
}
}
@@ -795,9 +785,11 @@ public:
bool isInteger = _attr.isIntegerType();
if (isSingleValue && (isString || isInteger)) {
auto ws = std::make_unique<AttributeWeightedSetBlueprint>(_field, _attr);
+ attribute::SearchContextParams scParams;
+ scParams.metaStoreReadGuard(getRequestContext().getMetaStoreReadGuard());
for (size_t i = 0; i < n.getNumTerms(); ++i) {
auto term = n.getAsString(i);
- ws->addToken(_attr.createSearchContext(extractTerm(term.first, isInteger), attribute::SearchContextParams()), term.second.percent());
+ ws->addToken(_attr.createSearchContext(extractTerm(term.first, isInteger), scParams), term.second.percent());
}
setResult(std::move(ws));
} else {
@@ -878,10 +870,12 @@ template <typename WS>
void
CreateBlueprintVisitor::createShallowWeightedSet(WS *bp, MultiTerm &n, const FieldSpec &fs, bool isInteger) {
Blueprint::UP result(bp);
+ attribute::SearchContextParams scParams;
+ scParams.metaStoreReadGuard(getRequestContext().getMetaStoreReadGuard());
for (uint32_t i(0); i < n.getNumTerms(); i++) {
FieldSpec childfs = bp->getNextChildField(fs);
auto term = n.getAsString(i);
- bp->addTerm(std::make_unique<AttributeFieldBlueprint>(childfs, _attr, extractTerm(term.first, isInteger)), term.second.percent());
+ bp->addTerm(std::make_unique<AttributeFieldBlueprint>(childfs, _attr, extractTerm(term.first, isInteger), scParams.useBitVector(childfs.isFilter())), term.second.percent());
}
setResult(std::move(result));
}
diff --git a/searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.h b/searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.h
index ba1baa2037e..3936fb2ee67 100644
--- a/searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.h
+++ b/searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.h
@@ -2,7 +2,7 @@
#pragma once
-#include <vespa/searchlib/common/i_document_meta_store_context.h>
+#include <vespa/searchcommon/attribute/i_document_meta_store_context.h>
#include <vespa/vespalib/stllike/hash_map.h>
#include <vespa/vespalib/stllike/string.h>
#include <memory>
diff --git a/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector.h b/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector.h
index 29172ef1831..cf808b6cf05 100644
--- a/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector.h
+++ b/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector.h
@@ -3,11 +3,9 @@
#pragma once
#include "readable_attribute_vector.h"
-#include <vespa/searchlib/common/i_document_meta_store_context.h>
+#include <vespa/searchcommon/attribute/i_document_meta_store_context.h>
#include <vespa/vespalib/stllike/string.h>
-namespace search { struct IDocumentMetaStoreContext; }
-
namespace search::attribute {
class BitVectorSearchCache;
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 1297acad9b8..5889934fa23 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
@@ -6,7 +6,7 @@
#include "attributeguard.h"
#include <vespa/searchcommon/attribute/iattributevector.h>
#include <vespa/searchcommon/attribute/i_multi_value_attribute.h>
-#include <vespa/searchlib/common/i_document_meta_store_context.h>
+#include <vespa/searchcommon/attribute/i_document_meta_store_context.h>
#include <vespa/vespalib/datastore/atomic_value_wrapper.h>
#include <vespa/vespalib/util/arrayref.h>
diff --git a/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp b/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp
index 39a2a9f742c..56fcac125a6 100644
--- a/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp
@@ -37,8 +37,6 @@ ImportedSearchContext::ImportedSearchContext(
_useSearchCache(_imported_attribute.getSearchCache()),
_searchCacheLookup((_useSearchCache ? _imported_attribute.getSearchCache()->find(_queryTerm) :
std::shared_ptr<BitVectorSearchCache::Entry>())),
- _dmsReadGuard((_useSearchCache && !_searchCacheLookup) ? imported_attribute.getDocumentMetaStore()->getReadGuard() :
- std::shared_ptr<IDocumentMetaStoreContext::IReadGuard>()),
_reference_attribute(*_imported_attribute.getReferenceAttribute()),
_target_attribute(target_attribute),
_target_search_context(_target_attribute.createSearchContext(std::move(term), params)),
@@ -292,8 +290,11 @@ void
ImportedSearchContext::considerAddSearchCacheEntry()
{
if (_useSearchCache && _merger.hasBitVector()) {
- assert(_dmsReadGuard);
- auto cacheEntry = std::make_shared<BitVectorSearchCache::Entry>(std::move(_dmsReadGuard), _merger.getBitVectorSP(), _merger.getDocIdLimit());
+ IDocumentMetaStoreContext::IReadGuard::SP dmsReadGuard = (_params.metaStoreReadGuard() != nullptr)
+ ? *_params.metaStoreReadGuard()
+ : _imported_attribute.getDocumentMetaStore()->getReadGuard();
+ assert(dmsReadGuard);
+ auto cacheEntry = std::make_shared<BitVectorSearchCache::Entry>(std::move(dmsReadGuard), _merger.getBitVectorSP(), _merger.getDocIdLimit());
_imported_attribute.getSearchCache()->insert(_queryTerm, std::move(cacheEntry));
}
}
diff --git a/searchlib/src/vespa/searchlib/attribute/imported_search_context.h b/searchlib/src/vespa/searchlib/attribute/imported_search_context.h
index 8ac874edaf2..7138091f599 100644
--- a/searchlib/src/vespa/searchlib/attribute/imported_search_context.h
+++ b/searchlib/src/vespa/searchlib/attribute/imported_search_context.h
@@ -6,7 +6,6 @@
#include "posting_list_merger.h"
#include <vespa/searchcommon/attribute/search_context_params.h>
#include <vespa/searchcommon/attribute/i_search_context.h>
-#include <vespa/searchlib/common/i_document_meta_store_context.h>
#include <vespa/vespalib/datastore/atomic_value_wrapper.h>
#include <vespa/vespalib/util/arrayref.h>
@@ -34,7 +33,6 @@ class ImportedSearchContext : public ISearchContext {
vespalib::string _queryTerm;
bool _useSearchCache;
BitVectorSearchCache::Entry::SP _searchCacheLookup;
- IDocumentMetaStoreContext::IReadGuard::SP _dmsReadGuard;
const ReferenceAttribute& _reference_attribute;
const IAttributeVector &_target_attribute;
std::unique_ptr<ISearchContext> _target_search_context;
diff --git a/searchlib/src/vespa/searchlib/queryeval/irequestcontext.h b/searchlib/src/vespa/searchlib/queryeval/irequestcontext.h
index 09f1dc51f60..76cd9dbdf06 100644
--- a/searchlib/src/vespa/searchlib/queryeval/irequestcontext.h
+++ b/searchlib/src/vespa/searchlib/queryeval/irequestcontext.h
@@ -3,7 +3,7 @@
#pragma once
#include <vespa/vespalib/stllike/string.h>
-#include <vespa/searchlib/common/i_document_meta_store_context.h>
+#include <vespa/searchcommon/attribute/i_document_meta_store_context.h>
namespace search::attribute { struct AttributeBlueprintParams; }
namespace search::attribute { class IAttributeVector; }
diff --git a/searchlib/src/vespa/searchlib/test/imported_attribute_fixture.h b/searchlib/src/vespa/searchlib/test/imported_attribute_fixture.h
index 5117e2b2ef3..38638920b4c 100644
--- a/searchlib/src/vespa/searchlib/test/imported_attribute_fixture.h
+++ b/searchlib/src/vespa/searchlib/test/imported_attribute_fixture.h
@@ -13,7 +13,6 @@
#include <vespa/searchlib/attribute/integerbase.h>
#include <vespa/searchlib/attribute/reference_attribute.h>
#include <vespa/searchlib/attribute/stringbase.h>
-#include <vespa/searchlib/common/i_document_meta_store_context.h>
#include <vespa/searchlib/query/query_term_simple.h>
#include <vespa/searchcommon/attribute/attributecontent.h>
#include <vespa/searchcommon/attribute/config.h>