diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-05-09 21:14:19 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-05-09 21:18:12 +0000 |
commit | 8c35625d8c6d65f42d392ec93721548bad606a8c (patch) | |
tree | e53666fce81c3667d7f990fb2b662f1d525e5173 /searchlib | |
parent | bb565352a9126272451b9b3cf5679d98b1f47536 (diff) |
Wire the metastore read guard all the way and use it, if present.
Diffstat (limited to 'searchlib')
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 ¶ms) + : AttributeFieldBlueprint(field, attribute, QueryTermDecoder::decodeTerm(query_stack), params) + { } AttributeFieldBlueprint(const FieldSpec &field, const IAttributeVector &attribute, QueryTermSimple::UP term, const attribute::SearchContextParams ¶ms) : SimpleLeafBlueprint(field), @@ -144,31 +149,6 @@ private: } } - AttributeFieldBlueprint(const FieldSpec &field, const IAttributeVector &attribute, - const string &query_stack, const attribute::SearchContextParams ¶ms) - : 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> |