aboutsummaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-08-15 20:20:37 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2017-08-15 20:20:37 +0200
commitfbd92b4bc20faa0d559490567f735aa3f14ac6f7 (patch)
tree18b530f23a28e40c0870070000d25894e4809738 /searchcore
parent141bb9f1c45016a9f4013e98abb1033745d8ff53 (diff)
Add support for sessionid for using query cache.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/proton/summaryengine/summaryengine.cpp256
-rw-r--r--searchcore/src/vespa/searchcore/proton/summaryengine/docsum_by_slime.cpp8
2 files changed, 126 insertions, 138 deletions
diff --git a/searchcore/src/tests/proton/summaryengine/summaryengine.cpp b/searchcore/src/tests/proton/summaryengine/summaryengine.cpp
index 3262d571c56..289d25bcb02 100644
--- a/searchcore/src/tests/proton/summaryengine/summaryengine.cpp
+++ b/searchcore/src/tests/proton/summaryengine/summaryengine.cpp
@@ -2,11 +2,9 @@
#include <vespa/vespalib/testkit/testapp.h>
#include <vespa/searchcore/proton/summaryengine/summaryengine.h>
#include <vespa/searchcore/proton/summaryengine/docsum_by_slime.h>
-#include <vespa/searchlib/engine/docsumapi.h>
#include <vespa/searchlib/engine/searchreply.h>
#include <vespa/searchlib/util/rawbuf.h>
#include <vespa/searchlib/util/slime_output_raw_buf_adapter.h>
-#include <vespa/vespalib/data/slime/slime.h>
#include <vespa/vespalib/data/databuffer.h>
#include <vespa/document/util/compressor.h>
#include <vespa/searchlib/common/transport.h>
@@ -35,30 +33,33 @@ class MySearchHandler : public ISearchHandler {
std::string _name;
stringref _reply;
public:
- MySearchHandler(const std::string & name = "my",
- const stringref & reply = MYREPLY) :
- _name(name), _reply(reply) {}
- virtual DocsumReply::UP getDocsums(const DocsumRequest & request) override {
+ MySearchHandler(const std::string &name = "my",
+ const stringref &reply = MYREPLY) :
+ _name(name), _reply(reply) {}
+
+ virtual DocsumReply::UP getDocsums(const DocsumRequest &request) override {
return (request.useRootSlime())
- ? std::make_unique<DocsumReply>(createSlimeReply(request.hits.size()))
- : createOldDocSum(request);
+ ? std::make_unique<DocsumReply>(createSlimeReply(request.hits.size()))
+ : createOldDocSum(request);
}
- vespalib::Slime::UP createSlimeReply(size_t count) {
+
+ vespalib::Slime::UP createSlimeReply(size_t count) {
vespalib::Slime::UP response(std::make_unique<vespalib::Slime>());
- Cursor & root = response->setObject();
- Cursor & array = root.setArray(DOCSUMS);
+ Cursor &root = response->setObject();
+ Cursor &array = root.setArray(DOCSUMS);
const Symbol docsumSym = response->insert(DOCSUM);
- for (size_t i=0; i < count; i++) {
- Cursor & docSumC = array.addObject();
+ for (size_t i = 0; i < count; i++) {
+ Cursor &docSumC = array.addObject();
ObjectSymbolInserter inserter(docSumC, docsumSym);
inserter.insertObject().setLong("long", 982);
}
return response;
}
- DocsumReply::UP createOldDocSum(const DocsumRequest & request) {
+
+ DocsumReply::UP createOldDocSum(const DocsumRequest &request) {
DocsumReply::UP retval(new DocsumReply());
- for (size_t i=0; i < request.hits.size(); i++) {
- const DocsumRequest::Hit & h = request.hits[i];
+ for (size_t i = 0; i < request.hits.size(); i++) {
+ const DocsumRequest::Hit &h = request.hits[i];
DocsumReply::Docsum docsum;
docsum.docid = 10 + i;
docsum.gid = h.gid;
@@ -79,11 +80,13 @@ public:
class MyDocsumClient : public DocsumClient {
private:
vespalib::Monitor _monitor;
- DocsumReply::UP _reply;
+ DocsumReply::UP _reply;
public:
MyDocsumClient();
+
~MyDocsumClient();
+
void getDocsumsDone(DocsumReply::UP reply) override {
vespalib::MonitorGuard guard(_monitor);
_reply = std::move(reply);
@@ -101,42 +104,24 @@ public:
};
MyDocsumClient::MyDocsumClient() {}
-MyDocsumClient::~MyDocsumClient() {}
-class Test : public vespalib::TestApp {
-private:
- bool assertDocsumReply(SummaryEngine & engine,
- const std::string & searchDocType,
- const stringref & expReply);
-
- void requireThatGetDocsumsExecute();
- void requireThatHandlersAreStored();
- void requireThatCorrectHandlerIsUsed();
- void requireThatSlimeRequestIsConvertedCorrectly();
- void requireThatSlimeInterfaceWorksFine();
- void requireThatRPCInterfaceWorks();
-public:
- int Main() override;
-};
+MyDocsumClient::~MyDocsumClient() {}
DocsumRequest::UP
-createRequest(size_t num=1)
-{
+createRequest(size_t num = 1) {
DocsumRequest::UP r(new DocsumRequest());
if (num == 1) {
r->hits.emplace_back(GlobalId("aaaaaaaaaaaa"));
} else {
- for (size_t i=0; i < num; i++) {
- vespalib::string s = vespalib::make_string("aaaaaaaaaaa%c", char('a' + i%26));
+ for (size_t i = 0; i < num; i++) {
+ vespalib::string s = vespalib::make_string("aaaaaaaaaaa%c", char('a' + i % 26));
r->hits.push_back(GlobalId(s.c_str()));
}
}
return r;
}
-void
-Test::requireThatGetDocsumsExecute()
-{
+TEST("requireThatGetDocsumsExecute") {
int numSummaryThreads = 2;
SummaryEngine engine(numSummaryThreads);
ISearchHandler::SP handler(new MySearchHandler);
@@ -163,9 +148,7 @@ Test::requireThatGetDocsumsExecute()
}
}
-void
-Test::requireThatHandlersAreStored()
-{
+TEST("requireThatHandlersAreStored") {
DocTypeName dtnvfoo("foo");
DocTypeName dtnvbar("bar");
int numSummaryThreads = 2;
@@ -190,19 +173,17 @@ Test::requireThatHandlersAreStored()
}
bool
-Test::assertDocsumReply(SummaryEngine & engine, const std::string & searchDocType, const stringref & expReply)
-{
+assertDocsumReply(SummaryEngine &engine, const std::string &searchDocType, const stringref &expReply) {
DocsumRequest::UP request(createRequest());
request->propertiesMap.lookupCreate(search::MapNames::MATCH).add("documentdb.searchdoctype", searchDocType);
MyDocsumClient client;
engine.getDocsums(DocsumRequest::Source(std::move(request)), client);
DocsumReply::UP reply = client.getReply(10000);
- return EXPECT_EQUAL(vespalib::stringref(expReply), vespalib::stringref(reply->docsums[0].data.c_str(), reply->docsums[0].data.size()));
+ return EXPECT_EQUAL(vespalib::stringref(expReply),
+ vespalib::stringref(reply->docsums[0].data.c_str(), reply->docsums[0].data.size()));
}
-void
-Test::requireThatCorrectHandlerIsUsed()
-{
+TEST("requireThatCorrectHandlerIsUsed") {
DocTypeName dtnvfoo("foo");
DocTypeName dtnvbar("bar");
DocTypeName dtnvbaz("baz");
@@ -226,8 +207,7 @@ const char *GID1 = "abcdefghijkl";
const char *GID2 = "bcdefghijklm";
void
-verify(vespalib::stringref exp, const Slime & slime)
-{
+verify(vespalib::stringref exp, const Slime &slime) {
Memory expMemory(exp);
vespalib::Slime expSlime;
size_t used = vespalib::slime::JsonFormat::decode(expMemory, expSlime);
@@ -241,12 +221,14 @@ verify(vespalib::stringref exp, const Slime & slime)
}
Slime
-createSlimeRequestLarger(size_t num)
-{
+createSlimeRequestLarger(size_t num, const vespalib::string & sessionId = vespalib::string()) {
Slime r;
- Cursor & root = r.setObject();
+ Cursor &root = r.setObject();
root.setString("class", "your-summary");
- Cursor & array = root.setArray("gids");
+ if ( ! sessionId.empty()) {
+ root.setString("sessionid", sessionId);
+ }
+ Cursor &array = root.setArray("gids");
for (size_t i(0); i < num; i++) {
array.addData(Memory(GID1, 12));
array.addData(Memory(GID2, 12));
@@ -255,14 +237,11 @@ createSlimeRequestLarger(size_t num)
}
Slime
-createSlimeRequest()
-{
- return createSlimeRequestLarger(1);
+createSlimeRequest(const vespalib::string & sessionId = vespalib::string()) {
+ return createSlimeRequestLarger(1, sessionId);
}
-void
-Test::requireThatSlimeRequestIsConvertedCorrectly()
-{
+TEST("requireThatSlimeRequestIsConvertedCorrectly") {
vespalib::Slime slimeRequest = createSlimeRequest();
TEST_DO(verify("{"
" class: 'your-summary',"
@@ -273,14 +252,34 @@ Test::requireThatSlimeRequestIsConvertedCorrectly()
"}", slimeRequest));
DocsumRequest::UP r = DocsumBySlime::slimeToRequest(slimeRequest.get());
EXPECT_EQUAL("your-summary", r->resultClassName);
+ EXPECT_FALSE(r->propertiesMap.cacheProperties().lookup("query").found());
+ EXPECT_TRUE(r->sessionId.empty());
+ EXPECT_EQUAL(2u, r->hits.size());
+ EXPECT_EQUAL(GlobalId(GID1), r->hits[0].gid);
+ EXPECT_EQUAL(GlobalId(GID2), r->hits[1].gid);
+}
+
+TEST("require that presence of sessionid affect both request.sessionid and enables cache") {
+ vespalib::Slime slimeRequest = createSlimeRequest("1.some.key.7");
+ TEST_DO(verify("{"
+ " class: 'your-summary',"
+ " sessionid: '1.some.key.7',"
+ " gids: ["
+ " '0x6162636465666768696A6B6C',"
+ " '0x62636465666768696A6B6C6D'"
+ " ]"
+ "}", slimeRequest));
+ DocsumRequest::UP r = DocsumBySlime::slimeToRequest(slimeRequest.get());
+ EXPECT_EQUAL("your-summary", r->resultClassName);
+ EXPECT_EQUAL(0, strncmp("1.some.key.7", &r->sessionId[0],r->sessionId.size()));
+ EXPECT_TRUE(r->propertiesMap.cacheProperties().lookup("query").found());
EXPECT_EQUAL(2u, r->hits.size());
EXPECT_EQUAL(GlobalId(GID1), r->hits[0].gid);
EXPECT_EQUAL(GlobalId(GID2), r->hits[1].gid);
}
void
-createSummary(search::RawBuf & buf)
-{
+createSummary(search::RawBuf &buf) {
vespalib::Slime summary;
summary.setObject().setLong("long", 982);
uint32_t magic = search::fs4transport::SLIME_MAGIC_ID;
@@ -289,91 +288,90 @@ createSummary(search::RawBuf & buf)
BinaryFormat::encode(summary, adapter);
}
-class BaseServer
-{
+class BaseServer {
protected:
BaseServer() :
- buf(100)
- {
+ buf(100) {
createSummary(buf);
}
+
protected:
- search::RawBuf buf;
+ search::RawBuf buf;
};
+
class Server : public BaseServer {
public:
Server();
+
~Server();
+
private:
- SummaryEngine engine;
- ISearchHandler::SP handler;
+ SummaryEngine engine;
+ ISearchHandler::SP handler;
public:
- DocsumBySlime docsumBySlime;
- DocsumByRPC docsumByRPC;
+ DocsumBySlime docsumBySlime;
+ DocsumByRPC docsumByRPC;
};
Server::Server()
- : BaseServer(),
- engine(2),
- handler(new MySearchHandler("slime", stringref(buf.GetDrainPos(), buf.GetUsedLen()))),
- docsumBySlime(engine),
- docsumByRPC(docsumBySlime)
-{
+ : BaseServer(),
+ engine(2),
+ handler(new MySearchHandler("slime", stringref(buf.GetDrainPos(), buf.GetUsedLen()))),
+ docsumBySlime(engine),
+ docsumByRPC(docsumBySlime) {
DocTypeName dtnvfoo("foo");
engine.putSearchHandler(dtnvfoo, handler);
}
+
Server::~Server() {}
vespalib::string
-getAnswer(size_t num)
-{
+getAnswer(size_t num) {
vespalib::string s =
- "{"
- " docsums: [";
- for (size_t i(1); i < num*2; i++) {
+ "{"
+ " docsums: [";
+ for (size_t i(1); i < num * 2; i++) {
s +=
- " {"
- " docsum: {"
- " long: 982"
- " }"
- " },";
+ " {"
+ " docsum: {"
+ " long: 982"
+ " }"
+ " },";
}
s +=
- " {"
- " docsum: {"
- " long: 982"
- " }"
- " }"
- " ]";
- s += "}";
+ " {"
+ " docsum: {"
+ " long: 982"
+ " }"
+ " }"
+ " ]";
+ s += "}";
return s;
}
-void
-Test::requireThatSlimeInterfaceWorksFine()
-{
+TEST("requireThatSlimeInterfaceWorksFine") {
Server server;
vespalib::Slime slimeRequest = createSlimeRequest();
vespalib::Slime::UP response = server.docsumBySlime.getDocsums(slimeRequest.get());
TEST_DO(verify("{"
- " docsums: ["
- " {"
- " docsum: {"
- " long: 982"
- " }"
- " },"
- " {"
- " docsum: {"
- " long: 982"
- " }"
- " }"
- " ]"
- "}", *response));
+ " docsums: ["
+ " {"
+ " docsum: {"
+ " long: 982"
+ " }"
+ " },"
+ " {"
+ " docsum: {"
+ " long: 982"
+ " }"
+ " }"
+ " ]"
+ "}", *response));
}
void
-verifyReply(size_t count, document::CompressionConfig::Type encoding, size_t orgSize, size_t compressedSize, FRT_RPCRequest * request)
-{
+verifyReply(size_t count, document::CompressionConfig::Type encoding, size_t orgSize, size_t compressedSize,
+ FRT_RPCRequest *request) {
FRT_Values &ret = *request->GetReturn();
EXPECT_EQUAL(encoding, ret[0]._intval8);
EXPECT_EQUAL(orgSize, ret[1]._intval32);
@@ -392,20 +390,20 @@ verifyReply(size_t count, document::CompressionConfig::Type encoding, size_t org
void
verifyRPC(size_t count,
document::CompressionConfig::Type requestCompression, size_t requestSize, size_t requestBlobSize,
- document::CompressionConfig::Type replyCompression, size_t replySize, size_t replyBlobSize)
-{
+ document::CompressionConfig::Type replyCompression, size_t replySize, size_t replyBlobSize) {
Server server;
vespalib::Slime slimeRequest = createSlimeRequestLarger(count);
- vespalib::SimpleBuffer buf;
+ vespalib::SimpleBuffer buf;
BinaryFormat::encode(slimeRequest, buf);
EXPECT_EQUAL(requestSize, buf.get().size);
CompressionConfig config(requestCompression, 9, 100);
DataBuffer compressed(const_cast<char *>(buf.get().data), buf.get().size);
- CompressionConfig::Type type = compression::compress(config, ConstBufferRef(buf.get().data, buf.get().size), compressed, true);
+ CompressionConfig::Type type = compression::compress(config, ConstBufferRef(buf.get().data, buf.get().size),
+ compressed, true);
EXPECT_EQUAL(type, requestCompression);
- FRT_RPCRequest * request = new FRT_RPCRequest();
+ FRT_RPCRequest *request = new FRT_RPCRequest();
FRT_Values &arg = *request->GetParams();
arg.AddInt8(type);
arg.AddInt32(buf.get().size);
@@ -418,30 +416,12 @@ verifyRPC(size_t count,
request->SubRef();
}
-void
-Test::requireThatRPCInterfaceWorks()
-{
+TEST("requireThatRPCInterfaceWorks") {
verifyRPC(1, document::CompressionConfig::NONE, 55, 55, document::CompressionConfig::NONE, 38, 38);
verifyRPC(100, document::CompressionConfig::NONE, 2631, 2631, document::CompressionConfig::LZ4, 1426, 46);
verifyRPC(100, document::CompressionConfig::LZ4, 2631, 69, document::CompressionConfig::LZ4, 1426, 46);
}
-int
-Test::Main()
-{
- TEST_INIT("summaryengine_test");
-
- requireThatGetDocsumsExecute();
- requireThatHandlersAreStored();
- requireThatCorrectHandlerIsUsed();
- requireThatSlimeRequestIsConvertedCorrectly();
- requireThatSlimeInterfaceWorksFine();
- requireThatRPCInterfaceWorks();
-
- TEST_DONE();
}
-}
-
-TEST_APPHOOK(proton::Test);
-
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/searchcore/src/vespa/searchcore/proton/summaryengine/docsum_by_slime.cpp b/searchcore/src/vespa/searchcore/proton/summaryengine/docsum_by_slime.cpp
index 8dcd1381b20..8ebe097e0aa 100644
--- a/searchcore/src/vespa/searchcore/proton/summaryengine/docsum_by_slime.cpp
+++ b/searchcore/src/vespa/searchcore/proton/summaryengine/docsum_by_slime.cpp
@@ -27,6 +27,7 @@ using document::CompressionConfig;
namespace {
+Memory SESSIONID("sessionid");
Memory SUMMARYCLASS("class");
Memory GIDS("gids");
Memory DOCSUM("docsum");
@@ -62,6 +63,13 @@ DocsumBySlime::slimeToRequest(const Inspector & request)
DocsumRequest::UP docsumRequest(std::make_unique<DocsumRequest>(true));
docsumRequest->resultClassName = request[SUMMARYCLASS].asString().make_string();
+ Memory m = request[SESSIONID].asString();
+ if (m.size > 0) {
+ docsumRequest->sessionId.resize(m.size);
+ memcpy(&docsumRequest->sessionId[0], m.data, m.size);
+ docsumRequest->propertiesMap.cacheProperties().add("query", "true");
+ }
+
Inspector & gids = request[GIDS];
docsumRequest->hits.reserve(gids.entries());
GidTraverser gidFiller(docsumRequest->hits);