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 (TTabletId, TabletId);
20+ YDB_READONLY_DEF (NActors::TActorId, TabletActorId);
21+ YDB_READONLY_DEF (TStatusChannelContainer, Channel);
22+ YDB_READONLY_DEF (std::shared_ptr<TSession>, SessionSelfPtr);
23+ YDB_READONLY_DEF (std::shared_ptr<ITabletAdapter>, Adapter);
24+ public:
25+ TStartContext (const TTabletId tabletId, const NActors::TActorId& tabletActorId, const TStatusChannelContainer channel, const std::shared_ptr<TSession>& sessionSelfPtr,
26+ const std::shared_ptr<ITabletAdapter>& adapter)
27+ : TabletId(tabletId)
28+ , TabletActorId(tabletActorId)
29+ , Channel(channel)
30+ , SessionSelfPtr(sessionSelfPtr)
31+ , Adapter(adapter)
32+ {
33+
34+ }
35+ };
36+
37+ class ISessionLogic {
38+ private:
39+ mutable bool ActorConstructed = false ;
40+ virtual TConclusionStatus DoDeserializeProgressFromString (const TString& data) = 0;
41+ virtual TConclusionStatus DoDeserializeStateFromString (const TString& data) = 0;
42+ virtual TConclusionStatus DoDeserializeFromString (const TString& data) = 0;
43+ virtual TString DoSerializeProgressToString () const = 0;
44+ virtual TString DoSerializeStateToString () const = 0;
45+ virtual TString DoSerializeToString () const = 0;
46+ virtual TConclusion<std::unique_ptr<NActors::IActor>> DoCreateActor (const TStartContext& context) const = 0;
47+ public:
48+ using TFactory = NObjectFactory::TObjectFactory<ISessionLogic, TString>;
49+
50+ virtual ~ISessionLogic () = default ;
51+
52+ virtual TString GetClassName () const = 0;
53+
54+ void CheckStatusCorrect () const {
55+ }
56+
57+ TConclusionStatus DeserializeProgressFromString (const TString& data) {
58+ return DoDeserializeProgressFromString (data);
59+ }
60+ TString SerializeProgressToString () const {
61+ CheckStatusCorrect ();
62+ return DoSerializeProgressToString ();
63+ }
64+ TConclusionStatus DeserializeFromString (const TString& data) {
65+ return DoDeserializeFromString (data);
66+ }
67+ TString SerializeToString () const {
68+ CheckStatusCorrect ();
69+ return DoSerializeToString ();
70+ }
71+ TConclusionStatus DeserializeStateFromString (const TString& data) {
72+ return DoDeserializeStateFromString (data);
73+ }
74+ TString SerializeStateToString () const {
75+ CheckStatusCorrect ();
76+ return DoSerializeStateToString ();
77+ }
78+
79+ std::unique_ptr<NActors::IActor> CreateActor (const TStartContext& context) const {
80+ AFL_VERIFY (IsReadyForStart ());
81+ AFL_VERIFY (!IsFinished ());
82+ AFL_VERIFY (!ActorConstructed);
83+ ActorConstructed = true ;
84+ std::unique_ptr<NActors::IActor> result = DoCreateActor (context).DetachResult ();
85+ AFL_VERIFY (!!result);
86+ return result;
87+ }
88+
89+ virtual bool IsReadyForStart () const = 0;
90+ virtual bool IsFinished () const = 0;
91+ virtual bool IsReadyForRemove () const = 0;
92+ };
93+
94+ template <class TProtoLogicExt , class TProtoProgressExt , class TProtoStateExt >
95+ class TSessionProtoAdapter : public NBackgroundTasks ::TInterfaceProtoAdapter<TProtoLogicExt, ISessionLogic> {
96+ protected:
97+ using TProtoProgress = TProtoProgressExt;
98+ using TProtoState = TProtoStateExt;
99+ using TProtoLogic = TProtoLogicExt;
100+ private:
101+ virtual TConclusionStatus DoDeserializeProgressFromProto (const TProtoProgress& proto) = 0;
102+ virtual TProtoProgress DoSerializeProgressToProto () const = 0;
103+ virtual TConclusionStatus DoDeserializeStateFromProto (const TProtoState& proto) = 0;
104+ virtual TProtoState DoSerializeStateToProto () const = 0;
105+ protected:
106+ virtual TConclusionStatus DoDeserializeProgressFromString (const TString& data) override final {
107+ TProtoProgress proto;
108+ if (!proto.ParseFromArray (data.data (), data.size ())) {
109+ return TConclusionStatus::Fail (" cannot parse proto string as " + TypeName<TProtoProgress>());
110+ }
111+ return DoDeserializeProgressFromProto (proto);
112+ }
113+ virtual TString DoSerializeProgressToString () const override final {
114+ TProtoProgress proto = DoSerializeProgressToProto ();
115+ return proto.SerializeAsString ();
116+ }
117+ virtual TConclusionStatus DoDeserializeStateFromString (const TString& data) override final {
118+ TProtoState proto;
119+ if (!proto.ParseFromArray (data.data (), data.size ())) {
120+ return TConclusionStatus::Fail (" cannot parse proto string as " + TypeName<TProtoState>());
121+ }
122+ return DoDeserializeStateFromProto (proto);
123+ }
124+ virtual TString DoSerializeStateToString () const override final {
125+ TProtoState proto = DoSerializeStateToProto ();
126+ return proto.SerializeAsString ();
127+ }
128+ };
129+
130+ class TSessionLogicContainer : public NBackgroundTasks ::TInterfaceStringContainer<ISessionLogic> {
131+ private:
132+ using TBase = NBackgroundTasks::TInterfaceStringContainer<ISessionLogic>;
133+ public:
134+ using TBase::TBase;
135+ };
136+
137+ class TSessionRecord {
138+ private:
139+ YDB_ACCESSOR_DEF (TString, Identifier);
140+ YDB_ACCESSOR_DEF (TString, ClassName);
141+ YDB_ACCESSOR_DEF (TString, LogicDescription);
142+ YDB_ACCESSOR_DEF (TString, StatusChannel);
143+ YDB_ACCESSOR_DEF (TString, Progress);
144+ YDB_ACCESSOR_DEF (TString, State);
145+ public:
146+ };
147+
148+ }
0 commit comments