diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-11-18 10:27:35 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-18 10:27:35 +0100 |
commit | bb05fcc76b886f2e9ba3647bcce49e8848d03413 (patch) | |
tree | c687a25fb00c5f28afb18c9e60df6acc66694c97 /searchlib | |
parent | 0828316dba213aac3d7aca95dcb3e37d68519a4d (diff) | |
parent | 33c54bf254601d96945e0f04dbf34a968f8b3798 (diff) |
Merge pull request #11307 from vespa-engine/balder/use-steady-clock
Use steady clock to ensure monotonically increasing clock.
Diffstat (limited to 'searchlib')
14 files changed, 68 insertions, 68 deletions
diff --git a/searchlib/src/tests/groupingengine/groupingengine_benchmark.cpp b/searchlib/src/tests/groupingengine/groupingengine_benchmark.cpp index 37aa9cc3268..8f22ab87c97 100644 --- a/searchlib/src/tests/groupingengine/groupingengine_benchmark.cpp +++ b/searchlib/src/tests/groupingengine/groupingengine_benchmark.cpp @@ -131,7 +131,7 @@ public: AggregationContext::AggregationContext() : _attrMan(), _result(), _attrCtx(_attrMan.createContext()) {} -AggregationContext::~AggregationContext() {} +AggregationContext::~AggregationContext() = default; //----------------------------------------------------------------------------- class Test : public TestApp @@ -277,7 +277,7 @@ Test::Main() LOG(info, "sizeof(CountAggregationResult) = %ld", sizeof(CountAggregationResult)); LOG(info, "sizeof(Int64ResultNode) = %ld", sizeof(Int64ResultNode)); - fastos::TimeStamp start(fastos::ClockSystem::now()); + fastos::SteadyTimeStamp start(fastos::ClockSteady::now()); if (idType == "int") { if (aggrType == "sum") { benchmarkIntegerSum(useEngine, numDocs, numQueries, maxGroups); diff --git a/searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp b/searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp index f5ce8a9608b..bf1b5352778 100644 --- a/searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp +++ b/searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp @@ -170,7 +170,7 @@ public: }; PhraseSearchTest::PhraseSearchTest(bool expiredDoom) - : _requestContext(nullptr, expiredDoom ? 0 : std::numeric_limits<int64_t>::max()), + : _requestContext(nullptr, expiredDoom ? fastos::SteadyTimeStamp::ZERO : fastos::SteadyTimeStamp::FUTURE), _index(), _phrase_fs(field, fieldId, phrase_handle), _phrase(_phrase_fs, _requestContext, false), @@ -199,7 +199,7 @@ void Test::requireThatIteratorHonorsFutureDoom() { test.fetchPostings(false); vespalib::Clock clock; - vespalib::Doom futureDoom(clock, std::numeric_limits<int64_t>::max()); + vespalib::Doom futureDoom(clock, fastos::SteadyTimeStamp::FUTURE); unique_ptr<SearchIterator> search(test.createSearch(false)); static_cast<SimplePhraseSearch &>(*search).setDoom(&futureDoom); EXPECT_TRUE(!search->seek(1u)); @@ -213,7 +213,7 @@ void Test::requireThatIteratorHonorsDoom() { test.fetchPostings(false); vespalib::Clock clock; - vespalib::Doom futureDoom(clock, 0); + vespalib::Doom futureDoom(clock, fastos::SteadyTimeStamp::ZERO); unique_ptr<SearchIterator> search(test.createSearch(false)); static_cast<SimplePhraseSearch &>(*search).setDoom(&futureDoom); EXPECT_TRUE(!search->seek(1u)); diff --git a/searchlib/src/tests/sortspec/multilevelsort.cpp b/searchlib/src/tests/sortspec/multilevelsort.cpp index 84f67a041b0..65c4cd7da95 100644 --- a/searchlib/src/tests/sortspec/multilevelsort.cpp +++ b/searchlib/src/tests/sortspec/multilevelsort.cpp @@ -241,7 +241,7 @@ MultilevelSortTest::sortAndCheck(const std::vector<Spec> &spec, uint32_t num, } vespalib::Clock clock; - vespalib::Doom doom(clock, std::numeric_limits<fastos::TimeStamp::TimeT>::max()); + vespalib::Doom doom(clock, fastos::SteadyTimeStamp::FUTURE); search::uca::UcaConverterFactory ucaFactory; FastS_SortSpec sorter(7, doom, ucaFactory, _sortMethod); // init sorter with sort data @@ -399,7 +399,7 @@ TEST("require that all sort methods behave the same") TEST("test that [docid] translates to [lid][paritionid]") { vespalib::Clock clock; - vespalib::Doom doom(clock, fastos::ClockSystem::now() + fastos::TimeStamp::SEC*10); + vespalib::Doom doom(clock, fastos::SteadyTimeStamp::FUTURE); search::uca::UcaConverterFactory ucaFactory; FastS_SortSpec asc(7, doom, ucaFactory); RankedHit hits[2] = {RankedHit(91, 0.0), RankedHit(3, 2.0)}; diff --git a/searchlib/src/vespa/searchlib/aggregation/grouping.h b/searchlib/src/vespa/searchlib/aggregation/grouping.h index 1d71eb0c0aa..4230bd777d6 100644 --- a/searchlib/src/vespa/searchlib/aggregation/grouping.h +++ b/searchlib/src/vespa/searchlib/aggregation/grouping.h @@ -6,11 +6,11 @@ #include <vespa/vespalib/util/clock.h> namespace search { + class BitVector; + struct IDocumentMetaStore; +} -class BitVector; -struct IDocumentMetaStore; - -namespace aggregation { +namespace search::aggregation { /** * This class represents a top-level grouping request. @@ -22,18 +22,18 @@ public: typedef std::unique_ptr<Grouping> UP; private: - uint32_t _id; // client id for this grouping - bool _valid; // is this grouping object valid? - bool _all; // if true, group all document, not just hits (streaming only) - int64_t _topN; // hits to process per search node - uint32_t _firstLevel; // first processing level this iteration (levels before considered frozen) - uint32_t _lastLevel; // last processing level this iteration - GroupingLevelList _levels; // grouping parameters per level - Group _root; // the grouping tree - const vespalib::Clock *_clock; // An optional clock to be used for timeout handling. - fastos::TimeStamp _timeOfDoom; // Used if clock is specified. This is time when request expires. + uint32_t _id; // client id for this grouping + bool _valid; // is this grouping object valid? + bool _all; // if true, group all document, not just hits (streaming only) + int64_t _topN; // hits to process per search node + uint32_t _firstLevel; // first processing level this iteration (levels before considered frozen) + uint32_t _lastLevel; // last processing level this iteration + GroupingLevelList _levels; // grouping parameters per level + Group _root; // the grouping tree + const vespalib::Clock *_clock; // An optional clock to be used for timeout handling. + fastos::SteadyTimeStamp _timeOfDoom; // Used if clock is specified. This is time when request expires. - bool hasExpired() const { return _clock->getTimeNS() >= _timeOfDoom; } + bool hasExpired() const { return _clock->getTimeNS() > _timeOfDoom; } void aggregateWithoutClock(const RankedHit * rankedHit, unsigned int len); void aggregateWithClock(const RankedHit * rankedHit, unsigned int len); void postProcess(); @@ -46,7 +46,7 @@ public: Grouping & operator = (const Grouping &); Grouping(Grouping &&) = default; Grouping & operator = (Grouping &&) = default; - ~Grouping(); + ~Grouping() override; Grouping unchain() const { return *this; } @@ -59,7 +59,7 @@ public: Grouping &addLevel(GroupingLevel && level) { _levels.push_back(std::move(level)); return *this; } Grouping &setRoot(const Group &root_) { _root = root_; return *this; } Grouping &setClock(const vespalib::Clock * clock) { _clock = clock; return *this; } - Grouping &setTimeOfDoom(fastos::TimeStamp timeOfDoom) { _timeOfDoom = timeOfDoom; return *this; } + Grouping &setTimeOfDoom(fastos::SteadyTimeStamp timeOfDoom) { _timeOfDoom = timeOfDoom; return *this; } unsigned int getId() const { return _id; } bool valid() const { return _valid; } @@ -97,4 +97,3 @@ public: }; } -} diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.cpp b/searchlib/src/vespa/searchlib/attribute/attributevector.cpp index 833d831466b..00f45575d17 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributevector.cpp +++ b/searchlib/src/vespa/searchlib/attribute/attributevector.cpp @@ -136,9 +136,9 @@ AttributeVector::~AttributeVector() = default; void AttributeVector::updateStat(bool force) { if (force) { onUpdateStat(); - } else if (_nextStatUpdateTime < fastos::ClockSystem::now()) { + } else if (_nextStatUpdateTime < fastos::ClockSteady::now()) { onUpdateStat(); - _nextStatUpdateTime = fastos::ClockSystem::now() + 5ul * fastos::TimeStamp::SEC; + _nextStatUpdateTime = fastos::ClockSteady::now() + fastos::TimeStamp(5ul * fastos::TimeStamp::SEC); } } diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.h b/searchlib/src/vespa/searchlib/attribute/attributevector.h index 286f4cfc36c..99fd5a88e48 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributevector.h +++ b/searchlib/src/vespa/searchlib/attribute/attributevector.h @@ -572,22 +572,22 @@ private: LoadedBufferUP loadFile(const char *suffix); - BaseName _baseFileName; - Config _config; + BaseName _baseFileName; + Config _config; std::shared_ptr<attribute::Interlock> _interlock; - mutable std::shared_timed_mutex _enumLock; - GenerationHandler _genHandler; - GenerationHolder _genHolder; - Status _status; - int _highestValueCount; - uint32_t _enumMax; - uint32_t _committedDocIdLimit; // docid limit for search - uint32_t _uncommittedDocIdLimit; // based on queued changes - uint64_t _createSerialNum; - uint64_t _compactLidSpaceGeneration; - bool _hasEnum; - bool _loaded; - fastos::TimeStamp _nextStatUpdateTime; + mutable std::shared_timed_mutex _enumLock; + GenerationHandler _genHandler; + GenerationHolder _genHolder; + Status _status; + int _highestValueCount; + uint32_t _enumMax; + uint32_t _committedDocIdLimit; // docid limit for search + uint32_t _uncommittedDocIdLimit; // based on queued changes + uint64_t _createSerialNum; + uint64_t _compactLidSpaceGeneration; + bool _hasEnum; + bool _loaded; + fastos::SteadyTimeStamp _nextStatUpdateTime; ////// Locking strategy interface. only available from the Guards. /** diff --git a/searchlib/src/vespa/searchlib/engine/docsumrequest.cpp b/searchlib/src/vespa/searchlib/engine/docsumrequest.cpp index 33a2c437a80..0fc258363e5 100644 --- a/searchlib/src/vespa/searchlib/engine/docsumrequest.cpp +++ b/searchlib/src/vespa/searchlib/engine/docsumrequest.cpp @@ -9,7 +9,7 @@ DocsumRequest::DocsumRequest() {} DocsumRequest::DocsumRequest(bool useRootSlime_) - : DocsumRequest(RelativeTime(std::make_unique<FastosClock>()), useRootSlime_) + : DocsumRequest(RelativeTime(std::make_unique<SteadyClock>()), useRootSlime_) {} DocsumRequest::DocsumRequest(RelativeTime relativeTime, bool useRootSlime_) diff --git a/searchlib/src/vespa/searchlib/engine/proto_rpc_adapter.cpp b/searchlib/src/vespa/searchlib/engine/proto_rpc_adapter.cpp index 46f3ae0b4c7..4fa7079fe46 100644 --- a/searchlib/src/vespa/searchlib/engine/proto_rpc_adapter.cpp +++ b/searchlib/src/vespa/searchlib/engine/proto_rpc_adapter.cpp @@ -84,7 +84,7 @@ struct SearchRequestDecoder : SearchRequest::Source::Decoder { QueryStats &stats; RelativeTime relative_time; SearchRequestDecoder(FRT_RPCRequest &rpc_in, QueryStats &stats_in) - : rpc(rpc_in), stats(stats_in), relative_time(std::make_unique<FastosClock>()) {} + : rpc(rpc_in), stats(stats_in), relative_time(std::make_unique<SteadyClock>()) {} std::unique_ptr<SearchRequest> decode() override { ProtoSearchRequest msg; stats.request_size = (*rpc.GetParams())[2]._data._len; @@ -129,7 +129,7 @@ struct DocsumRequestDecoder : DocsumRequest::Source::Decoder { DocsumStats &stats; RelativeTime relative_time; DocsumRequestDecoder(FRT_RPCRequest &rpc_in, DocsumStats &stats_in) - : rpc(rpc_in), stats(stats_in), relative_time(std::make_unique<FastosClock>()) {} + : rpc(rpc_in), stats(stats_in), relative_time(std::make_unique<SteadyClock>()) {} std::unique_ptr<DocsumRequest> decode() override { ProtoDocsumRequest msg; stats.request_size = (*rpc.GetParams())[2]._data._len; diff --git a/searchlib/src/vespa/searchlib/engine/request.h b/searchlib/src/vespa/searchlib/engine/request.h index a021ec6bfaa..4f4bf526920 100644 --- a/searchlib/src/vespa/searchlib/engine/request.h +++ b/searchlib/src/vespa/searchlib/engine/request.h @@ -16,8 +16,8 @@ public: Request & operator =(const Request &) = delete; virtual ~Request(); void setTimeout(const fastos::TimeStamp & timeout); - fastos::TimeStamp getStartTime() const { return _relativeTime.timeOfDawn(); } - fastos::TimeStamp getTimeOfDoom() const { return _timeOfDoom; } + fastos::SteadyTimeStamp getStartTime() const { return _relativeTime.timeOfDawn(); } + fastos::SteadyTimeStamp getTimeOfDoom() const { return _timeOfDoom; } fastos::TimeStamp getTimeout() const { return _timeOfDoom - getStartTime(); } fastos::TimeStamp getTimeUsed() const; fastos::TimeStamp getTimeLeft() const; @@ -37,8 +37,8 @@ public: Trace & trace() const { return _trace; } private: - RelativeTime _relativeTime; - fastos::TimeStamp _timeOfDoom; + RelativeTime _relativeTime; + fastos::SteadyTimeStamp _timeOfDoom; public: /// Everything here should move up to private section and have accessors bool dumpFeatures; diff --git a/searchlib/src/vespa/searchlib/engine/searchrequest.cpp b/searchlib/src/vespa/searchlib/engine/searchrequest.cpp index 9ca89a8636f..b9f3e62afd7 100644 --- a/searchlib/src/vespa/searchlib/engine/searchrequest.cpp +++ b/searchlib/src/vespa/searchlib/engine/searchrequest.cpp @@ -5,7 +5,7 @@ namespace search::engine { SearchRequest::SearchRequest() - : SearchRequest(RelativeTime(std::make_unique<FastosClock>())) {} + : SearchRequest(RelativeTime(std::make_unique<SteadyClock>())) {} SearchRequest::SearchRequest(RelativeTime relativeTime) : Request(std::move(relativeTime)), diff --git a/searchlib/src/vespa/searchlib/engine/trace.cpp b/searchlib/src/vespa/searchlib/engine/trace.cpp index f9564846104..ae0c6810ca1 100644 --- a/searchlib/src/vespa/searchlib/engine/trace.cpp +++ b/searchlib/src/vespa/searchlib/engine/trace.cpp @@ -5,6 +5,11 @@ namespace search::engine { +fastos::SteadyTimeStamp +SteadyClock::now() const { + return fastos::ClockSteady::now(); +} + RelativeTime::RelativeTime(std::unique_ptr<Clock> clock) : _start(clock->now()), _clock(std::move(clock)) @@ -33,7 +38,7 @@ Trace::Trace(const RelativeTime & relativeTime, uint32_t level) void Trace::start(int level) { if (shouldTrace(level) && !hasTrace()) { - root().setString("start_time_utc", _relativeTime.timeOfDawn().toString()); + root().setString("start_time_relative", _relativeTime.timeOfDawn().toString()); } } diff --git a/searchlib/src/vespa/searchlib/engine/trace.h b/searchlib/src/vespa/searchlib/engine/trace.h index 518485f8775..0d7dc2982f1 100644 --- a/searchlib/src/vespa/searchlib/engine/trace.h +++ b/searchlib/src/vespa/searchlib/engine/trace.h @@ -13,21 +13,21 @@ namespace search::engine { class Clock { public: virtual ~Clock() = default; - virtual fastos::TimeStamp now() const = 0; + virtual fastos::SteadyTimeStamp now() const = 0; }; -class FastosClock : public Clock { +class SteadyClock : public Clock { public: - fastos::TimeStamp now() const override { return fastos::ClockSystem::now(); } + fastos::SteadyTimeStamp now() const override; }; class CountingClock : public Clock { public: CountingClock(int64_t start, int64_t increment) : _increment(increment), _nextTime(start) { } - fastos::TimeStamp now() const override { + fastos::SteadyTimeStamp now() const override { int64_t prev = _nextTime; _nextTime += _increment; - return prev; + return fastos::SteadyTimeStamp(prev); } private: const int64_t _increment; @@ -37,12 +37,12 @@ private: class RelativeTime { public: RelativeTime(std::unique_ptr<Clock> clock); - fastos::TimeStamp timeOfDawn() const { return _start; } + fastos::SteadyTimeStamp timeOfDawn() const { return _start; } fastos::TimeStamp timeSinceDawn() const { return _clock->now() - _start; } - fastos::TimeStamp now() const { return _clock->now(); } + fastos::SteadyTimeStamp now() const { return _clock->now(); } private: - fastos::TimeStamp _start; - std::unique_ptr<Clock> _clock; + fastos::SteadyTimeStamp _start; + std::unique_ptr<Clock> _clock; }; /** diff --git a/searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.cpp b/searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.cpp index 456d1919430..7d82fa706ca 100644 --- a/searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.cpp @@ -2,14 +2,12 @@ #include <vespa/searchlib/queryeval/fake_requestcontext.h> -namespace search { -namespace queryeval { +namespace search::queryeval { -FakeRequestContext::FakeRequestContext(attribute::IAttributeContext * context, fastos::TimeStamp doom_in) : +FakeRequestContext::FakeRequestContext(attribute::IAttributeContext * context, fastos::SteadyTimeStamp doom_in) : _clock(), _doom(_clock, doom_in), _attributeContext(context) { } } -} diff --git a/searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.h b/searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.h index d31cc9a7f9d..fefa7f5b6ff 100644 --- a/searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.h +++ b/searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.h @@ -7,13 +7,12 @@ #include <vespa/searchlib/attribute/attributevector.h> #include <limits> -namespace search { -namespace queryeval { +namespace search::queryeval { class FakeRequestContext : public IRequestContext { public: - FakeRequestContext(attribute::IAttributeContext * context = nullptr, fastos::TimeStamp doom=std::numeric_limits<int64_t>::max()); + FakeRequestContext(attribute::IAttributeContext * context = nullptr, fastos::SteadyTimeStamp doom=fastos::SteadyTimeStamp(fastos::TimeStamp::FUTURE)); const vespalib::Doom & getSoftDoom() const override { return _doom; } const attribute::IAttributeVector *getAttribute(const vespalib::string &name) const override { return _attributeContext @@ -32,4 +31,3 @@ private: }; } -} |