1+ #pragma once
2+ #include " status_channel.h"
3+
4+ #include < ydb/core/tx/columnshard/common/tablet_id.h>
5+ #include < ydb/services/bg_tasks/abstract/interface.h>
6+
7+ #include < ydb/library/accessor/accessor.h>
8+ #include < ydb/library/actors/core/actorid.h>
9+ #include < ydb/library/conclusion/status.h>
10+ #include < ydb/library/conclusion/result.h>
11+
12+ namespace NKikimr ::NOlap::NBackground {
13+
14+ class TSession ;
15+ class ITabletAdapter ;
16+
17+ class TStartContext {
18+ private:
19+ YDB_READONLY_DEF (std::shared_ptr<TSession>, SessionSelfPtr);
20+ YDB_READONLY_DEF (std::shared_ptr<ITabletAdapter>, Adapter);
21+ public:
22+ TStartContext (const std::shared_ptr<TSession>& sessionSelfPtr,
23+ const std::shared_ptr<ITabletAdapter>& adapter)
24+ : SessionSelfPtr(sessionSelfPtr)
25+ , Adapter(adapter)
26+ {
27+ AFL_VERIFY (!!SessionSelfPtr);
28+ AFL_VERIFY (!!Adapter);
29+ }
30+ };
31+
32+ class ISessionLogic {
33+ private:
34+ mutable bool ActorConstructed = false ;
35+ virtual TConclusionStatus DoDeserializeProgressFromString (const TString& data) = 0;
36+ virtual TConclusionStatus DoDeserializeStateFromString (const TString& data) = 0;
37+ virtual TConclusionStatus DoDeserializeFromString (const TString& data) = 0;
38+ virtual TString DoSerializeProgressToString () const = 0;
39+ virtual TString DoSerializeStateToString () const = 0;
40+ virtual TString DoSerializeToString () const = 0;
41+ virtual TConclusion<std::unique_ptr<NActors::IActor>> DoCreateActor (const TStartContext& context) const = 0;
42+ public:
43+ using TFactory = NObjectFactory::TObjectFactory<ISessionLogic, TString>;
44+
45+ virtual ~ISessionLogic () = default ;
46+
47+ virtual TString GetClassName () const = 0;
48+
49+ void CheckStatusCorrect () const {
50+ }
51+
52+ TConclusionStatus DeserializeProgressFromString (const TString& data) {
53+ return DoDeserializeProgressFromString (data);
54+ }
55+ TString SerializeProgressToString () const {
56+ CheckStatusCorrect ();
57+ return DoSerializeProgressToString ();
58+ }
59+ TConclusionStatus DeserializeFromString (const TString& data) {
60+ return DoDeserializeFromString (data);
61+ }
62+ TString SerializeToString () const {
63+ CheckStatusCorrect ();
64+ return DoSerializeToString ();
65+ }
66+ TConclusionStatus DeserializeStateFromString (const TString& data) {
67+ return DoDeserializeStateFromString (data);
68+ }
69+ TString SerializeStateToString () const {
70+ CheckStatusCorrect ();
71+ return DoSerializeStateToString ();
72+ }
73+
74+ std::unique_ptr<NActors::IActor> CreateActor (const TStartContext& context) const {
75+ AFL_VERIFY (IsReadyForStart ());
76+ AFL_VERIFY (!IsFinished ());
77+ AFL_VERIFY (!ActorConstructed);
78+ ActorConstructed = true ;
79+ std::unique_ptr<NActors::IActor> result = DoCreateActor (context).DetachResult ();
80+ AFL_VERIFY (!!result);
81+ return result;
82+ }
83+
84+ virtual bool IsReadyForStart () const = 0;
85+ virtual bool IsFinished () const = 0;
86+ virtual bool IsReadyForRemove () const = 0;
87+ };
88+
89+ template <class TProtoLogicExt , class TProtoProgressExt , class TProtoStateExt >
90+ class TSessionProtoAdapter : public NBackgroundTasks ::TInterfaceProtoAdapter<TProtoLogicExt, ISessionLogic> {
91+ protected:
92+ using TProtoProgress = TProtoProgressExt;
93+ using TProtoState = TProtoStateExt;
94+ using TProtoLogic = TProtoLogicExt;
95+ private:
96+ virtual TConclusionStatus DoDeserializeProgressFromProto (const TProtoProgress& proto) = 0;
97+ virtual TProtoProgress DoSerializeProgressToProto () const = 0;
98+ virtual TConclusionStatus DoDeserializeStateFromProto (const TProtoState& proto) = 0;
99+ virtual TProtoState DoSerializeStateToProto () const = 0;
100+ protected:
101+ virtual TConclusionStatus DoDeserializeProgressFromString (const TString& data) override final {
102+ TProtoProgress proto;
103+ if (!proto.ParseFromArray (data.data (), data.size ())) {
104+ return TConclusionStatus::Fail (" cannot parse proto string as " + TypeName<TProtoProgress>());
105+ }
106+ return DoDeserializeProgressFromProto (proto);
107+ }
108+ virtual TString DoSerializeProgressToString () const override final {
109+ TProtoProgress proto = DoSerializeProgressToProto ();
110+ return proto.SerializeAsString ();
111+ }
112+ virtual TConclusionStatus DoDeserializeStateFromString (const TString& data) override final {
113+ TProtoState proto;
114+ if (!proto.ParseFromArray (data.data (), data.size ())) {
115+ return TConclusionStatus::Fail (" cannot parse proto string as " + TypeName<TProtoState>());
116+ }
117+ return DoDeserializeStateFromProto (proto);
118+ }
119+ virtual TString DoSerializeStateToString () const override final {
120+ TProtoState proto = DoSerializeStateToProto ();
121+ return proto.SerializeAsString ();
122+ }
123+ };
124+
125+ class TSessionLogicContainer : public NBackgroundTasks ::TInterfaceStringContainer<ISessionLogic> {
126+ private:
127+ using TBase = NBackgroundTasks::TInterfaceStringContainer<ISessionLogic>;
128+ public:
129+ using TBase::TBase;
130+ };
131+
132+ class TSessionRecord {
133+ private:
134+ YDB_ACCESSOR_DEF (TString, Identifier);
135+ YDB_ACCESSOR_DEF (TString, ClassName);
136+ YDB_ACCESSOR_DEF (TString, LogicDescription);
137+ YDB_ACCESSOR_DEF (TString, StatusChannel);
138+ YDB_ACCESSOR_DEF (TString, Progress);
139+ YDB_ACCESSOR_DEF (TString, State);
140+ public:
141+ };
142+
143+ }
0 commit comments