diff options
author | Alexey Borzenkov <snaury@yandex-team.ru> | 2022-03-18 00:56:45 +0300 |
---|---|---|
committer | Alexey Borzenkov <snaury@yandex-team.ru> | 2022-03-18 00:56:45 +0300 |
commit | 2fbdf1c88f149f6e23c2363c649cda6f8ff21c92 (patch) | |
tree | 08a155f1ac2475bc52552a138044722e7a16b23b /library/cpp | |
parent | 47f097013d31b097f97ed0981092273bcc79ae58 (diff) | |
download | ydb-2fbdf1c88f149f6e23c2363c649cda6f8ff21c92.tar.gz |
Add monotonic time provider, KIKIMR-13910
ref:72823653cdfd5fb04f1f1a001374fc120b3da7af
Diffstat (limited to 'library/cpp')
-rw-r--r-- | library/cpp/actors/core/CMakeLists.txt | 1 | ||||
-rw-r--r-- | library/cpp/actors/core/monotonic_provider.cpp | 16 | ||||
-rw-r--r-- | library/cpp/actors/core/monotonic_provider.h | 14 | ||||
-rw-r--r-- | library/cpp/actors/testlib/test_runtime.cpp | 26 | ||||
-rw-r--r-- | library/cpp/actors/testlib/test_runtime.h | 5 |
5 files changed, 62 insertions, 0 deletions
diff --git a/library/cpp/actors/core/CMakeLists.txt b/library/cpp/actors/core/CMakeLists.txt index a20646c7cc8..64c617307c7 100644 --- a/library/cpp/actors/core/CMakeLists.txt +++ b/library/cpp/actors/core/CMakeLists.txt @@ -50,6 +50,7 @@ target_sources(cpp-actors-core PRIVATE ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/memory_track.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/memory_tracker.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/monotonic.cpp + ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/monotonic_provider.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/worker_context.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/probes.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/process_stats.cpp diff --git a/library/cpp/actors/core/monotonic_provider.cpp b/library/cpp/actors/core/monotonic_provider.cpp new file mode 100644 index 00000000000..fb3b656da69 --- /dev/null +++ b/library/cpp/actors/core/monotonic_provider.cpp @@ -0,0 +1,16 @@ +#include "monotonic_provider.h" + +namespace NActors { + +class TDefaultMonotonicTimeProvider : public IMonotonicTimeProvider { +public: + TMonotonic Now() override { + return TMonotonic::Now(); + } +}; + +TIntrusivePtr<IMonotonicTimeProvider> CreateDefaultMonotonicTimeProvider() { + return TIntrusivePtr<IMonotonicTimeProvider>(new TDefaultMonotonicTimeProvider); +} + +} // namespace NActors diff --git a/library/cpp/actors/core/monotonic_provider.h b/library/cpp/actors/core/monotonic_provider.h new file mode 100644 index 00000000000..98e12034009 --- /dev/null +++ b/library/cpp/actors/core/monotonic_provider.h @@ -0,0 +1,14 @@ +#pragma once + +#include "monotonic.h" + +namespace NActors { + +class IMonotonicTimeProvider : public TThrRefBase { +public: + virtual TMonotonic Now() = 0; +}; + +TIntrusivePtr<IMonotonicTimeProvider> CreateDefaultMonotonicTimeProvider(); + +} // namespace NActors diff --git a/library/cpp/actors/testlib/test_runtime.cpp b/library/cpp/actors/testlib/test_runtime.cpp index 6fa25b99656..51d93ba6e93 100644 --- a/library/cpp/actors/testlib/test_runtime.cpp +++ b/library/cpp/actors/testlib/test_runtime.cpp @@ -233,6 +233,20 @@ namespace NActors { TTestActorRuntimeBase& Runtime; }; + class TTestActorRuntimeBase::TMonotonicTimeProvider : public IMonotonicTimeProvider { + public: + TMonotonicTimeProvider(TTestActorRuntimeBase& runtime) + : Runtime(runtime) + { } + + TMonotonic Now() override { + return Runtime.GetCurrentMonotonicTime(); + } + + private: + TTestActorRuntimeBase& Runtime; + }; + class TTestActorRuntimeBase::TSchedulerThreadStub : public ISchedulerThread { public: TSchedulerThreadStub(TTestActorRuntimeBase* runtime, TTestActorRuntimeBase::TNodeDataBase* node) @@ -470,6 +484,7 @@ namespace NActors { , NeedMonitoring(false) , RandomProvider(CreateDeterministicRandomProvider(DefaultRandomSeed)) , TimeProvider(new TTimeProvider(*this)) + , MonotonicTimeProvider(new TMonotonicTimeProvider(*this)) , ShouldContinue() , CurrentTimestamp(0) , DispatchTimeout(DEFAULT_DISPATCH_TIMEOUT) @@ -797,6 +812,12 @@ namespace NActors { return TInstant::MicroSeconds(CurrentTimestamp); } + TMonotonic TTestActorRuntimeBase::GetCurrentMonotonicTime() const { + TGuard<TMutex> guard(Mutex); + Y_VERIFY(!UseRealThreads); + return TMonotonic::MicroSeconds(CurrentTimestamp); + } + void TTestActorRuntimeBase::UpdateCurrentTime(TInstant newTime) { static int counter = 0; ++counter; @@ -823,6 +844,11 @@ namespace NActors { return TimeProvider; } + TIntrusivePtr<IMonotonicTimeProvider> TTestActorRuntimeBase::GetMonotonicTimeProvider() { + Y_VERIFY(!UseRealThreads); + return MonotonicTimeProvider; + } + ui32 TTestActorRuntimeBase::GetNodeId(ui32 index) const { Y_VERIFY(index < NodeCount); return FirstNodeId + index; diff --git a/library/cpp/actors/testlib/test_runtime.h b/library/cpp/actors/testlib/test_runtime.h index 26e3b45c984..c14cde1b666 100644 --- a/library/cpp/actors/testlib/test_runtime.h +++ b/library/cpp/actors/testlib/test_runtime.h @@ -6,6 +6,7 @@ #include <library/cpp/actors/core/events.h> #include <library/cpp/actors/core/executor_thread.h> #include <library/cpp/actors/core/mailbox.h> +#include <library/cpp/actors/core/monotonic_provider.h> #include <library/cpp/actors/util/should_continue.h> #include <library/cpp/actors/interconnect/poller_tcp.h> #include <library/cpp/actors/interconnect/mock/ic_mock.h> @@ -188,6 +189,7 @@ namespace NActors { class TSchedulerThreadStub; class TExecutorPoolStub; class TTimeProvider; + class TMonotonicTimeProvider; enum class EEventAction { PROCESS, @@ -229,7 +231,9 @@ namespace NActors { void SetLogBackend(const TAutoPtr<TLogBackend> logBackend); void SetLogPriority(NActors::NLog::EComponent component, NActors::NLog::EPriority priority); TIntrusivePtr<ITimeProvider> GetTimeProvider(); + TIntrusivePtr<IMonotonicTimeProvider> GetMonotonicTimeProvider(); TInstant GetCurrentTime() const; + TMonotonic GetCurrentMonotonicTime() const; void UpdateCurrentTime(TInstant newTime); void AdvanceCurrentTime(TDuration duration); void AddLocalService(const TActorId& actorId, const TActorSetupCmd& cmd, ui32 nodeIndex = 0); @@ -534,6 +538,7 @@ namespace NActors { TIntrusivePtr<IRandomProvider> RandomProvider; TIntrusivePtr<ITimeProvider> TimeProvider; + TIntrusivePtr<IMonotonicTimeProvider> MonotonicTimeProvider; protected: struct TNodeDataBase: public TThrRefBase { |