diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-03-13 17:48:44 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-03-13 17:48:44 +0000 |
commit | cd7ada2b6fa7afec39b6090b9b0d4f59ccd1419d (patch) | |
tree | 66f002b0a0f199e21b930c8547568344c53044b3 /searchlib | |
parent | 64b3ff5093cedb87fc3672368a9c28ad4a787d57 (diff) |
Make it lazy and safe.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/tests/engine/searchapi/searchapi_test.cpp | 11 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/engine/trace.cpp | 33 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/engine/trace.h | 34 |
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; }; |