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