summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-03-13 17:48:44 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2019-03-13 17:48:44 +0000
commitcd7ada2b6fa7afec39b6090b9b0d4f59ccd1419d (patch)
tree66f002b0a0f199e21b930c8547568344c53044b3 /searchlib
parent64b3ff5093cedb87fc3672368a9c28ad4a787d57 (diff)
Make it lazy and safe.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/engine/searchapi/searchapi_test.cpp11
-rw-r--r--searchlib/src/vespa/searchlib/engine/trace.cpp33
-rw-r--r--searchlib/src/vespa/searchlib/engine/trace.h34
3 files changed, 40 insertions, 38 deletions
diff --git a/searchlib/src/tests/engine/searchapi/searchapi_test.cpp b/searchlib/src/tests/engine/searchapi/searchapi_test.cpp
index 28c90dd18ca..ed103bf501c 100644
--- a/searchlib/src/tests/engine/searchapi/searchapi_test.cpp
+++ b/searchlib/src/tests/engine/searchapi/searchapi_test.cpp
@@ -228,21 +228,18 @@ TEST("convertFromReply") {
}
}
-void verify(vespalib::stringref expected, const vespalib::Slime * slime) {
+void verify(vespalib::stringref expected, const vespalib::Slime & slime) {
vespalib::Slime expectedSlime;
vespalib::slime::JsonFormat::decode(expected, expectedSlime);
- if (slime) {
- EXPECT_EQUAL(expectedSlime, *slime);
- } else {
- EXPECT_TRUE(expected.empty());
- }
+ EXPECT_EQUAL(expectedSlime, slime);
}
TEST("verify trace") {
RelativeTime clock(std::make_unique<CountingClock>(fastos::TimeStamp::fromSec(1500000000), 1700000L));
Trace t(clock);
- verify("", t.getSlime());
+ EXPECT_FALSE(t.hasTrace());
t.start(0);
+ EXPECT_TRUE(t.hasTrace());
t.createCursor("tag_a");
verify("{"
" start_time_utc: '2017-07-14 02:40:00.000 UTC',"
diff --git a/searchlib/src/vespa/searchlib/engine/trace.cpp b/searchlib/src/vespa/searchlib/engine/trace.cpp
index c9e3a39daa4..f9564846104 100644
--- a/searchlib/src/vespa/searchlib/engine/trace.cpp
+++ b/searchlib/src/vespa/searchlib/engine/trace.cpp
@@ -11,22 +11,14 @@ RelativeTime::RelativeTime(std::unique_ptr<Clock> clock)
{}
void
-Trace::constructObject() {
+Trace::constructObject() const {
_trace = std::make_unique<vespalib::Slime>();
_root = & _trace->setObject();
}
void
-Trace::constructTraces() {
- _traces = &_root->setArray("traces");
-}
-
-void
-Trace::lazyConstruct(uint32_t level) {
- if (shouldTrace(level) && !_trace) {
- constructObject();
- constructTraces();
- }
+Trace::constructTraces() const {
+ _traces = & root().setArray("traces");
}
Trace::Trace(const RelativeTime & relativeTime, uint32_t level)
@@ -40,10 +32,8 @@ Trace::Trace(const RelativeTime & relativeTime, uint32_t level)
void
Trace::start(int level) {
- if (shouldTrace(level) && !_trace) {
- constructObject();
- _root->setString("start_time_utc", _relativeTime.timeOfDawn().toString());
- constructTraces();
+ if (shouldTrace(level) && !hasTrace()) {
+ root().setString("start_time_utc", _relativeTime.timeOfDawn().toString());
}
}
@@ -51,8 +41,7 @@ Trace::~Trace() = default;
Trace::Cursor &
Trace::createCursor(vespalib::stringref name) {
- lazyConstruct(_level);
- Cursor & trace = _traces->addObject();
+ Cursor & trace = traces().addObject();
addTimeStamp(trace);
trace.setString("tag", name);
return trace;
@@ -60,7 +49,6 @@ Trace::createCursor(vespalib::stringref name) {
Trace::Cursor *
Trace::maybeCreateCursor(uint32_t level, vespalib::stringref name) {
- lazyConstruct(level);
return shouldTrace(level) ? & createCursor(name) : nullptr;
}
@@ -68,8 +56,7 @@ void
Trace::addEvent(uint32_t level, vespalib::stringref event) {
if (!shouldTrace(level)) { return; }
- lazyConstruct(level);
- Cursor & trace = _traces->addObject();
+ Cursor & trace = traces().addObject();
addTimeStamp(trace);
trace.setString("event", event);
}
@@ -80,14 +67,14 @@ Trace::addTimeStamp(Cursor & trace) {
}
void Trace::done() {
- if (!_root) { return; }
+ if (!hasTrace()) { return; }
- _root->setDouble("duration_ms", _relativeTime.timeSinceDawn()/1000000.0);
+ root().setDouble("duration_ms", _relativeTime.timeSinceDawn()/1000000.0);
}
vespalib::string
Trace::toString() const {
- return _trace ? _trace->toString() : "";
+ return hasTrace() ? slime().toString() : "";
}
}
diff --git a/searchlib/src/vespa/searchlib/engine/trace.h b/searchlib/src/vespa/searchlib/engine/trace.h
index 78832733f71..e5fea4f2b7f 100644
--- a/searchlib/src/vespa/searchlib/engine/trace.h
+++ b/searchlib/src/vespa/searchlib/engine/trace.h
@@ -82,20 +82,38 @@ public:
void done();
vespalib::string toString() const;
- Cursor * getRoot() const { return _root; }
- vespalib::Slime * getSlime() const { return _trace.get(); }
+ bool hasTrace() const { return static_cast<bool>(_trace); }
+ Cursor & getRoot() const { return root(); }
+ vespalib::Slime & getSlime() const { return slime(); }
bool shouldTrace(uint32_t level) const { return level <= _level; }
uint32_t getLevel() const { return _level; }
Trace & setLevel(uint32_t level) { _level = level; return *this; }
const RelativeTime & getRelativeTime() const { return _relativeTime; }
private:
- void constructObject();
- void constructTraces();
- void lazyConstruct(uint32_t level);
+ vespalib::Slime & slime() const {
+ if (!hasTrace()) {
+ constructObject();
+ }
+ return *_trace;
+ }
+ Cursor & root() const {
+ if (!hasTrace()) {
+ constructObject();
+ }
+ return *_root;
+ }
+ Cursor & traces() const {
+ if (!_traces) {
+ constructTraces();
+ }
+ return *_traces;
+ }
+ void constructObject() const;
+ void constructTraces() const;
void addTimeStamp(Cursor & trace);
- std::unique_ptr<vespalib::Slime> _trace;
- Cursor * _root;
- Cursor * _traces;
+ mutable std::unique_ptr<vespalib::Slime> _trace;
+ mutable Cursor * _root;
+ mutable Cursor * _traces;
const RelativeTime & _relativeTime;
uint32_t _level;
};