diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-09-15 18:29:54 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-09-15 18:29:54 +0000 |
commit | fbc9f364526587b0f312ef186e619a1f53c00617 (patch) | |
tree | 140d6237d7de933da0b5ea4011742b2276dea58b /searchlib | |
parent | 7ecd25a81bb636174954da2caa8255cc1f7b3515 (diff) |
Avoid a lookup and copying a shared_ptr by looking up and using the domain directly.
Diffstat (limited to 'searchlib')
5 files changed, 21 insertions, 14 deletions
diff --git a/searchlib/src/tests/transactionlog/translogclient_test.cpp b/searchlib/src/tests/transactionlog/translogclient_test.cpp index 3ee5b73102e..80142f705c1 100644 --- a/searchlib/src/tests/transactionlog/translogclient_test.cpp +++ b/searchlib/src/tests/transactionlog/translogclient_test.cpp @@ -322,17 +322,18 @@ fillDomainTest(TransLogServer & s1, const vespalib::string & domain, size_t numP { size_t value(0); Counter inFlight(0); + auto domainWriter = s1.getWriter(domain); for(size_t i=0; i < numPackets; i++) { std::unique_ptr<Packet> p(new Packet(DEFAULT_PACKET_SIZE)); for(size_t j=0; j < numEntries; j++, value++) { Packet::Entry e(value+1, j+1, vespalib::ConstBufferRef((const char *)&value, sizeof(value))); p->add(e); if ( p->sizeBytes() > DEFAULT_PACKET_SIZE ) { - s1.commit(domain, *p, std::make_shared<CountDone>(inFlight)); + domainWriter->commit(*p, std::make_shared<CountDone>(inFlight)); p = std::make_unique<Packet>(DEFAULT_PACKET_SIZE); } } - s1.commit(domain, *p, std::make_shared<CountDone>(inFlight)); + domainWriter->commit(*p, std::make_shared<CountDone>(inFlight)); LOG(info, "Inflight %ld", inFlight.load()); } while (inFlight.load() != 0) { diff --git a/searchlib/src/vespa/searchlib/transactionlog/common.h b/searchlib/src/vespa/searchlib/transactionlog/common.h index 8dba5d448f8..8bfa17cfcfb 100644 --- a/searchlib/src/vespa/searchlib/transactionlog/common.h +++ b/searchlib/src/vespa/searchlib/transactionlog/common.h @@ -85,7 +85,13 @@ class Writer { public: using DoneCallback = std::shared_ptr<IDestructorCallback>; virtual ~Writer() = default; - virtual void commit(const vespalib::string & domainName, const Packet & packet, DoneCallback done) = 0; + virtual void commit(const Packet & packet, DoneCallback done) = 0; +}; + +class WriterFactory { +public: + virtual ~WriterFactory() = default; + virtual std::shared_ptr<Writer> getWriter(const vespalib::string & domainName) const = 0; }; class Destination { diff --git a/searchlib/src/vespa/searchlib/transactionlog/domain.h b/searchlib/src/vespa/searchlib/transactionlog/domain.h index c2cdb6f86b9..9adff564cc8 100644 --- a/searchlib/src/vespa/searchlib/transactionlog/domain.h +++ b/searchlib/src/vespa/searchlib/transactionlog/domain.h @@ -12,7 +12,7 @@ namespace search::transactionlog { class DomainPart; class Session; -class Domain +class Domain : public Writer { public: using SP = std::shared_ptr<Domain>; @@ -21,13 +21,13 @@ public: Domain(const vespalib::string &name, const vespalib::string &baseDir, Executor & executor, const DomainConfig & cfg, const common::FileHeaderContext &fileHeaderContext); - ~Domain(); + ~Domain() override; DomainInfo getDomainInfo() const; const vespalib::string & name() const { return _name; } bool erase(SerialNum to); - void commit(const Packet & packet, Writer::DoneCallback onDone); + void commit(const Packet & packet, Writer::DoneCallback onDone) override; int visit(const Domain::SP & self, SerialNum from, SerialNum to, std::unique_ptr<Destination> dest); SerialNum begin() const; diff --git a/searchlib/src/vespa/searchlib/transactionlog/translogserver.cpp b/searchlib/src/vespa/searchlib/transactionlog/translogserver.cpp index 64e472520a5..fcef06c3f2e 100644 --- a/searchlib/src/vespa/searchlib/transactionlog/translogserver.cpp +++ b/searchlib/src/vespa/searchlib/transactionlog/translogserver.cpp @@ -243,10 +243,10 @@ TransLogServer::getDomainNames() } Domain::SP -TransLogServer::findDomain(stringref domainName) +TransLogServer::findDomain(stringref domainName) const { ReadGuard domainGuard(_domainMutex); - DomainList::iterator found(_domains.find(domainName)); + auto found(_domains.find(domainName)); if (found != _domains.end()) { return found->second; } @@ -556,12 +556,12 @@ TransLogServer::domainStatus(FRT_RPCRequest *req) } } -void -TransLogServer::commit(const vespalib::string & domainName, const Packet & packet, DoneCallback done) +std::shared_ptr<Writer> +TransLogServer::getWriter(const vespalib::string & domainName) const { Domain::SP domain(findDomain(domainName)); if (domain) { - domain->commit(packet, std::move(done)); + return domain; } else { throw IllegalArgumentException("Could not find domain " + domainName); } diff --git a/searchlib/src/vespa/searchlib/transactionlog/translogserver.h b/searchlib/src/vespa/searchlib/transactionlog/translogserver.h index 1c3ed24ecea..77e38c90c9a 100644 --- a/searchlib/src/vespa/searchlib/transactionlog/translogserver.h +++ b/searchlib/src/vespa/searchlib/transactionlog/translogserver.h @@ -18,7 +18,7 @@ namespace search::transactionlog { class TransLogServerExplorer; class Domain; -class TransLogServer : public document::Runnable, private FRT_Invokable, public Writer +class TransLogServer : public document::Runnable, private FRT_Invokable, public WriterFactory { public: friend class TransLogServerExplorer; @@ -33,7 +33,7 @@ public: ~TransLogServer() override; DomainStats getDomainStats() const; bool commitIfStale(); - void commit(const vespalib::string & domainName, const Packet & packet, DoneCallback done) override; + std::shared_ptr<Writer> getWriter(const vespalib::string & domainName) const override; TransLogServer & setDomainConfig(const DomainConfig & cfg); vespalib::duration getChunkAgeLimit() const; @@ -72,7 +72,7 @@ private: void downSession(FRT_RPCRequest *req); std::vector<vespalib::string> getDomainNames(); - DomainSP findDomain(vespalib::stringref name); + DomainSP findDomain(vespalib::stringref name) const; vespalib::string dir() const { return _baseDir + "/" + _name; } vespalib::string domainList() const { return dir() + "/" + _name + ".domains"; } |