1+ #include < ydb/core/keyvalue/keyvalue_utils.h>
2+
3+ namespace NKikimr {
4+ namespace NKeyValue {
5+
6+ NKikimrKeyValue::Statuses::ReplyStatus ConvertStatus (NMsgBusProxy::EResponseStatus status) {
7+ switch (status) {
8+ case NMsgBusProxy::MSTATUS_ERROR:
9+ return NKikimrKeyValue::Statuses::RSTATUS_ERROR;
10+ case NMsgBusProxy::MSTATUS_TIMEOUT:
11+ return NKikimrKeyValue::Statuses::RSTATUS_TIMEOUT;
12+ case NMsgBusProxy::MSTATUS_REJECTED:
13+ return NKikimrKeyValue::Statuses::RSTATUS_WRONG_LOCK_GENERATION;
14+ case NMsgBusProxy::MSTATUS_INTERNALERROR:
15+ return NKikimrKeyValue::Statuses::RSTATUS_INTERNAL_ERROR;
16+ default :
17+ return NKikimrKeyValue::Statuses::RSTATUS_INTERNAL_ERROR;
18+ };
19+ }
20+
21+
22+ template <typename TEvent>
23+ struct THasCookie : std::true_type {};
24+
25+ template <>
26+ struct THasCookie <TEvKeyValue::TEvGetStorageChannelStatusResponse> : std::false_type {};
27+
28+
29+
30+ template <typename TEvent>
31+ std::unique_ptr<IEventBase> MakeErrorResponseImpl (const TIntermediate *intermediateResults, NKikimrKeyValue::Statuses::ReplyStatus status, TString errorDescription) {
32+ std::unique_ptr<TEvent> response (new TEvent);
33+ if constexpr (THasCookie<TEvent>::value) {
34+ if (intermediateResults->HasCookie ) {
35+ response->Record .set_cookie (intermediateResults->Cookie );
36+ }
37+ }
38+ response->Record .set_msg (errorDescription);
39+ response->Record .set_status (status);
40+ return response;
41+ }
42+
43+
44+ std::unique_ptr<IEventBase> MakeErrorResponse (const TIntermediate *intermediateResults, NMsgBusProxy::EResponseStatus status, TString errorDescription) {
45+ if (intermediateResults->EvType == TEvKeyValue::TEvRequest::EventType) {
46+ std::unique_ptr<TEvKeyValue::TEvResponse> response (new TEvKeyValue::TEvResponse);
47+ if (intermediateResults->HasCookie ) {
48+ response->Record .SetCookie (intermediateResults->Cookie );
49+ }
50+ response->Record .SetErrorReason (errorDescription);
51+ response->Record .SetStatus (status);
52+ return response;
53+ }
54+ if (intermediateResults->EvType == TEvKeyValue::TEvRead::EventType) {
55+ return MakeErrorResponseImpl<TEvKeyValue::TEvReadResponse>(intermediateResults, ConvertStatus (status), errorDescription);
56+ }
57+ if (intermediateResults->EvType == TEvKeyValue::TEvReadRange::EventType) {
58+ return MakeErrorResponseImpl<TEvKeyValue::TEvReadRangeResponse>(intermediateResults, ConvertStatus (status), errorDescription);
59+ }
60+ if (intermediateResults->EvType == TEvKeyValue::TEvExecuteTransaction::EventType) {
61+ return MakeErrorResponseImpl<TEvKeyValue::TEvExecuteTransactionResponse>(intermediateResults, ConvertStatus (status), errorDescription);
62+ }
63+ if (intermediateResults->EvType == TEvKeyValue::TEvGetStorageChannelStatus::EventType) {
64+ return MakeErrorResponseImpl<TEvKeyValue::TEvGetStorageChannelStatusResponse>(intermediateResults, ConvertStatus (status), errorDescription);
65+ }
66+
67+ return nullptr ;
68+ }
69+
70+
71+ } // NKeyValue
72+ } // NKikimr
0 commit comments