diff options
author | ivanmorozov <ivanmorozov@yandex-team.com> | 2023-05-19 15:43:43 +0300 |
---|---|---|
committer | ivanmorozov <ivanmorozov@yandex-team.com> | 2023-05-19 15:43:43 +0300 |
commit | f6ea2dff0afb9552f0f687497d5fad3b932ce0d1 (patch) | |
tree | 071c19c69c67d84eb383226a5832d9997b34a89d | |
parent | 888f214bd2da89e6584b9f720cb2205033fdd7ab (diff) | |
download | ydb-f6ea2dff0afb9552f0f687497d5fad3b932ce0d1.tar.gz |
rename class and move in common
-rw-r--r-- | ydb/core/tx/conveyor/service/service.cpp | 9 | ||||
-rw-r--r-- | ydb/core/tx/conveyor/service/worker.h | 12 | ||||
-rw-r--r-- | ydb/core/tx/conveyor/usage/events.h | 7 | ||||
-rw-r--r-- | ydb/library/conclusion/result.h | 75 | ||||
-rw-r--r-- | ydb/library/conclusion/status.h | 55 | ||||
-rw-r--r-- | ydb/services/metadata/request/common.h | 38 | ||||
-rw-r--r-- | ydb/services/metadata/request/request_actor_cb.h | 11 |
7 files changed, 151 insertions, 56 deletions
diff --git a/ydb/core/tx/conveyor/service/service.cpp b/ydb/core/tx/conveyor/service/service.cpp index bf9f5ea647d..5c9d7852609 100644 --- a/ydb/core/tx/conveyor/service/service.cpp +++ b/ydb/core/tx/conveyor/service/service.cpp @@ -42,9 +42,9 @@ void TDistributor::HandleMain(TEvInternal::TEvTaskProcessedResult::TPtr& ev) { } else { Workers.emplace_back(ev->Sender); } - if (ev->Get()->GetErrorMessage()) { + if (ev->Get()->IsFail()) { ALS_ERROR(NKikimrServices::TX_CONVEYOR) << "action=on_error;owner=" << ev->Get()->GetOwnerId() << ";workers=" << Workers.size() << ";waiting=" << Waiting.size(); - Send(ev->Get()->GetOwnerId(), new TEvExecution::TEvTaskProcessedResult(ev->Get()->GetErrorMessage())); + Send(ev->Get()->GetOwnerId(), new TEvExecution::TEvTaskProcessedResult(ev->Get()->GetError())); } else { Send(ev->Get()->GetOwnerId(), new TEvExecution::TEvTaskProcessedResult(ev->Get()->GetResult())); } @@ -64,8 +64,9 @@ void TDistributor::HandleMain(TEvExecution::TEvNewTask::TPtr& ev) { } else { ALS_ERROR(NKikimrServices::TX_CONVEYOR) << "action=overlimit;sender=" << ev->Sender << ";workers=" << Workers.size() << ";waiting=" << Waiting.size(); OverlimitRate->Inc(); - Send(ev->Sender, new TEvExecution::TEvTaskProcessedResult("scan conveyor overloaded (" + - ::ToString(Waiting.size()) + " >= " + ::ToString(Config.GetQueueSizeLimit()) + ")")); + Send(ev->Sender, new TEvExecution::TEvTaskProcessedResult( + TConclusionStatus::Fail("scan conveyor overloaded (" + ::ToString(Waiting.size()) + " >= " + ::ToString(Config.GetQueueSizeLimit()) + ")") + )); } WaitingQueueSize->Set(Waiting.size()); WorkersCount->Set(Workers.size()); diff --git a/ydb/core/tx/conveyor/service/worker.h b/ydb/core/tx/conveyor/service/worker.h index 280b0c43e25..53eda8cb4cf 100644 --- a/ydb/core/tx/conveyor/service/worker.h +++ b/ydb/core/tx/conveyor/service/worker.h @@ -5,7 +5,7 @@ #include <ydb/library/accessor/accessor.h> #include <ydb/core/tx/conveyor/usage/abstract.h> #include <ydb/core/protos/services.pb.h> -#include <ydb/services/metadata/request/common.h> +#include <ydb/library/conclusion/result.h> #include <library/cpp/actors/core/log.h> #include <library/cpp/actors/core/hfunc.h> @@ -29,12 +29,12 @@ public: struct TEvInternal { enum EEv { - EvNewTask = EventSpaceBegin(TEvents::ES_PRIVATE), + EvNewTask = EventSpaceBegin(NActors::TEvents::ES_PRIVATE), EvTaskProcessedResult, EvEnd }; - static_assert(EvEnd < EventSpaceEnd(TEvents::ES_PRIVATE), "expected EvEnd < EventSpaceEnd"); + static_assert(EvEnd < EventSpaceEnd(NActors::TEvents::ES_PRIVATE), "expected EvEnd < EventSpaceEnd"); class TEvNewTask: public NActors::TEventLocal<TEvNewTask, EvNewTask> { private: @@ -53,13 +53,13 @@ struct TEvInternal { class TEvTaskProcessedResult: public NActors::TEventLocal<TEvTaskProcessedResult, EvTaskProcessedResult>, - public NMetadata::NRequest::TMaybeResult<ITask::TPtr> { + public TConclusion<ITask::TPtr> { private: - using TBase = NMetadata::NRequest::TMaybeResult<ITask::TPtr>; + using TBase = TConclusion<ITask::TPtr>; YDB_READONLY_DEF(NActors::TActorId, OwnerId); public: TEvTaskProcessedResult(const NActors::TActorId& ownerId, const TString& errorMessage) - : TBase(errorMessage) + : TBase(TConclusionStatus::Fail(errorMessage)) , OwnerId(ownerId) { } diff --git a/ydb/core/tx/conveyor/usage/events.h b/ydb/core/tx/conveyor/usage/events.h index 12ab77bd5c6..38f3539c39d 100644 --- a/ydb/core/tx/conveyor/usage/events.h +++ b/ydb/core/tx/conveyor/usage/events.h @@ -2,7 +2,8 @@ #include "abstract.h" #include <library/cpp/actors/core/event_local.h> #include <library/cpp/actors/core/events.h> -#include <ydb/services/metadata/request/common.h> +#include <ydb/library/conclusion/result.h> +#include <ydb/core/base/events.h> namespace NKikimr::NConveyor { @@ -28,9 +29,9 @@ struct TEvExecution { class TEvTaskProcessedResult: public NActors::TEventLocal<TEvTaskProcessedResult, EvTaskProcessedResult>, - public NMetadata::NRequest::TMaybeResult<ITask::TPtr> { + public TConclusion<ITask::TPtr> { private: - using TBase = NMetadata::NRequest::TMaybeResult<ITask::TPtr>; + using TBase = TConclusion<ITask::TPtr>; public: using TBase::TBase; }; diff --git a/ydb/library/conclusion/result.h b/ydb/library/conclusion/result.h new file mode 100644 index 00000000000..3a685845bc2 --- /dev/null +++ b/ydb/library/conclusion/result.h @@ -0,0 +1,75 @@ +#pragma once +#include "status.h" +#include <util/system/yassert.h> +#include <optional> + +namespace NKikimr { + +template <class TResult> +class TConclusion { +private: + std::variant<TConclusionStatus, TResult> Result; +public: + + TConclusion(TConclusionStatus&& status) + : Result(std::move(status)) { + auto* resStatus = std::get_if<TConclusionStatus>(&Result); + Y_VERIFY(resStatus->IsFail()); + } + + bool IsFail() const { + return std::get_if<TConclusionStatus>(&Result); + } + + bool IsSuccess() const { + return std::get_if<TResult>(&Result); + } + + TConclusion(const TConclusionStatus& status) + : Result(status) { + Y_VERIFY(IsFail()); + } + + TConclusion(TResult&& result) + : Result(std::move(result)) { + } + + TConclusion(const TResult& result) + : Result(result) { + } + + const TConclusionStatus& GetError() const { + auto result = std::get_if<TConclusionStatus>(&Result); + Y_VERIFY(result, "incorrect object for error request"); + return *result; + } + + const TResult& GetResult() const { + auto result = std::get_if<TResult>(&Result); + Y_VERIFY(result, "incorrect object for result request"); + return *result; + } + + const TResult& operator*() const { + return GetResult(); + } + + bool operator!() const { + return IsFail(); + } + + explicit operator bool() const { + return IsSuccess(); + } + + const TString& GetErrorMessage() const { + auto* status = std::get_if<TConclusionStatus>(&Result); + if (!status) { + return Default<TString>(); + } else { + return status->GetErrorMessage(); + } + } +}; + +} diff --git a/ydb/library/conclusion/status.h b/ydb/library/conclusion/status.h new file mode 100644 index 00000000000..739d5d86a10 --- /dev/null +++ b/ydb/library/conclusion/status.h @@ -0,0 +1,55 @@ +#pragma once +#include <util/generic/string.h> +#include <optional> + +namespace NKikimr { + +class TConclusionStatus { +private: + std::optional<TString> ErrorMessage; + TConclusionStatus() = default; + TConclusionStatus(const TString& errorMessage) + : ErrorMessage(errorMessage) { + Y_VERIFY(!!ErrorMessage); + } + + TConclusionStatus(const char* errorMessage) + : ErrorMessage(errorMessage) { + Y_VERIFY(!!ErrorMessage); + } +public: + + const TString& GetErrorMessage() const { + return ErrorMessage ? *ErrorMessage : Default<TString>(); + } + + static TConclusionStatus Fail(const char* errorMessage) { + return TConclusionStatus(errorMessage); + } + + static TConclusionStatus Fail(const TString& errorMessage) { + return TConclusionStatus(errorMessage); + } + + bool IsFail() const { + return !Ok(); + } + + bool Ok() const { + return !ErrorMessage; + } + + bool operator!() const { + return !!ErrorMessage; + } + + explicit operator bool() const { + return Ok(); + } + + static TConclusionStatus Success() { + return TConclusionStatus(); + } +}; + +} diff --git a/ydb/services/metadata/request/common.h b/ydb/services/metadata/request/common.h index 3f00c3634c7..47d65dd34f1 100644 --- a/ydb/services/metadata/request/common.h +++ b/ydb/services/metadata/request/common.h @@ -112,44 +112,6 @@ public: } }; -template <class TResult> -class TMaybeResult { -private: - YDB_READONLY_DEF(TString, ErrorMessage); - YDB_ACCESSOR_DEF(TResult, Result); -public: - TMaybeResult(const TString& errorMessage) - : ErrorMessage(errorMessage) { - - } - - TMaybeResult(const char* errorMessage) - : ErrorMessage(errorMessage) { - - } - - TMaybeResult(TResult&& result) - : Result(std::move(result)) { - - } - - TMaybeResult(const TResult& result) - : Result(result) { - - } - - const TResult& operator*() const { - Y_ENSURE(!ErrorMessage, yexception() << "incorrect object for result request"); - return Result; - } - - bool operator!() const { - return !!ErrorMessage; - } - - -}; - template <class TDialogPolicy> class TEvRequestResult: public NActors::TEventLocal<TEvRequestResult<TDialogPolicy>, TDialogPolicy::EvResult> { private: diff --git a/ydb/services/metadata/request/request_actor_cb.h b/ydb/services/metadata/request/request_actor_cb.h index a1e747d48cc..f13b71d7fbb 100644 --- a/ydb/services/metadata/request/request_actor_cb.h +++ b/ydb/services/metadata/request/request_actor_cb.h @@ -10,6 +10,7 @@ #include <ydb/library/aclib/aclib.h> #include <ydb/library/yql/public/issue/yql_issue_message.h> #include <ydb/library/yql/public/issue/yql_issue.h> +#include <ydb/library/conclusion/result.h> namespace NKikimr::NMetadata::NRequest { @@ -63,15 +64,15 @@ private: std::shared_ptr<TNextController> NextController; const NACLib::TUserToken UserToken; protected: - TMaybeResult<typename TNextController::TDialogPolicy::TRequest> BuildNextRequest(typename TCurrentDialogPolicy::TResponse&& result) const { + TConclusion<typename TNextController::TDialogPolicy::TRequest> BuildNextRequest(typename TCurrentDialogPolicy::TResponse&& result) const { return DoBuildNextRequest(std::move(result)); } - virtual TMaybeResult<typename TNextController::TDialogPolicy::TRequest> DoBuildNextRequest(typename TCurrentDialogPolicy::TResponse&& result) const = 0; + virtual TConclusion<typename TNextController::TDialogPolicy::TRequest> DoBuildNextRequest(typename TCurrentDialogPolicy::TResponse&& result) const = 0; public: using TDialogPolicy = TCurrentDialogPolicy; virtual void OnRequestResult(typename TCurrentDialogPolicy::TResponse&& result) override { - TMaybeResult<typename TNextController::TDialogPolicy::TRequest> nextRequest = BuildNextRequest(std::move(result)); + TConclusion<typename TNextController::TDialogPolicy::TRequest> nextRequest = BuildNextRequest(std::move(result)); if (!nextRequest) { OnRequestFailed(nextRequest.GetErrorMessage()); } else { @@ -97,14 +98,14 @@ private: using TBase = IChainController<TDialogCreateSession, IExternalController<TDialogPolicy>>; TRequest ProtoRequest; protected: - virtual TMaybeResult<typename TDialogPolicy::TRequest> DoBuildNextRequest(TDialogCreateSession::TResponse&& response) const override { + virtual TConclusion<typename TDialogPolicy::TRequest> DoBuildNextRequest(TDialogCreateSession::TResponse&& response) const override { auto result = ProtoRequest; Ydb::Table::CreateSessionResponse currentFullReply = std::move(response); Ydb::Table::CreateSessionResult session; currentFullReply.operation().result().UnpackTo(&session); const TString sessionId = session.session_id(); if (!sessionId) { - return "cannot build session for request"; + return TConclusionStatus::Fail("cannot build session for request"); } result.set_session_id(sessionId); return result; |