diff options
author | Håvard Pettersen <havardpe@oath.com> | 2021-10-07 12:22:04 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2021-10-07 13:04:42 +0000 |
commit | 2bf9f4d229580517ba228b6a6617bece324b41f1 (patch) | |
tree | b2149764aae825451e7025c48326af4b55e486e4 /searchlib | |
parent | 772e6e847a5fb6c2e35226ec9be702220636483e (diff) |
wire reported issues into search/docsum replies
Diffstat (limited to 'searchlib')
8 files changed, 94 insertions, 3 deletions
diff --git a/searchlib/src/tests/engine/proto_converter/proto_converter_test.cpp b/searchlib/src/tests/engine/proto_converter/proto_converter_test.cpp index 9cf8c73765c..5efe3f9fe8c 100644 --- a/searchlib/src/tests/engine/proto_converter/proto_converter_test.cpp +++ b/searchlib/src/tests/engine/proto_converter/proto_converter_test.cpp @@ -8,6 +8,7 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Winline" +using ::search::UniqueIssues; using Converter = ::search::engine::ProtoConverter; using SearchRequest = ::search::engine::SearchRequest; @@ -301,6 +302,20 @@ TEST_F(SearchReplyTest, require_that_slime_trace_is_converted) { EXPECT_EQ(proto.slime_trace(), "slime-trace"); } +TEST_F(SearchReplyTest, require_that_issues_are_converted_to_errors) { + reply.my_issues = std::make_unique<UniqueIssues>(); + reply.my_issues->handle(vespalib::Issue("a")); + reply.my_issues->handle(vespalib::Issue("b")); + reply.my_issues->handle(vespalib::Issue("c")); + reply.my_issues->handle(vespalib::Issue("a")); + reply.my_issues->handle(vespalib::Issue("b")); + convert(); + ASSERT_EQ(proto.errors_size(), 3); + EXPECT_EQ(proto.errors(0).message(), "a"); + EXPECT_EQ(proto.errors(1).message(), "b"); + EXPECT_EQ(proto.errors(2).message(), "c"); +} + //----------------------------------------------------------------------------- struct DocsumRequestTest : ::testing::Test { @@ -490,6 +505,20 @@ TEST_F(DocsumReplyTest, require_that_missing_root_slime_gives_empty_payload) { EXPECT_EQ(proto.slime_summaries().size(), 0); } +TEST_F(DocsumReplyTest, require_that_issues_are_converted_to_errors) { + reply.my_issues = std::make_unique<UniqueIssues>(); + reply.my_issues->handle(vespalib::Issue("a")); + reply.my_issues->handle(vespalib::Issue("b")); + reply.my_issues->handle(vespalib::Issue("c")); + reply.my_issues->handle(vespalib::Issue("a")); + reply.my_issues->handle(vespalib::Issue("b")); + convert(); + ASSERT_EQ(proto.errors_size(), 3); + EXPECT_EQ(proto.errors(0).message(), "a"); + EXPECT_EQ(proto.errors(1).message(), "b"); + EXPECT_EQ(proto.errors(2).message(), "c"); +} + //----------------------------------------------------------------------------- struct MonitorReplyTest : ::testing::Test { diff --git a/searchlib/src/vespa/searchlib/common/CMakeLists.txt b/searchlib/src/vespa/searchlib/common/CMakeLists.txt index bd12f862d62..6495fa8561d 100644 --- a/searchlib/src/vespa/searchlib/common/CMakeLists.txt +++ b/searchlib/src/vespa/searchlib/common/CMakeLists.txt @@ -13,8 +13,8 @@ vespa_add_library(searchlib_common OBJECT fileheadercontext.cpp flush_token.cpp geo_location.cpp - geo_location_spec.cpp geo_location_parser.cpp + geo_location_spec.cpp growablebitvector.cpp indexmetainfo.cpp location.cpp @@ -32,5 +32,6 @@ vespa_add_library(searchlib_common OBJECT sortspec.cpp threaded_compactable_lid_space.cpp tunefileinfo.cpp + unique_issues.cpp DEPENDS ) diff --git a/searchlib/src/vespa/searchlib/common/unique_issues.cpp b/searchlib/src/vespa/searchlib/common/unique_issues.cpp new file mode 100644 index 00000000000..9f41efaeda3 --- /dev/null +++ b/searchlib/src/vespa/searchlib/common/unique_issues.cpp @@ -0,0 +1,13 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "unique_issues.h" + +namespace search { + +void +UniqueIssues::handle(const vespalib::Issue &issue) +{ + _messages.insert(issue.message()); +} + +} diff --git a/searchlib/src/vespa/searchlib/common/unique_issues.h b/searchlib/src/vespa/searchlib/common/unique_issues.h new file mode 100644 index 00000000000..5b25820c408 --- /dev/null +++ b/searchlib/src/vespa/searchlib/common/unique_issues.h @@ -0,0 +1,28 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include <vespa/vespalib/util/issue.h> +#include <memory> +#include <set> + +namespace search { + +/** + * Keep track of all unique issues encountered. + **/ +class UniqueIssues : public vespalib::Issue::Handler +{ +private: + std::set<vespalib::string> _messages; +public: + using UP = std::unique_ptr<UniqueIssues>; + void handle(const vespalib::Issue &issue) override; + void for_each_message(auto fun) const { + for (const auto &msg: _messages) { + fun(msg); + } + } +}; + +} diff --git a/searchlib/src/vespa/searchlib/engine/docsumreply.h b/searchlib/src/vespa/searchlib/engine/docsumreply.h index 15b202148d3..42eec32dba6 100644 --- a/searchlib/src/vespa/searchlib/engine/docsumreply.h +++ b/searchlib/src/vespa/searchlib/engine/docsumreply.h @@ -5,6 +5,7 @@ #include <vector> #include <vespa/document/base/globalid.h> #include <vespa/vespalib/util/memory.h> +#include <vespa/searchlib/common/unique_issues.h> #include <memory> #include <vespa/searchlib/engine/docsumrequest.h> @@ -36,6 +37,7 @@ struct DocsumReply mutable DocsumRequest::UP request; std::unique_ptr<vespalib::Slime> _root; + UniqueIssues::UP my_issues; DocsumReply(); DocsumReply(std::unique_ptr<vespalib::Slime> root); diff --git a/searchlib/src/vespa/searchlib/engine/proto_converter.cpp b/searchlib/src/vespa/searchlib/engine/proto_converter.cpp index 9ad058c20ad..64039f69cd5 100644 --- a/searchlib/src/vespa/searchlib/engine/proto_converter.cpp +++ b/searchlib/src/vespa/searchlib/engine/proto_converter.cpp @@ -117,6 +117,13 @@ ProtoConverter::search_reply_to_proto(const SearchReply &reply, ProtoSearchReply proto.set_grouping_blob(&reply.groupResult[0], reply.groupResult.size()); const auto &slime_trace = reply.propertiesMap.trace().lookup("slime"); proto.set_slime_trace(slime_trace.get().data(), slime_trace.get().size()); + if (reply.my_issues) { + reply.my_issues->for_each_message([&](const vespalib::string &err_msg) + { + auto *err_obj = proto.add_errors(); + err_obj->set_message(err_msg); + }); + } } //----------------------------------------------------------------------------- @@ -166,6 +173,13 @@ ProtoConverter::docsum_reply_to_proto(const DocsumReply &reply, ProtoDocsumReply vespalib::slime::BinaryFormat::encode(*reply._root, buf); proto.set_slime_summaries(buf.obtain().data, buf.obtain().size); } + if (reply.my_issues) { + reply.my_issues->for_each_message([&](const vespalib::string &err_msg) + { + auto *err_obj = proto.add_errors(); + err_obj->set_message(err_msg); + }); + } } //----------------------------------------------------------------------------- diff --git a/searchlib/src/vespa/searchlib/engine/searchreply.cpp b/searchlib/src/vespa/searchlib/engine/searchreply.cpp index f2402d264e1..954b3d5141c 100644 --- a/searchlib/src/vespa/searchlib/engine/searchreply.cpp +++ b/searchlib/src/vespa/searchlib/engine/searchreply.cpp @@ -12,7 +12,8 @@ SearchReply::SearchReply() groupResult(), coverage(), hits(), - request() + request(), + my_issues() { } SearchReply::~SearchReply() = default; @@ -25,7 +26,8 @@ SearchReply::SearchReply(const SearchReply &rhs) groupResult (rhs.groupResult), coverage (rhs.coverage), hits (rhs.hits), - request() // NB not copied + request(), // NB not copied + my_issues() // NB not copied { } } diff --git a/searchlib/src/vespa/searchlib/engine/searchreply.h b/searchlib/src/vespa/searchlib/engine/searchreply.h index b44eb6d6d84..b23a5fc192e 100644 --- a/searchlib/src/vespa/searchlib/engine/searchreply.h +++ b/searchlib/src/vespa/searchlib/engine/searchreply.h @@ -4,6 +4,7 @@ #include <vespa/document/base/globalid.h> #include <vespa/searchlib/common/hitrank.h> +#include <vespa/searchlib/common/unique_issues.h> #include <vespa/vespalib/util/array.h> #include <vespa/searchlib/engine/searchrequest.h> #include <vector> @@ -72,6 +73,7 @@ public: PropertiesMap propertiesMap; SearchRequest::UP request; + UniqueIssues::UP my_issues; SearchReply(); ~SearchReply(); |