aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorivanmorozov <ivanmorozov@yandex-team.com>2023-05-19 15:43:43 +0300
committerivanmorozov <ivanmorozov@yandex-team.com>2023-05-19 15:43:43 +0300
commitf6ea2dff0afb9552f0f687497d5fad3b932ce0d1 (patch)
tree071c19c69c67d84eb383226a5832d9997b34a89d
parent888f214bd2da89e6584b9f720cb2205033fdd7ab (diff)
downloadydb-f6ea2dff0afb9552f0f687497d5fad3b932ce0d1.tar.gz
rename class and move in common
-rw-r--r--ydb/core/tx/conveyor/service/service.cpp9
-rw-r--r--ydb/core/tx/conveyor/service/worker.h12
-rw-r--r--ydb/core/tx/conveyor/usage/events.h7
-rw-r--r--ydb/library/conclusion/result.h75
-rw-r--r--ydb/library/conclusion/status.h55
-rw-r--r--ydb/services/metadata/request/common.h38
-rw-r--r--ydb/services/metadata/request/request_actor_cb.h11
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;