From dc88496506f5c55a447a8e6b43f97f3127a08dc0 Mon Sep 17 00:00:00 2001 From: Geir Storli Date: Mon, 4 Dec 2017 19:46:38 +0000 Subject: Track max session run time per Domain and return it as part of DomainInfo. --- .../tests/transactionlog/translogclient_test.cpp | 23 ++++++++++++++++------ .../src/vespa/searchlib/transactionlog/domain.cpp | 12 ++++++++++- .../src/vespa/searchlib/transactionlog/domain.h | 12 ++++++++--- .../src/vespa/searchlib/transactionlog/session.cpp | 4 +++- .../src/vespa/searchlib/transactionlog/session.h | 7 ++++++- 5 files changed, 46 insertions(+), 12 deletions(-) (limited to 'searchlib') diff --git a/searchlib/src/tests/transactionlog/translogclient_test.cpp b/searchlib/src/tests/transactionlog/translogclient_test.cpp index 9f83db9b23a..861023b79b7 100644 --- a/searchlib/src/tests/transactionlog/translogclient_test.cpp +++ b/searchlib/src/tests/transactionlog/translogclient_test.cpp @@ -43,12 +43,12 @@ private: void checkFilledDomainTest(const TransLogClient::Session::UP &s1, size_t numEntries); bool visitDomainTest(TransLogClient & tls, TransLogClient::Session * s1, const vespalib::string & name); bool partialUpdateTest(); - bool test1(); + bool testVisitOverGeneratedDomain(); bool testRemove(); void createAndFillDomain(const vespalib::string & name, DomainPart::Crc crcMethod, size_t preExistingDomains); void verifyDomain(const vespalib::string & name); void testCrcVersions(); - bool test2(); + bool testVisitOverPreExistingDomain(); void testMany(); void testErase(); void testSync(); @@ -480,7 +480,13 @@ bool Test::visitDomainTest(TransLogClient & tls, TransLogClient::Session * s1, c return retval; } -bool Test::test1() +double +getMaxSessionRunTime(TransLogServer &tls, const vespalib::string &domain) +{ + return tls.getDomainStats()[domain].maxSessionRunTime.count(); +} + +bool Test::testVisitOverGeneratedDomain() { DummyFileHeaderContext fileHeaderContext; TransLogServer tlss("test7", 18377, ".", fileHeaderContext, 0x10000); @@ -490,7 +496,11 @@ bool Test::test1() createDomainTest(tls, name); TransLogClient::Session::UP s1 = openDomainTest(tls, name); fillDomainTest(s1.get(), name); + EXPECT_EQUAL(0, getMaxSessionRunTime(tlss, "test1")); visitDomainTest(tls, s1.get(), name); + double maxSessionRunTime = getMaxSessionRunTime(tlss, "test1"); + LOG(info, "testVisitOverGeneratedDomain(): maxSessionRunTime=%f", maxSessionRunTime); + EXPECT_GREATER(maxSessionRunTime, 0); return true; } @@ -539,8 +549,9 @@ bool Test::testRemove() return true; } -bool Test::test2() +bool Test::testVisitOverPreExistingDomain() { + // Depends on Test::testVisitOverGeneratedDomain() DummyFileHeaderContext fileHeaderContext; TransLogServer tlss("test7", 18377, ".", fileHeaderContext, 0x10000); TransLogClient tls("tcp/localhost:18377"); @@ -868,8 +879,8 @@ int Test::Main() if (_argc > 0) { DummyFileHeaderContext::setCreator(_argv[0]); } - test1(); - test2(); + testVisitOverGeneratedDomain(); + testVisitOverPreExistingDomain(); testMany(); testErase(); partialUpdateTest(); diff --git a/searchlib/src/vespa/searchlib/transactionlog/domain.cpp b/searchlib/src/vespa/searchlib/transactionlog/domain.cpp index 74ca3e6527d..03785258f28 100644 --- a/searchlib/src/vespa/searchlib/transactionlog/domain.cpp +++ b/searchlib/src/vespa/searchlib/transactionlog/domain.cpp @@ -36,6 +36,7 @@ Domain::Domain(const string &domainName, const string & baseDir, Executor & comm _lock(), _sessionLock(), _sessions(), + _maxSessionRunTime(), _baseDir(baseDir), _fileHeaderContext(fileHeaderContext), _markedDeleted(false) @@ -105,7 +106,7 @@ DomainInfo Domain::getDomainInfo() const { LockGuard guard(_lock); - DomainInfo info(SerialNumRange(begin(guard), end(guard)), size(guard), byteSize(guard)); + DomainInfo info(SerialNumRange(begin(guard), end(guard)), size(guard), byteSize(guard), _maxSessionRunTime); for (const auto &entry: _parts) { const DomainPart &part = *entry.second; info.parts.emplace_back(PartInfo(part.range(), part.size(), part.byteSize(), part.fileName())); @@ -332,6 +333,7 @@ int Domain::startSession(int sessionId) LockGuard guard(_sessionLock); SessionList::iterator found = _sessions.find(sessionId); if (found != _sessions.end()) { + found->second->setStartTime(std::chrono::steady_clock::now()); if ( execute(Session::createTask(found->second)).get() == nullptr ) { retval = 0; } else { @@ -345,10 +347,12 @@ int Domain::closeSession(int sessionId) { _commitExecutor.sync(); int retval(-1); + DurationSeconds sessionRunTime(0); { LockGuard guard(_sessionLock); SessionList::iterator found = _sessions.find(sessionId); if (found != _sessions.end()) { + sessionRunTime = (std::chrono::steady_clock::now() - found->second->getStartTime()); retval = 1; _sessionExecutor.sync(); } @@ -364,6 +368,12 @@ int Domain::closeSession(int sessionId) retval = 0; } } + { + LockGuard guard(_lock); + if (sessionRunTime > _maxSessionRunTime) { + _maxSessionRunTime = sessionRunTime; + } + } return retval; } diff --git a/searchlib/src/vespa/searchlib/transactionlog/domain.h b/searchlib/src/vespa/searchlib/transactionlog/domain.h index ab7ded91e5b..c1ff9157a6f 100644 --- a/searchlib/src/vespa/searchlib/transactionlog/domain.h +++ b/searchlib/src/vespa/searchlib/transactionlog/domain.h @@ -4,6 +4,7 @@ #include "domainpart.h" #include "session.h" #include +#include namespace search::transactionlog { @@ -20,14 +21,16 @@ struct PartInfo { }; struct DomainInfo { + using DurationSeconds = std::chrono::duration; SerialNumRange range; size_t numEntries; size_t byteSize; + DurationSeconds maxSessionRunTime; std::vector parts; - DomainInfo(SerialNumRange range_in, size_t numEntries_in, size_t byteSize_in) - : range(range_in), numEntries(numEntries_in), byteSize(byteSize_in), parts() {} + DomainInfo(SerialNumRange range_in, size_t numEntries_in, size_t byteSize_in, DurationSeconds maxSessionRunTime_in) + : range(range_in), numEntries(numEntries_in), byteSize(byteSize_in), maxSessionRunTime(maxSessionRunTime_in), parts() {} DomainInfo() - : range(), numEntries(0), byteSize(0), parts() {} + : range(), numEntries(0), byteSize(0), maxSessionRunTime(), parts() {} }; typedef std::map DomainStats; @@ -74,6 +77,7 @@ public: return _sessionExecutor.execute(std::move(task)); } uint64_t size() const; + private: SerialNum begin(const vespalib::LockGuard & guard) const; SerialNum end(const vespalib::LockGuard & guard) const; @@ -89,6 +93,7 @@ private: using SessionList = std::map; using DomainPartList = std::map; + using DurationSeconds = std::chrono::duration; DomainPart::Crc _defaultCrcType; Executor & _commitExecutor; @@ -102,6 +107,7 @@ private: vespalib::Lock _lock; vespalib::Lock _sessionLock; SessionList _sessions; + DurationSeconds _maxSessionRunTime; vespalib::string _baseDir; const common::FileHeaderContext &_fileHeaderContext; bool _markedDeleted; diff --git a/searchlib/src/vespa/searchlib/transactionlog/session.cpp b/searchlib/src/vespa/searchlib/transactionlog/session.cpp index 3ea656be9a2..6f0ab998e26 100644 --- a/searchlib/src/vespa/searchlib/transactionlog/session.cpp +++ b/searchlib/src/vespa/searchlib/transactionlog/session.cpp @@ -197,7 +197,9 @@ Session::Session(int sId, const SerialNumRange & r, const Domain::SP & d, _inSync(false), _ok(true), _finished(false), - _packetQ() + _packetQ(), + _startTime(), + _lock() { _connection->AddRef(); } diff --git a/searchlib/src/vespa/searchlib/transactionlog/session.h b/searchlib/src/vespa/searchlib/transactionlog/session.h index ac6f496e151..c42d6839dfa 100644 --- a/searchlib/src/vespa/searchlib/transactionlog/session.h +++ b/searchlib/src/vespa/searchlib/transactionlog/session.h @@ -5,6 +5,7 @@ #include #include #include +#include #include class FastOS_FileInterface; @@ -18,7 +19,8 @@ using DomainSP = std::shared_ptr; class Session : public FRT_IRequestWait { private: - typedef vespalib::Executor::Task Task; + using Task = vespalib::Executor::Task; + using time_point = std::chrono::time_point; public: typedef std::shared_ptr SP; @@ -33,6 +35,8 @@ public: bool finished() const; static void enQ(const SP & session, SerialNum serial, const Packet & packet); static Task::UP createTask(const Session::SP & session); + void setStartTime(time_point startTime) { _startTime = startTime; } + time_point getStartTime() const { return _startTime; } private: struct QPacket { QPacket() : _serial(0), _packet() {} @@ -79,6 +83,7 @@ private: bool _ok; bool _finished; std::deque _packetQ; + time_point _startTime; vespalib::Lock _lock; }; -- cgit v1.2.3