22#include " table_writer.h"
33#include " worker.h"
44
5+ #include < ydb/core/tx/datashard/ut_common/datashard_ut_common.h>
56#include < ydb/core/tx/replication/ut_helpers/test_env.h>
67#include < ydb/core/tx/replication/ut_helpers/test_table.h>
78
89#include < library/cpp/string_utils/base64/base64.h>
910#include < library/cpp/testing/unittest/registar.h>
1011
1112#include < util/string/printf.h>
13+ #include < util/string/strip.h>
1214
1315namespace NKikimr ::NReplication::NService {
1416
@@ -187,9 +189,6 @@ Y_UNIT_TEST_SUITE(LocalTableWriter) {
187189 env.Send <TEvService::TEvGetTxId>(writer, new TEvWorker::TEvData (" TestSource" , {
188190 TRecord (order++, R"( {"key":[1], "update":{"value":"10"}, "ts":[11,0]})" ),
189191 TRecord (order++, R"( {"key":[2], "update":{"value":"20"}, "ts":[12,0]})" ),
190- }));
191-
192- env.Send <TEvService::TEvGetTxId>(writer, new TEvWorker::TEvData (" TestSource" , {
193192 TRecord (order++, R"( {"key":[1], "update":{"value":"10"}, "ts":[21,0]})" ),
194193 TRecord (order++, R"( {"key":[2], "update":{"value":"20"}, "ts":[22,0]})" ),
195194 }));
@@ -211,7 +210,7 @@ Y_UNIT_TEST_SUITE(LocalTableWriter) {
211210 }
212211
213212 Y_UNIT_TEST (WaitTxIds) {
214- class TMockWorker : public TActorBootstrapped <TMockWorker> {
213+ class TMockWorker : public TActor <TMockWorker> {
215214 void Handle (TEvWorker::TEvHandshake::TPtr& ev) {
216215 if (ev->Sender == Edge) {
217216 ev->Sender = SelfId ();
@@ -232,14 +231,11 @@ Y_UNIT_TEST_SUITE(LocalTableWriter) {
232231
233232 public:
234233 explicit TMockWorker (const TActorId& writer, const TActorId& edge)
235- : Writer(writer)
234+ : TActor(&TThis::StateWork)
235+ , Writer(writer)
236236 , Edge(edge)
237237 {}
238238
239- void Bootstrap () {
240- Become (&TThis::StateWork);
241- }
242-
243239 STATEFN (StateWork) {
244240 switch (ev->GetTypeRewrite ()) {
245241 hFunc (TEvWorker::TEvHandshake, Handle);
@@ -288,7 +284,7 @@ Y_UNIT_TEST_SUITE(LocalTableWriter) {
288284 }
289285
290286 Y_UNIT_TEST (DataAlongWithHeartbeat) {
291- class TMockWorker : public TActorBootstrapped <TMockWorker> {
287+ class TMockWorker : public TActor <TMockWorker> {
292288 void Handle (TEvWorker::TEvHandshake::TPtr& ev) {
293289 if (ev->Sender == Edge) {
294290 ev->Sender = SelfId ();
@@ -315,14 +311,11 @@ Y_UNIT_TEST_SUITE(LocalTableWriter) {
315311
316312 public:
317313 explicit TMockWorker (const TActorId& writer, const TActorId& edge)
318- : Writer(writer)
314+ : TActor(&TThis::StateWork)
315+ , Writer(writer)
319316 , Edge(edge)
320317 {}
321318
322- void Bootstrap () {
323- Become (&TThis::StateWork);
324- }
325-
326319 STATEFN (StateWork) {
327320 switch (ev->GetTypeRewrite ()) {
328321 hFunc (TEvWorker::TEvHandshake, Handle);
@@ -369,6 +362,50 @@ Y_UNIT_TEST_SUITE(LocalTableWriter) {
369362 }));
370363 env.GetRuntime ().GrabEdgeEvent <TEvWorker::TEvPoll>(env.GetSender ());
371364 }
365+
366+ Y_UNIT_TEST (ApplyInCorrectOrder) {
367+ TEnv env;
368+ env.GetRuntime ().SetLogPriority (NKikimrServices::REPLICATION_SERVICE, NLog::PRI_DEBUG);
369+
370+ env.CreateTable (" /Root" , *MakeTableDescription (TTestTableDescription{
371+ .Name = " Table" ,
372+ .KeyColumns = {" key" },
373+ .Columns = {
374+ {.Name = " key" , .Type = " Uint32" },
375+ {.Name = " value" , .Type = " Utf8" },
376+ },
377+ .ReplicationConfig = TTestTableDescription::TReplicationConfig{
378+ .Mode = TTestTableDescription::TReplicationConfig::MODE_READ_ONLY,
379+ .ConsistencyLevel = TTestTableDescription::TReplicationConfig::CONSISTENCY_LEVEL_GLOBAL,
380+ },
381+ }));
382+
383+ auto writer = env.GetRuntime ().Register (CreateLocalTableWriter (env.GetPathId (" /Root/Table" ), EWriteMode::Consistent));
384+ env.Send <TEvWorker::TEvHandshake>(writer, new TEvWorker::TEvHandshake ());
385+
386+ env.Send <TEvService::TEvGetTxId>(writer, new TEvWorker::TEvData (" TestSource" , {
387+ TRecord (1 , R"( {"key":[1], "update":{"value":"10"}, "ts":[1,0]})" ),
388+ }));
389+ env.Send <TEvWorker::TEvPoll>(writer, MakeTxIdResult ({
390+ {TRowVersion (10 , 0 ), 1 },
391+ }));
392+
393+ env.Send <TEvService::TEvGetTxId>(writer, new TEvWorker::TEvData (" TestSource" , {
394+ TRecord (2 , R"( {"key":[3], "update":{"value":"30"}, "ts":[11,0]})" ),
395+ TRecord (3 , R"( {"key":[2], "update":{"value":"20"}, "ts":[2,0]})" ),
396+ TRecord (4 , R"( {"resolved":[20,0]})" ),
397+ }));
398+ env.Send <TEvService::TEvHeartbeat>(writer, MakeTxIdResult ({
399+ {TRowVersion (20 , 0 ), 2 },
400+ }));
401+ env.GetRuntime ().GrabEdgeEvent <TEvWorker::TEvPoll>(env.GetSender ());
402+
403+ CommitWrites (env.GetRuntime (), {" /Root/Table" }, 1 );
404+ CommitWrites (env.GetRuntime (), {" /Root/Table" }, 2 );
405+
406+ auto content = ReadShardedTable (env.GetRuntime (), " /Root/Table" );
407+ UNIT_ASSERT_STRINGS_EQUAL (StripInPlace (content), " key = 1, value = 10\n key = 2, value = 20\n key = 3, value = 30" );
408+ }
372409}
373410
374411}
0 commit comments