summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorGeir Storli <geirst@oath.com>2017-12-04 19:46:38 +0000
committerGeir Storli <geirst@oath.com>2017-12-04 19:46:38 +0000
commitdc88496506f5c55a447a8e6b43f97f3127a08dc0 (patch)
tree22f808009631b31873b8d6fb1c0827259a381dfd /searchlib
parenta2a5fb339055f3db60966d782481e84efd61fb86 (diff)
Track max session run time per Domain and return it as part of DomainInfo.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/transactionlog/translogclient_test.cpp23
-rw-r--r--searchlib/src/vespa/searchlib/transactionlog/domain.cpp12
-rw-r--r--searchlib/src/vespa/searchlib/transactionlog/domain.h12
-rw-r--r--searchlib/src/vespa/searchlib/transactionlog/session.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/transactionlog/session.h7
5 files changed, 46 insertions, 12 deletions
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 <vespa/vespalib/util/threadexecutor.h>
+#include <chrono>
namespace search::transactionlog {
@@ -20,14 +21,16 @@ struct PartInfo {
};
struct DomainInfo {
+ using DurationSeconds = std::chrono::duration<double>;
SerialNumRange range;
size_t numEntries;
size_t byteSize;
+ DurationSeconds maxSessionRunTime;
std::vector<PartInfo> 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<vespalib::string, DomainInfo> 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<int, Session::SP>;
using DomainPartList = std::map<int64_t, DomainPart::SP>;
+ using DurationSeconds = std::chrono::duration<double>;
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 <vespa/vespalib/util/executor.h>
#include <vespa/vespalib/util/sync.h>
#include <vespa/fnet/frt/invoker.h>
+#include <chrono>
#include <deque>
class FastOS_FileInterface;
@@ -18,7 +19,8 @@ using DomainSP = std::shared_ptr<Domain>;
class Session : public FRT_IRequestWait
{
private:
- typedef vespalib::Executor::Task Task;
+ using Task = vespalib::Executor::Task;
+ using time_point = std::chrono::time_point<std::chrono::steady_clock>;
public:
typedef std::shared_ptr<Session> 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<QPacket> _packetQ;
+ time_point _startTime;
vespalib::Lock _lock;
};