@@ -286,6 +286,89 @@ Y_UNIT_TEST_SUITE(LocalTableWriter) {
286286 {TRowVersion (20 , 0 ), 2 },
287287 }));
288288 }
289+
290+ Y_UNIT_TEST (DataAlongWithHeartbeat) {
291+ class TMockWorker : public TActorBootstrapped <TMockWorker> {
292+ void Handle (TEvWorker::TEvHandshake::TPtr& ev) {
293+ if (ev->Sender == Edge) {
294+ ev->Sender = SelfId ();
295+ Send (ev->Forward (Writer));
296+ } else {
297+ Send (ev->Forward (Edge));
298+ }
299+ }
300+
301+ void Handle (TEvService::TEvGetTxId::TPtr& ev) {
302+ ++GetTxIds;
303+ Send (ev->Forward (Edge));
304+ }
305+
306+ void Handle (TEvService::TEvHeartbeat::TPtr& ev) {
307+ UNIT_ASSERT (Heartbeats++ < GetTxIds);
308+ Send (ev->Forward (Edge));
309+ }
310+
311+ void Handle (TEvWorker::TEvPoll::TPtr& ev) {
312+ UNIT_ASSERT (Polls++ < Heartbeats);
313+ Send (ev->Forward (Edge));
314+ }
315+
316+ public:
317+ explicit TMockWorker (const TActorId& writer, const TActorId& edge)
318+ : Writer(writer)
319+ , Edge(edge)
320+ {}
321+
322+ void Bootstrap () {
323+ Become (&TThis::StateWork);
324+ }
325+
326+ STATEFN (StateWork) {
327+ switch (ev->GetTypeRewrite ()) {
328+ hFunc (TEvWorker::TEvHandshake, Handle);
329+ hFunc (TEvService::TEvGetTxId, Handle);
330+ hFunc (TEvService::TEvHeartbeat, Handle);
331+ hFunc (TEvWorker::TEvPoll, Handle);
332+ }
333+ }
334+
335+ private:
336+ const TActorId Writer;
337+ const TActorId Edge;
338+ ui32 GetTxIds = 0 ;
339+ ui32 Heartbeats = 0 ;
340+ ui32 Polls = 0 ;
341+ };
342+
343+ TEnv env;
344+ env.GetRuntime ().SetLogPriority (NKikimrServices::REPLICATION_SERVICE, NLog::PRI_DEBUG);
345+
346+ env.CreateTable (" /Root" , *MakeTableDescription (TTestTableDescription{
347+ .Name = " Table" ,
348+ .KeyColumns = {" key" },
349+ .Columns = {
350+ {.Name = " key" , .Type = " Uint32" },
351+ {.Name = " value" , .Type = " Utf8" },
352+ },
353+ .ReplicationConfig = TTestTableDescription::TReplicationConfig{
354+ .Mode = TTestTableDescription::TReplicationConfig::MODE_READ_ONLY,
355+ .ConsistencyLevel = TTestTableDescription::TReplicationConfig::CONSISTENCY_LEVEL_GLOBAL,
356+ },
357+ }));
358+
359+ auto writer = env.GetRuntime ().Register (CreateLocalTableWriter (env.GetPathId (" /Root/Table" ), EWriteMode::Consistent));
360+ auto worker = env.GetRuntime ().Register (new TMockWorker (writer, env.GetSender ()));
361+
362+ env.Send <TEvWorker::TEvHandshake>(worker, new TEvWorker::TEvHandshake ());
363+ env.Send <TEvService::TEvGetTxId>(writer, new TEvWorker::TEvData (" TestSource" , {
364+ TRecord (1 , R"( {"key":[1], "update":{"value":"10"}, "ts":[1,0]})" ),
365+ TRecord (2 , R"( {"resolved":[10,0]})" ),
366+ }));
367+ env.Send <TEvService::TEvHeartbeat>(writer, MakeTxIdResult ({
368+ {TRowVersion (10 , 0 ), 1 },
369+ }));
370+ env.GetRuntime ().GrabEdgeEvent <TEvWorker::TEvPoll>(env.GetSender ());
371+ }
289372}
290373
291374}
0 commit comments