Skip to content

Commit 0f3e124

Browse files
authored
Add tablet version info to pipes (#9003)
1 parent c513c4e commit 0f3e124

File tree

10 files changed

+135
-30
lines changed

10 files changed

+135
-30
lines changed

ydb/core/base/tablet.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,13 @@ struct TEvTablet {
338338
{}
339339
};
340340

341-
struct TEvTabletActive : public TEventLocal<TEvTabletActive, EvTabletActive> {};
341+
struct TEvTabletActive : public TEventLocal<TEvTabletActive, EvTabletActive> {
342+
TString VersionInfo;
343+
344+
explicit TEvTabletActive(TString&& versionInfo)
345+
: VersionInfo(std::move(versionInfo))
346+
{}
347+
};
342348

343349
struct TEvDemoted : public TEventLocal<TEvDemoted, EvDemoted> {
344350
const bool ByIsolation;

ydb/core/base/tablet_pipe.h

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ namespace NKikimr {
5454
struct TEvConnectResult : public TEventPB<TEvConnectResult, NKikimrTabletPipe::TEvConnectResult, EvConnectResult> {
5555
TEvConnectResult() {}
5656

57-
TEvConnectResult(NKikimrProto::EReplyStatus status, ui64 tabletId, const TActorId& clientId, const TActorId& serverId, bool leader, ui32 generation)
57+
TEvConnectResult(NKikimrProto::EReplyStatus status, ui64 tabletId,
58+
const TActorId& clientId, const TActorId& serverId,
59+
bool leader, ui32 generation,
60+
TString&& versionInfo)
5861
{
5962
Record.SetStatus(status);
6063
Record.SetTabletId(tabletId);
@@ -63,6 +66,9 @@ namespace NKikimr {
6366
Record.SetLeader(leader);
6467
Record.SetSupportsDataInPayload(true);
6568
Record.SetGeneration(generation);
69+
if (!versionInfo.empty()) {
70+
Record.SetVersionInfo(std::move(versionInfo));
71+
}
6672
}
6773
};
6874

@@ -121,14 +127,18 @@ namespace NKikimr {
121127
};
122128

123129
struct TEvClientConnected : public TEventLocal<TEvClientConnected, EvClientConnected> {
124-
TEvClientConnected(ui64 tabletId, NKikimrProto::EReplyStatus status, const TActorId& clientId, const TActorId& serverId, bool leader, bool dead, ui64 generation)
130+
TEvClientConnected(ui64 tabletId, NKikimrProto::EReplyStatus status,
131+
const TActorId& clientId, const TActorId& serverId,
132+
bool leader, bool dead, ui64 generation,
133+
TString&& versionInfo = {})
125134
: TabletId(tabletId)
126135
, Status(status)
127136
, ClientId(clientId)
128137
, ServerId(serverId)
129138
, Leader(leader)
130139
, Dead(dead)
131140
, Generation(generation)
141+
, VersionInfo(std::move(versionInfo))
132142
{}
133143

134144
const ui64 TabletId;
@@ -138,6 +148,7 @@ namespace NKikimr {
138148
const bool Leader;
139149
const bool Dead;
140150
const ui64 Generation;
151+
TString VersionInfo;
141152
};
142153

143154
struct TEvServerConnected : public TEventLocal<TEvServerConnected, EvServerConnected> {
@@ -206,20 +217,21 @@ namespace NKikimr {
206217
};
207218

208219
struct TEvActivate : public TEventLocal<TEvActivate, EvActivate> {
209-
TEvActivate(ui64 tabletId, const TActorId& ownerId, const TActorId& recipientId, bool leader, ui32 generation)
220+
TEvActivate(ui64 tabletId, const TActorId& ownerId, const TActorId& recipientId, bool leader, ui32 generation, const TString& versionInfo)
210221
: TabletId(tabletId)
211222
, OwnerId(ownerId)
212223
, RecipientId(recipientId)
213224
, Leader(leader)
214225
, Generation(generation)
215-
226+
, VersionInfo(versionInfo)
216227
{}
217228

218229
const ui64 TabletId;
219230
const TActorId OwnerId;
220231
const TActorId RecipientId;
221232
const bool Leader;
222233
const ui32 Generation;
234+
TString VersionInfo;
223235
};
224236

225237
struct TEvShutdown : public TEventLocal<TEvShutdown, EvShutdown> {
@@ -297,7 +309,7 @@ namespace NKikimr {
297309
// Creates and activated server, returns serverId.
298310
// Created server will forward messages to the specified recipent.
299311
virtual TActorId Accept(TEvTabletPipe::TEvConnect::TPtr &ev, TActorIdentity owner, TActorId recipient,
300-
bool leader = true, ui64 generation = 0) = 0;
312+
bool leader = true, ui64 generation = 0, const TString &versionInfo = {}) = 0;
301313

302314
// Rejects connect with an error.
303315
virtual void Reject(TEvTabletPipe::TEvConnect::TPtr &ev, TActorIdentity owner, NKikimrProto::EReplyStatus status, bool leader = true) = 0;
@@ -314,7 +326,8 @@ namespace NKikimr {
314326

315327
// Activates all inactive servers, created by Enqueue.
316328
// All activated servers will forward messages to the specified recipent.
317-
virtual void Activate(TActorIdentity owner, TActorId recipientId, bool leader = true, ui64 generation = 0) = 0;
329+
virtual void Activate(TActorIdentity owner, TActorId recipientId,
330+
bool leader = true, ui64 generation = 0, const TString &versionInfo = {}) = 0;
318331

319332
// Cleanup resources after reset
320333
virtual void Erase(TEvTabletPipe::TEvServerDestroyed::TPtr &ev) = 0;
@@ -402,7 +415,8 @@ namespace NKikimr {
402415
IActor* CreateServer(ui64 tabletId, const TActorId& clientId, const TActorId& interconnectSession, ui32 features, ui64 connectCookie);
403416

404417
// Promotes server actor to the active state.
405-
void ActivateServer(ui64 tabletId, TActorId serverId, TActorIdentity owner, TActorId recipientId, bool leader, ui64 generation = 0);
418+
void ActivateServer(ui64 tabletId, TActorId serverId, TActorIdentity owner, TActorId recipientId,
419+
bool leader, ui64 generation, const TString& versionInfo);
406420

407421
// Destroys server actor.
408422
void CloseServer(TActorIdentity owner, TActorId serverId);

ydb/core/protos/tablet_pipe.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ message TEvConnectResult {
2222
optional bool Leader = 5 [default = true];
2323
optional bool SupportsDataInPayload = 6;
2424
optional uint32 Generation = 7;
25+
optional bytes VersionInfo = 8;
2526
};
2627

2728
message TEvPush {

ydb/core/tablet/tablet_pipe_client.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ namespace NTabletPipe {
282282
return;
283283
}
284284

285-
const auto &record = ev->Get()->Record;
285+
auto &record = ev->Get()->Record;
286286
Y_ABORT_UNLESS(record.GetTabletId() == TabletId);
287287

288288
ServerId = ActorIdFromProto(record.GetServerId());
@@ -299,8 +299,12 @@ namespace NTabletPipe {
299299

300300
Become(&TThis::StateWork);
301301

302+
TString versionInfo;
303+
if (!record.GetVersionInfo().empty()) {
304+
versionInfo = std::move(*record.MutableVersionInfo());
305+
}
302306
ctx.Send(Owner, new TEvTabletPipe::TEvClientConnected(TabletId, NKikimrProto::OK, ctx.SelfID, ServerId,
303-
Leader, false, Generation));
307+
Leader, false, Generation, std::move(versionInfo)));
304308

305309
BLOG_D("send queued");
306310
while (TAutoPtr<IEventHandle> x = PayloadQueue->Pop())

ydb/core/tablet/tablet_pipe_server.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ namespace NTabletPipe {
197197
RecipientId = ev->Get()->RecipientId;
198198
Leader = ev->Get()->Leader;
199199
Generation = ev->Get()->Generation;
200+
VersionInfo = std::move(ev->Get()->VersionInfo);
200201
Y_ABORT_UNLESS(OwnerId);
201202
Y_ABORT_UNLESS(RecipientId);
202203
if (InterconnectSession) {
@@ -210,7 +211,10 @@ namespace NTabletPipe {
210211

211212
void OnConnected(const TActorContext& ctx) {
212213
Become(&TThis::StateActive);
213-
SendToClient(ctx, new TEvTabletPipe::TEvConnectResult(NKikimrProto::OK, TabletId, ClientId, ctx.SelfID, Leader, Generation), IEventHandle::FlagTrackDelivery, ConnectCookie);
214+
SendToClient(ctx,
215+
new TEvTabletPipe::TEvConnectResult(NKikimrProto::OK, TabletId, ClientId, ctx.SelfID,
216+
Leader, Generation, std::move(VersionInfo)),
217+
IEventHandle::FlagTrackDelivery, ConnectCookie);
214218
ctx.Send(RecipientId, new TEvTabletPipe::TEvServerConnected(TabletId, ClientId, ctx.SelfID, InterconnectSession));
215219
Connected = true;
216220
}
@@ -265,6 +269,7 @@ namespace NTabletPipe {
265269
bool Connected;
266270
bool HadShutdown = false;
267271
ui32 Generation = 0;
272+
TString VersionInfo;
268273
};
269274

270275
class TConnectAcceptor: public IConnectAcceptor {
@@ -276,15 +281,17 @@ namespace NTabletPipe {
276281
{
277282
}
278283

279-
TActorId Accept(TEvTabletPipe::TEvConnect::TPtr &ev, TActorIdentity owner, TActorId recipientId, bool leader, ui64 generation) override {
284+
TActorId Accept(TEvTabletPipe::TEvConnect::TPtr &ev, TActorIdentity owner, TActorId recipientId,
285+
bool leader, ui64 generation, const TString &versionInfo) override
286+
{
280287
Y_ABORT_UNLESS(ev->Get()->Record.GetTabletId() == TabletId);
281288
const TActorId clientId = ActorIdFromProto(ev->Get()->Record.GetClientId());
282289
IActor* server = CreateServer(TabletId, clientId, ev->InterconnectSession, ev->Get()->Record.GetFeatures(), ev->Cookie);
283290
TActorId serverId = TActivationContext::Register(server);
284291
LOG_DEBUG_S(*TlsActivationContext, NKikimrServices::PIPE_SERVER, "[" << TabletId << "]"
285292
<< " Accept Connect Originator# " << ev->Sender);
286293
ServerIds.insert(serverId);
287-
ActivateServer(TabletId, serverId, owner, recipientId, leader, generation);
294+
ActivateServer(TabletId, serverId, owner, recipientId, leader, generation, versionInfo);
288295
return serverId;
289296
}
290297

@@ -293,7 +300,7 @@ namespace NTabletPipe {
293300
const TActorId clientId = ActorIdFromProto(ev->Get()->Record.GetClientId());
294301
LOG_DEBUG_S(*TlsActivationContext, NKikimrServices::PIPE_SERVER, "[" << TabletId << "]"
295302
<< " Reject Connect Originator# " << ev->Sender);
296-
owner.Send(clientId, new TEvTabletPipe::TEvConnectResult(status, TabletId, clientId, TActorId(), leader, 0));
303+
owner.Send(clientId, new TEvTabletPipe::TEvConnectResult(status, TabletId, clientId, TActorId(), leader, 0, {}));
297304
}
298305

299306
void Stop(TActorIdentity owner) override {
@@ -328,10 +335,10 @@ namespace NTabletPipe {
328335
return serverId;
329336
}
330337

331-
void Activate(TActorIdentity owner, TActorId recipientId, bool leader, ui64 generation) override {
338+
void Activate(TActorIdentity owner, TActorId recipientId, bool leader, ui64 generation, const TString &versionInfo) override {
332339
LOG_DEBUG_S(*TlsActivationContext, NKikimrServices::PIPE_SERVER, "[" << TabletId << "]" << " Activate");
333340
for (const auto& serverId : ActivatePending) {
334-
ActivateServer(TabletId, serverId, owner, recipientId, leader, generation);
341+
ActivateServer(TabletId, serverId, owner, recipientId, leader, generation, versionInfo);
335342
}
336343

337344
ActivatePending.clear();
@@ -369,8 +376,10 @@ namespace NTabletPipe {
369376
return new TConnectAcceptor(tabletId);
370377
}
371378

372-
void ActivateServer(ui64 tabletId, TActorId serverId, TActorIdentity owner, TActorId recipientId, bool leader, ui64 generation) {
373-
owner.Send(serverId, new TEvTabletPipe::TEvActivate(tabletId, owner, recipientId, leader, generation));
379+
void ActivateServer(ui64 tabletId, TActorId serverId, TActorIdentity owner, TActorId recipientId,
380+
bool leader, ui64 generation, const TString& versionInfo)
381+
{
382+
owner.Send(serverId, new TEvTabletPipe::TEvActivate(tabletId, owner, recipientId, leader, generation, versionInfo));
374383
}
375384

376385
void CloseServer(TActorIdentity owner, TActorId serverId) {

ydb/core/tablet/tablet_pipe_ut.cpp

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,74 @@ Y_UNIT_TEST_SUITE(TTabletPipeTest) {
11511151
UNIT_ASSERT_C(handle->Recipient == sender2, "Event recipient " << handle->Recipient << " != " << sender2);
11521152
}
11531153

1154+
class TTabletWithVersionInfo
1155+
: public TActor<TTabletWithVersionInfo>
1156+
, public NTabletFlatExecutor::TTabletExecutedFlat
1157+
{
1158+
public:
1159+
TTabletWithVersionInfo(const TActorId &tablet, TTabletStorageInfo *info)
1160+
: TActor(&TThis::StateInit)
1161+
, TTabletExecutedFlat(info, tablet, nullptr)
1162+
{}
1163+
1164+
private:
1165+
void DefaultSignalTabletActive(const TActorContext&) override {
1166+
// must be empty
1167+
}
1168+
1169+
void OnActivateExecutor(const TActorContext& ctx) override {
1170+
Become(&TThis::StateWork);
1171+
SignalTabletActive(ctx, "my version info");
1172+
}
1173+
1174+
void OnDetach(const TActorContext &ctx) override {
1175+
return Die(ctx);
1176+
}
1177+
1178+
void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override {
1179+
return Die(ctx);
1180+
}
1181+
1182+
STFUNC(StateInit) {
1183+
StateInitImpl(ev, SelfId());
1184+
}
1185+
1186+
STFUNC(StateWork) {
1187+
switch (ev->GetTypeRewrite()) {
1188+
default:
1189+
HandleDefaultEvents(ev, SelfId());
1190+
}
1191+
}
1192+
};
1193+
1194+
Y_UNIT_TEST(TestPipeWithVersionInfo) {
1195+
TTestBasicRuntime runtime;
1196+
SetupTabletServices(runtime);
1197+
1198+
CreateTestBootstrapper(runtime,
1199+
CreateTestTabletInfo(TTestTxConfig::TxTablet0, TTabletTypes::Dummy),
1200+
[](const TActorId & tablet, TTabletStorageInfo* info) {
1201+
return new TTabletWithVersionInfo(tablet, info);
1202+
});
1203+
1204+
{
1205+
TDispatchOptions options;
1206+
options.FinalEvents.push_back(TDispatchOptions::TFinalEventCondition(TEvTablet::EvBoot, 1));
1207+
runtime.DispatchEvents(options);
1208+
}
1209+
1210+
auto sender = runtime.AllocateEdgeActor();
1211+
auto client = runtime.Register(NTabletPipe::CreateClient(sender, TTestTxConfig::TxTablet0));
1212+
{
1213+
auto ev = runtime.GrabEdgeEvent<TEvTabletPipe::TEvClientConnected>(sender);
1214+
UNIT_ASSERT(ev);
1215+
auto* msg = ev->Get();
1216+
UNIT_ASSERT_VALUES_EQUAL(msg->Status, NKikimrProto::OK);
1217+
UNIT_ASSERT_VALUES_EQUAL(msg->VersionInfo, "my version info");
1218+
}
1219+
Y_UNUSED(client);
1220+
}
1221+
11541222
}
11551223

11561224
}

ydb/core/tablet/tablet_sys.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,22 +1002,24 @@ void TTablet::Handle(TEvTablet::TEvPing::TPtr &ev) {
10021002
}
10031003

10041004
void TTablet::HandleByLeader(TEvTablet::TEvTabletActive::TPtr &ev) {
1005-
Y_UNUSED(ev);
1005+
auto *msg = ev->Get();
1006+
TabletVersionInfo = std::move(msg->VersionInfo);
10061007
ReportTabletStateChange(TTabletStateInfo::Active);
10071008
Send(Launcher, new TEvTablet::TEvReady(TabletID(), StateStorageInfo.KnownGeneration, UserTablet));
10081009
ActivateTime = AppData()->TimeProvider->Now();
10091010
BLOG_I("Active! Generation: " << StateStorageInfo.KnownGeneration
10101011
<< ", Type: " << TTabletTypes::TypeToStr((TTabletTypes::EType)Info->TabletType)
10111012
<< " started in " << (ActivateTime-BoostrapTime).MilliSeconds() << "msec", "TSYS24");
10121013

1013-
PipeConnectAcceptor->Activate(SelfId(), UserTablet, true, StateStorageInfo.KnownGeneration);
1014+
PipeConnectAcceptor->Activate(SelfId(), UserTablet, true, StateStorageInfo.KnownGeneration, TabletVersionInfo);
10141015
}
10151016

10161017
void TTablet::HandleByFollower(TEvTablet::TEvTabletActive::TPtr &ev) {
1017-
Y_UNUSED(ev);
1018+
auto *msg = ev->Get();
1019+
TabletVersionInfo = std::move(msg->VersionInfo);
10181020
BLOG_D("Follower TabletStateActive", "TSYS25");
10191021

1020-
PipeConnectAcceptor->Activate(SelfId(), UserTablet, false, StateStorageInfo.KnownGeneration);
1022+
PipeConnectAcceptor->Activate(SelfId(), UserTablet, false, StateStorageInfo.KnownGeneration, TabletVersionInfo);
10211023

10221024
Send(FollowerStStGuardian, new TEvTablet::TEvFollowerUpdateState(false, SelfId(), UserTablet));
10231025
ReportTabletStateChange(TTabletStateInfo::Active);
@@ -1506,7 +1508,7 @@ void TTablet::Handle(TEvTabletPipe::TEvConnect::TPtr& ev) {
15061508
if (PipeConnectAcceptor->IsStopped()) {
15071509
PipeConnectAcceptor->Reject(ev, SelfId(), NKikimrProto::TRYLATER, Leader);
15081510
} else if (PipeConnectAcceptor->IsActive()) {
1509-
PipeConnectAcceptor->Accept(ev, SelfId(), UserTablet, Leader, StateStorageInfo.KnownGeneration);
1511+
PipeConnectAcceptor->Accept(ev, SelfId(), UserTablet, Leader, StateStorageInfo.KnownGeneration, TabletVersionInfo);
15101512
} else {
15111513
PipeConnectAcceptor->Enqueue(ev, SelfId());
15121514
}
@@ -1528,7 +1530,7 @@ void TTablet::HandleQueued(TEvTabletPipe::TEvConnect::TPtr& ev) {
15281530
void TTablet::HandleByFollower(TEvTabletPipe::TEvConnect::TPtr &ev) {
15291531
Y_DEBUG_ABORT_UNLESS(!Leader);
15301532
if (PipeConnectAcceptor->IsActive() && !PipeConnectAcceptor->IsStopped()) {
1531-
PipeConnectAcceptor->Accept(ev, SelfId(), UserTablet, false, StateStorageInfo.KnownGeneration);
1533+
PipeConnectAcceptor->Accept(ev, SelfId(), UserTablet, false, StateStorageInfo.KnownGeneration, TabletVersionInfo);
15321534
} else {
15331535
PipeConnectAcceptor->Reject(ev, SelfId(), NKikimrProto::TRYLATER, false);
15341536
}

ydb/core/tablet/tablet_sys.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ class TTablet : public TActor<TTablet> {
214214
bool NeedCleanupOnLockedPath;
215215
ui32 GcCounter;
216216
THolder<NTabletPipe::IConnectAcceptor> PipeConnectAcceptor;
217+
TString TabletVersionInfo;
217218
TInstant BoostrapTime;
218219
TInstant ActivateTime;
219220
bool Leader;

ydb/core/tablet_flat/tablet_flat_executed.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,12 @@ void TTabletExecutedFlat::HandleLocalReadColumns(TEvTablet::TEvLocalReadColumns:
152152
Execute(Factory->Make(ev), ctx);
153153
}
154154

155-
void TTabletExecutedFlat::SignalTabletActive(const TActorIdentity &id) {
156-
id.Send(Tablet(), new TEvTablet::TEvTabletActive());
155+
void TTabletExecutedFlat::SignalTabletActive(const TActorIdentity &id, TString &&versionInfo) {
156+
id.Send(Tablet(), new TEvTablet::TEvTabletActive(std::move(versionInfo)));
157157
}
158158

159-
void TTabletExecutedFlat::SignalTabletActive(const TActorContext &ctx) {
160-
ctx.Send(Tablet(), new TEvTablet::TEvTabletActive());
159+
void TTabletExecutedFlat::SignalTabletActive(const TActorContext &ctx, TString &&versionInfo) {
160+
ctx.Send(Tablet(), new TEvTablet::TEvTabletActive(std::move(versionInfo)));
161161
}
162162

163163
void TTabletExecutedFlat::Enqueue(STFUNC_SIG) {

ydb/core/tablet_flat/tablet_flat_executed.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ class TTabletExecutedFlat : public NFlatExecutorSetup::ITablet {
4242
/**
4343
* Signal tablet as active and ready to process requests (from pipes).
4444
*/
45-
void SignalTabletActive(const TActorIdentity &id);
46-
void SignalTabletActive(const TActorContext &ctx);
45+
void SignalTabletActive(const TActorIdentity &id, TString &&versionInfo = {});
46+
void SignalTabletActive(const TActorContext &ctx, TString &&versionInfo = {});
4747

4848
/**
4949
* Must be overriden as an empty method. Previously default implementation

0 commit comments

Comments
 (0)