From e34cb01cc56158c97036f54c34467bd14470b4c4 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Thu, 29 Feb 2024 12:23:40 +0000 Subject: Cache the query stack if using ranking.queryCache and use it for proper summary handling --- .../searchcore/proton/docsummary/docsumcontext.cpp | 6 ++++- .../vespa/searchcore/proton/matching/matcher.cpp | 28 +++++++++++++--------- .../src/vespa/searchcore/proton/matching/matcher.h | 5 ++++ .../searchcore/proton/matching/search_session.cpp | 3 ++- .../searchcore/proton/matching/search_session.h | 4 ++++ 5 files changed, 33 insertions(+), 13 deletions(-) (limited to 'searchcore/src') diff --git a/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp b/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp index d6cccf47b18..6c7232c5491 100644 --- a/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp +++ b/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include @@ -50,6 +49,11 @@ DocsumContext::initState() { const DocsumRequest & req = _request; _docsumState._args.initFromDocsumRequest(req); + auto [session, expectSession] = Matcher::lookupSearchSession(_sessionMgr, req); + if (session) { + vespalib::stringref queryStack = session->getStackDump(); + _docsumState._args.setStackDump(queryStack.size(), queryStack.data()); + } _docsumState._docsumbuf.clear(); _docsumState._docsumbuf.reserve(req.hits.size()); for (const auto & hit : req.hits) { diff --git a/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp b/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp index c4a0593a865..4a9156770f0 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp +++ b/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp @@ -269,6 +269,8 @@ Matcher::match(const SearchRequest &request, vespalib::ThreadBundle &threadBundl // These should have been moved instead. owned_objects.feature_overrides = std::make_unique(*feature_overrides); feature_overrides = owned_objects.feature_overrides.get(); + vespalib::stringref queryStack = request.getStackRef(); + owned_objects.stackDump.assign(queryStack.begin(), queryStack.end()); } MatchToolsFactory::UP mtf = create_match_tools_factory(request, searchContext, attrContext, metaStore, @@ -385,6 +387,18 @@ Matcher::get_matching_elements(const DocsumRequest &req, ISearchContext &search_ return docsum_matcher->get_matching_elements(fields); } +std::pair, bool> +Matcher::lookupSearchSession(SessionManager &session_manager, const Request & req) { + SessionId sessionId(req.sessionId.data(), req.sessionId.size()); + if (!sessionId.empty()) { + const Properties &cache_props = req.propertiesMap.cacheProperties(); + if (cache_props.lookup("query").found()) { + return {session_manager.pickSearch(sessionId), true}; + } + } + return {{}, false}; +} + DocsumMatcher::UP Matcher::create_docsum_matcher(const DocsumRequest &req, ISearchContext &search_ctx, IAttributeContext &attr_ctx, SessionManager &session_manager) const @@ -397,17 +411,9 @@ Matcher::create_docsum_matcher(const DocsumRequest &req, ISearchContext &search_ } } std::sort(docs.begin(), docs.end()); - SessionId sessionId(req.sessionId.data(), req.sessionId.size()); - bool expectedSessionCached(false); - if (!sessionId.empty()) { - const Properties &cache_props = req.propertiesMap.cacheProperties(); - expectedSessionCached = cache_props.lookup("query").found(); - if (expectedSessionCached) { - SearchSession::SP session(session_manager.pickSearch(sessionId)); - if (session) { - return std::make_unique(std::move(session), std::move(docs)); - } - } + auto [session, expectedSessionCached] = lookupSearchSession(session_manager, req); + if (session) { + return std::make_unique(std::move(session), std::move(docs)); } StupidMetaStore meta; MatchToolsFactory::UP mtf = create_match_tools_factory(req, search_ctx, attr_ctx, meta, diff --git a/searchcore/src/vespa/searchcore/proton/matching/matcher.h b/searchcore/src/vespa/searchcore/proton/matching/matcher.h index bf75dd9da89..24a7d67496f 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/matcher.h +++ b/searchcore/src/vespa/searchcore/proton/matching/matcher.h @@ -183,6 +183,11 @@ public: * @return true if this rankprofile has summary-features enabled **/ bool canProduceSummaryFeatures() const; + /** + * Return a session if it exist, and a bool saying if it should exist. + */ + static std::pair, bool> + lookupSearchSession(SessionManager &session_manager, const Request & request); }; } diff --git a/searchcore/src/vespa/searchcore/proton/matching/search_session.cpp b/searchcore/src/vespa/searchcore/proton/matching/search_session.cpp index 21bfbd25af0..76ddf80aa54 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/search_session.cpp +++ b/searchcore/src/vespa/searchcore/proton/matching/search_session.cpp @@ -28,7 +28,8 @@ SearchSession::OwnershipBundle::OwnershipBundle(MatchContext && match_context, : search_handler(std::move(searchHandler)), context(std::move(match_context)), feature_overrides(), - readGuard() + readGuard(), + stackDump() {} SearchSession::OwnershipBundle::OwnershipBundle() noexcept = default; diff --git a/searchcore/src/vespa/searchcore/proton/matching/search_session.h b/searchcore/src/vespa/searchcore/proton/matching/search_session.h index d044ce456be..7cdb79f003c 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/search_session.h +++ b/searchcore/src/vespa/searchcore/proton/matching/search_session.h @@ -33,6 +33,7 @@ public: MatchContext context; std::unique_ptr feature_overrides; IDocumentMetaStoreContext::IReadGuard::SP readGuard; + std::vector stackDump; }; private: using SessionId = vespalib::string; @@ -64,6 +65,9 @@ public: vespalib::steady_time getTimeOfDoom() const { return _time_of_doom; } MatchToolsFactory &getMatchToolsFactory() { return *_match_tools_factory; } + vespalib::stringref getStackDump() const noexcept { + return {_owned_objects.stackDump.data(), _owned_objects.stackDump.size()}; + } }; } -- cgit v1.2.3