Skip to content

Commit f6687cd

Browse files
Merge 903a699 into 77a85af
2 parents 77a85af + 903a699 commit f6687cd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+2103
-22
lines changed

ydb/core/base/events.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ struct TKikimrEvents : TEvents {
177177
ES_NEBIUS_ACCESS_SERVICE,
178178
ES_REPLICATION_SERVICE,
179179
ES_BACKUP_SERVICE,
180+
ES_TX_BACKGROUND,
180181
};
181182
};
182183

ydb/core/protos/counters_columnshard.proto

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,4 +190,8 @@ enum ETxTypes {
190190
TXTYPE_DATA_SHARING_APPLY_LINKS_MODIFICATION = 27 [(TxTypeOpts) = {Name: "TxDataSharingApplyLinksModification"}];
191191
TXTYPE_DATA_SHARING_WRITE_SOURCE_CURSOR = 28 [(TxTypeOpts) = {Name: "TxDataSharingWriteSourceCursor"}];
192192
TXTYPE_EXPORT_SAVE_CURSOR = 29 [(TxTypeOpts) = {Name: "TxExportSaveCursor"}];
193+
TXTYPE_REMOVE_BACKGROUND_SESSION = 30 [(TxTypeOpts) = {Name: "TxRemoveBackgroundSession"}];
194+
TXTYPE_ADD_BACKGROUND_SESSION = 31 [(TxTypeOpts) = {Name: "TxAddBackgroundSession"}];
195+
TXTYPE_SAVE_BACKGROUND_SESSION_PROGRESS = 32 [(TxTypeOpts) = {Name: "TxSaveBackgroundSessionProgress"}];
196+
TXTYPE_SAVE_BACKGROUND_SESSION_STATE = 33 [(TxTypeOpts) = {Name: "TxSaveBackgroundSessionState"}];
193197
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#include "adapter.h"
2+
3+
namespace NKikimr::NOlap::NBackground {
4+
5+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#pragma once
2+
#include "session.h"
3+
#include <ydb/core/tablet_flat/tablet_flat_executor.h>
4+
#include <ydb/library/actors/core/actorid.h>
5+
#include <ydb/library/accessor/accessor.h>
6+
#include <ydb/library/conclusion/status.h>
7+
8+
namespace NKikimr::NOlap::NBackground {
9+
10+
class ITabletAdapter {
11+
private:
12+
virtual bool DoLoadSessionsFromLocalDatabase(NTabletFlatExecutor::TTransactionContext& txc, std::deque<TSessionRecord>& records) = 0;
13+
virtual void DoSaveProgressToLocalDatabase(NTabletFlatExecutor::TTransactionContext& txc, const TSessionRecord& container) = 0;
14+
virtual void DoSaveStateToLocalDatabase(NTabletFlatExecutor::TTransactionContext& txc, const TSessionRecord& container) = 0;
15+
virtual void DoSaveSessionToLocalDatabase(NTabletFlatExecutor::TTransactionContext& txc, const TSessionRecord& container) = 0;
16+
virtual void DoRemoveSessionFromLocalDatabase(NTabletFlatExecutor::TTransactionContext& txc, const TString& className, const TString& identifier) = 0;
17+
public:
18+
virtual ~ITabletAdapter() = default;
19+
20+
void RemoveSessionFromLocalDatabase(NTabletFlatExecutor::TTransactionContext& txc, const TString& className, const TString& identifier) {
21+
return DoRemoveSessionFromLocalDatabase(txc, className, identifier);
22+
}
23+
24+
[[nodiscard]] bool LoadSessionsFromLocalDatabase(NTabletFlatExecutor::TTransactionContext& txc, std::deque<TSessionRecord>& records) {
25+
return DoLoadSessionsFromLocalDatabase(txc, records);
26+
}
27+
28+
void SaveSessionToLocalDatabase(NTabletFlatExecutor::TTransactionContext& txc, const TSessionRecord& session) {
29+
return DoSaveSessionToLocalDatabase(txc, session);
30+
}
31+
32+
void SaveStateToLocalDatabase(NTabletFlatExecutor::TTransactionContext& txc, const TSessionRecord& session) {
33+
return DoSaveStateToLocalDatabase(txc, session);
34+
}
35+
36+
void SaveProgressToLocalDatabase(NTabletFlatExecutor::TTransactionContext& txc, const TSessionRecord& session) {
37+
return DoSaveProgressToLocalDatabase(txc, session);
38+
}
39+
};
40+
41+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include "control.h"
2+
#include <ydb/core/tx/columnshard/bg_tasks/protos/data.pb.h>
3+
4+
namespace NKikimr::NOlap::NBackground {
5+
6+
NKikimrTxBackgroundProto::TSessionControlContainer TSessionControlContainer::SerializeToProto() const {
7+
NKikimrTxBackgroundProto::TSessionControlContainer result;
8+
result.SetSessionClassName(SessionClassName);
9+
result.SetSessionIdentifier(SessionIdentifier);
10+
result.SetStatusChannelContainer(ChannelContainer.SerializeToString());
11+
result.SetLogicControlContainer(LogicControlContainer.SerializeToString());
12+
return result;
13+
}
14+
15+
NKikimr::TConclusionStatus TSessionControlContainer::DeserializeFromProto(const NKikimrTxBackgroundProto::TSessionControlContainer& proto) {
16+
SessionClassName = proto.GetSessionClassName();
17+
SessionIdentifier = proto.GetSessionIdentifier();
18+
if (!SessionClassName) {
19+
return TConclusionStatus::Fail("incorrect session class name for bg_task");
20+
}
21+
if (!SessionIdentifier) {
22+
return TConclusionStatus::Fail("incorrect session id for bg_task");
23+
}
24+
if (!ChannelContainer.DeserializeFromString(proto.GetStatusChannelContainer())) {
25+
return TConclusionStatus::Fail("cannot parse channel from proto");
26+
}
27+
if (!LogicControlContainer.DeserializeFromString(proto.GetLogicControlContainer())) {
28+
return TConclusionStatus::Fail("cannot parse logic from proto");
29+
}
30+
return TConclusionStatus::Success();
31+
}
32+
33+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#pragma once
2+
#include "session.h"
3+
#include "status_channel.h"
4+
#include <ydb/services/bg_tasks/abstract/interface.h>
5+
#include <ydb/library/accessor/accessor.h>
6+
7+
namespace NKikimrTxBackgroundProto {
8+
class TSessionControlContainer;
9+
}
10+
11+
namespace NKikimr::NOlap::NBackground {
12+
13+
class ISessionLogicControl {
14+
private:
15+
YDB_READONLY_DEF(TString, Identifier);
16+
virtual TConclusionStatus DoApply(const std::shared_ptr<ISessionLogic>& session) const = 0;
17+
virtual TConclusionStatus DoDeserializeFromString(const TString& data) = 0;
18+
virtual TString DoSerializeToString() const = 0;
19+
public:
20+
using TFactory = NObjectFactory::TObjectFactory<ISessionLogicControl, TString>;
21+
22+
virtual ~ISessionLogicControl() = default;
23+
24+
TConclusionStatus DeserializeFromString(const TString& data) {
25+
return DoDeserializeFromString(data);
26+
}
27+
28+
TString SerializeToString() const {
29+
return DoSerializeToString();
30+
}
31+
32+
TConclusionStatus Apply(const std::shared_ptr<ISessionLogic>& session) const {
33+
session->CheckStatusCorrect();
34+
auto result = DoApply(session);
35+
session->CheckStatusCorrect();
36+
return result;
37+
}
38+
39+
virtual TString GetClassName() const = 0;
40+
};
41+
42+
class TSessionLogicControlContainer: public NBackgroundTasks::TInterfaceStringContainer<ISessionLogicControl> {
43+
private:
44+
using TBase = NBackgroundTasks::TInterfaceStringContainer<ISessionLogicControl>;
45+
public:
46+
using TBase::TBase;
47+
};
48+
49+
class TSessionControlContainer {
50+
private:
51+
YDB_READONLY_DEF(TString, SessionClassName);
52+
YDB_READONLY_DEF(TString, SessionIdentifier);
53+
YDB_READONLY_DEF(TStatusChannelContainer, ChannelContainer);
54+
YDB_READONLY_DEF(TSessionLogicControlContainer, LogicControlContainer);
55+
public:
56+
NKikimrTxBackgroundProto::TSessionControlContainer SerializeToProto() const;
57+
TConclusionStatus DeserializeFromProto(const NKikimrTxBackgroundProto::TSessionControlContainer& proto);
58+
59+
TSessionControlContainer() = default;
60+
61+
TSessionControlContainer(const TStatusChannelContainer& channel, const TSessionLogicControlContainer& logic)
62+
: ChannelContainer(channel)
63+
, LogicControlContainer(logic) {
64+
AFL_VERIFY(!!ChannelContainer);
65+
AFL_VERIFY(!!LogicControlContainer);
66+
}
67+
};
68+
69+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#include "session.h"
2+
3+
namespace NKikimr::NOlap::NBackground {
4+
5+
}
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
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+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#include "status_channel.h"
2+
3+
namespace NKikimr::NOlap::NBackground {
4+
5+
}

0 commit comments

Comments
 (0)