diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-08-15 20:20:37 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-08-15 20:20:37 +0200 |
commit | fbd92b4bc20faa0d559490567f735aa3f14ac6f7 (patch) | |
tree | 18b530f23a28e40c0870070000d25894e4809738 /searchcore | |
parent | 141bb9f1c45016a9f4013e98abb1033745d8ff53 (diff) |
Add support for sessionid for using query cache.
Diffstat (limited to 'searchcore')
-rw-r--r-- | searchcore/src/tests/proton/summaryengine/summaryengine.cpp | 256 | ||||
-rw-r--r-- | searchcore/src/vespa/searchcore/proton/summaryengine/docsum_by_slime.cpp | 8 |
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); |