summaryrefslogtreecommitdiffstats
path: root/searchlib/src
diff options
context:
space:
mode:
authorArne H Juul <arnej@yahooinc.com>2021-10-14 10:11:20 +0000
committerArne H Juul <arnej@yahooinc.com>2021-10-14 10:11:20 +0000
commitdf689ff589e185f51dec5a6cfa70e4009ebc176a (patch)
treeb1c55046f2a32f088e2215f4712da41597c473ef /searchlib/src
parentadad7cc066e7debe8137737a8ce9c6ce377a2c1a (diff)
make DocsumReply a proper class
Diffstat (limited to 'searchlib/src')
-rw-r--r--searchlib/src/tests/engine/proto_converter/proto_converter_test.cpp19
-rw-r--r--searchlib/src/tests/engine/proto_rpc_adapter/proto_rpc_adapter_test.cpp7
-rw-r--r--searchlib/src/vespa/searchlib/engine/docsumreply.cpp17
-rw-r--r--searchlib/src/vespa/searchlib/engine/docsumreply.h33
-rw-r--r--searchlib/src/vespa/searchlib/engine/proto_converter.cpp16
-rw-r--r--searchlib/src/vespa/searchlib/engine/proto_rpc_adapter.cpp4
6 files changed, 57 insertions, 39 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 973d2bcc15c..7eb7d1d0d80 100644
--- a/searchlib/src/tests/engine/proto_converter/proto_converter_test.cpp
+++ b/searchlib/src/tests/engine/proto_converter/proto_converter_test.cpp
@@ -478,14 +478,13 @@ TEST_F(DocsumRequestTest, require_that_global_ids_are_converted) {
//-----------------------------------------------------------------------------
struct DocsumReplyTest : ::testing::Test {
- DocsumReply reply;
+ DocsumReply reply{std::make_unique<vespalib::Slime>()};
Converter::ProtoDocsumReply proto;
void convert() { Converter::docsum_reply_to_proto(reply, proto); }
};
TEST_F(DocsumReplyTest, require_that_slime_summaries_are_converted) {
- reply._root = std::make_unique<Slime>();
- auto &list = reply._root->setArray();
+ auto &list = reply.slime().setArray();
auto &doc0 = list.addObject();
doc0.setLong("my_field", 42);
convert();
@@ -496,18 +495,18 @@ TEST_F(DocsumReplyTest, require_that_slime_summaries_are_converted) {
}
TEST_F(DocsumReplyTest, require_that_missing_root_slime_gives_empty_payload) {
- reply._root.reset();
+ reply.releaseSlime();
convert();
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"));
+ reply.setIssues(std::make_unique<UniqueIssues>());
+ reply.issues().handle(vespalib::Issue("a"));
+ reply.issues().handle(vespalib::Issue("b"));
+ reply.issues().handle(vespalib::Issue("c"));
+ reply.issues().handle(vespalib::Issue("a"));
+ reply.issues().handle(vespalib::Issue("b"));
convert();
ASSERT_EQ(proto.errors_size(), 3);
EXPECT_EQ(proto.errors(0).message(), "a");
diff --git a/searchlib/src/tests/engine/proto_rpc_adapter/proto_rpc_adapter_test.cpp b/searchlib/src/tests/engine/proto_rpc_adapter/proto_rpc_adapter_test.cpp
index 41f471f0a7a..7aa72b50ba4 100644
--- a/searchlib/src/tests/engine/proto_rpc_adapter/proto_rpc_adapter_test.cpp
+++ b/searchlib/src/tests/engine/proto_rpc_adapter/proto_rpc_adapter_test.cpp
@@ -49,12 +49,11 @@ struct MyDocsumServer : DocsumServer {
DocsumReply::UP getDocsums(DocsumRequest::Source src, DocsumClient &client) override {
auto req = src.release();
assert(req);
- auto reply = std::make_unique<DocsumReply>();
- reply->_root = std::make_unique<Slime>();
- auto &list = reply->_root->setArray();
+ auto reply = std::make_unique<DocsumReply>(std::make_unique<Slime>());
+ auto &list = reply->slime().setArray();
list.addObject().setBool("use_root_slime", true);
list.addObject().setString("ranking", req->ranking);
- reply->request = std::move(req);
+ reply->setRequest(std::move(req));
std::this_thread::sleep_for(std::chrono::milliseconds(5));
client.getDocsumsDone(std::move(reply)); // simplified async response
return std::unique_ptr<DocsumReply>();
diff --git a/searchlib/src/vespa/searchlib/engine/docsumreply.cpp b/searchlib/src/vespa/searchlib/engine/docsumreply.cpp
index d546e087bbf..e8baad19a47 100644
--- a/searchlib/src/vespa/searchlib/engine/docsumreply.cpp
+++ b/searchlib/src/vespa/searchlib/engine/docsumreply.cpp
@@ -6,18 +6,19 @@
namespace search::engine {
-DocsumReply::DocsumReply() : DocsumReply(vespalib::Slime::UP(nullptr)) { }
+DocsumReply::DocsumReply() { }
-DocsumReply::DocsumReply(vespalib::Slime::UP root)
- : _root(std::move(root))
-{ }
-
-DocsumReply::~DocsumReply() { }
+DocsumReply::DocsumReply(vespalib::Slime::UP root) : _slime(std::move(root)) { }
vespalib::slime::Inspector & DocsumReply::root() const {
- assert(_root);
- return _root->get();
+ return _slime ? _slime->get() : *vespalib::slime::NixValue::invalid();
+}
+
+std::unique_ptr<vespalib::Slime> DocsumReply::releaseSlime() {
+ return std::move(_slime);
}
+DocsumReply::~DocsumReply() { }
+
}
diff --git a/searchlib/src/vespa/searchlib/engine/docsumreply.h b/searchlib/src/vespa/searchlib/engine/docsumreply.h
index 10acd94a32a..6098dfe197f 100644
--- a/searchlib/src/vespa/searchlib/engine/docsumreply.h
+++ b/searchlib/src/vespa/searchlib/engine/docsumreply.h
@@ -8,23 +8,42 @@
#include <vespa/searchlib/common/unique_issues.h>
#include <memory>
#include <vespa/searchlib/engine/docsumrequest.h>
+#include <cassert>
namespace vespalib { class Slime; }
namespace vespalib::slime { struct Inspector; }
namespace search::engine {
-struct DocsumReply
-{
+class DocsumReply {
+private:
+ DocsumRequest::UP _request;
+ std::unique_ptr<vespalib::Slime> _slime;
+ UniqueIssues::UP _issues;
+public:
using UP = std::unique_ptr<DocsumReply>;
- mutable DocsumRequest::UP request;
- std::unique_ptr<vespalib::Slime> _root;
- UniqueIssues::UP my_issues;
+ DocsumReply();
+ DocsumReply(std::unique_ptr<vespalib::Slime> root);
+
+ bool hasSlime() const { return _slime.get() != nullptr; }
+ bool hasRequest() const { return _request.get() != nullptr; }
+ bool hasIssues() const { return _issues.get() != nullptr; }
+
+ vespalib::Slime & slime() const { assert(hasSlime()); return *_slime; }
+ DocsumRequest& request() const { assert(hasRequest()); return *_request; }
+ UniqueIssues & issues() const { assert(hasIssues()); return *_issues; }
+
+ void setRequest(DocsumRequest::UP request) {
+ _request = std::move(request);
+ }
+ void setIssues(UniqueIssues::UP issues) {
+ _issues = std::move(issues);
+ }
+
+ std::unique_ptr<vespalib::Slime> releaseSlime();
vespalib::slime::Inspector & root() const;
- DocsumReply();
- DocsumReply(std::unique_ptr<vespalib::Slime> root);
~DocsumReply();
};
diff --git a/searchlib/src/vespa/searchlib/engine/proto_converter.cpp b/searchlib/src/vespa/searchlib/engine/proto_converter.cpp
index 64039f69cd5..52b247ae19e 100644
--- a/searchlib/src/vespa/searchlib/engine/proto_converter.cpp
+++ b/searchlib/src/vespa/searchlib/engine/proto_converter.cpp
@@ -168,17 +168,17 @@ ProtoConverter::docsum_request_from_proto(const ProtoDocsumRequest &proto, Docsu
void
ProtoConverter::docsum_reply_to_proto(const DocsumReply &reply, ProtoDocsumReply &proto)
{
- if (reply._root) {
+ if (reply.hasSlime()) {
vespalib::SmartBuffer buf(4_Ki);
- vespalib::slime::BinaryFormat::encode(*reply._root, buf);
+ vespalib::slime::BinaryFormat::encode(reply.slime(), 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);
- });
+ if (reply.hasIssues()) {
+ reply.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/proto_rpc_adapter.cpp b/searchlib/src/vespa/searchlib/engine/proto_rpc_adapter.cpp
index 5a3bfe42515..b4a50b10373 100644
--- a/searchlib/src/vespa/searchlib/engine/proto_rpc_adapter.cpp
+++ b/searchlib/src/vespa/searchlib/engine/proto_rpc_adapter.cpp
@@ -160,8 +160,8 @@ struct GetDocsumsCompletionHandler : DocsumClient {
ProtoConverter::docsum_reply_to_proto(*reply, msg);
encode_message(msg, *req.GetReturn());
stats.reply_size = (*req.GetReturn())[2]._data._len;
- if (reply->request) {
- stats.latency = vespalib::to_s(reply->request->getTimeUsed());
+ if (reply->hasRequest()) {
+ stats.latency = vespalib::to_s(reply->request().getTimeUsed());
metrics.update_docsum_metrics(stats);
}
req.Return();