@@ -448,10 +448,9 @@ Y_UNIT_TEST_SUITE(TPDiskTest) {
448
448
UNIT_ASSERT (vdisk.Chunks [EChunkState::COMMITTED].size () == 1 );
449
449
const ui32 reservedChunk = *vdisk.Chunks [EChunkState::COMMITTED].begin ();
450
450
451
- TString chunkWriteData = PrepareData (1024 );
452
451
testCtx.TestResponse <NPDisk::TEvChunkWriteResult>(
453
452
new NPDisk::TEvChunkWrite (vdisk.PDiskParams ->Owner , vdisk.PDiskParams ->OwnerRound ,
454
- reservedChunk, 0 , new NPDisk::TEvChunkWrite::TStrokaBackedUpParts (chunkWriteData ), nullptr , false , 0 ),
453
+ reservedChunk, 0 , new NPDisk::TEvChunkWrite::TAlignedParts ( PrepareData ( 1024 ) ), nullptr , false , 0 ),
455
454
NKikimrProto::OK);
456
455
457
456
bool printed = false ;
@@ -493,9 +492,8 @@ Y_UNIT_TEST_SUITE(TPDiskTest) {
493
492
ui32 errors = 0 ;
494
493
bool printed = false ;
495
494
for (ui32 i = 0 ; i < 10'000 ; ++i) {
496
- TString data = PrepareData (1024 );
497
495
testCtx.Send (new NPDisk::TEvChunkWrite (evInitRes->PDiskParams ->Owner , evInitRes->PDiskParams ->OwnerRound ,
498
- reservedChunk, 0 , new NPDisk::TEvChunkWrite::TStrokaBackedUpParts (data ), nullptr , false , 0 ));
496
+ reservedChunk, 0 , new NPDisk::TEvChunkWrite::TAlignedParts ( PrepareData ( 1024 ) ), nullptr , false , 0 ));
499
497
500
498
const auto res = testCtx.Recv <NPDisk::TEvChunkWriteResult>();
501
499
// Ctest << res->ToString() << Endl;
@@ -796,9 +794,8 @@ Y_UNIT_TEST_SUITE(TPDiskTest) {
796
794
UNIT_ASSERT_VALUES_EQUAL (evReadRes->Data .ToString (), data);
797
795
};
798
796
799
- TString dataCopy = data;
800
797
testCtx.TestResponse <NPDisk::TEvChunkWriteResult>(new NPDisk::TEvChunkWrite (mock.PDiskParams ->Owner , mock.PDiskParams ->OwnerRound ,
801
- chunk, 0 , new NPDisk::TEvChunkWrite::TStrokaBackedUpParts (dataCopy ), nullptr , false , 0 ),
798
+ chunk, 0 , new NPDisk::TEvChunkWrite::TAlignedParts ( TString (data) ), nullptr , false , 0 ),
802
799
NKikimrProto::OK);
803
800
mock.CommitReservedChunks ();
804
801
@@ -842,9 +839,8 @@ Y_UNIT_TEST_SUITE(TPDiskTest) {
842
839
mock.ReserveChunk ();
843
840
const ui32 chunk = *mock.Chunks [EChunkState::RESERVED].begin ();
844
841
845
- TString dataCopy = data;
846
842
testCtx.TestResponse <NPDisk::TEvChunkWriteResult>(new NPDisk::TEvChunkWrite (mock.PDiskParams ->Owner , mock.PDiskParams ->OwnerRound ,
847
- chunk, 0 , new NPDisk::TEvChunkWrite::TStrokaBackedUpParts (dataCopy ), nullptr , false , 0 ),
843
+ chunk, 0 , new NPDisk::TEvChunkWrite::TAlignedParts ( TString (data) ), nullptr , false , 0 ),
848
844
NKikimrProto::OK);
849
845
mock.CommitReservedChunks ();
850
846
testCtx.TestResponse <NPDisk::TEvCheckSpaceResult>(
@@ -954,8 +950,7 @@ Y_UNIT_TEST_SUITE(TPDiskTest) {
954
950
auto chunk1 = *vdisk1.Chunks [EChunkState::COMMITTED].begin ();
955
951
auto chunk2 = *vdisk2.Chunks [EChunkState::COMMITTED].begin ();
956
952
957
- TString data (123 , ' 0' );
958
- auto parts = MakeIntrusive<NPDisk::TEvChunkWrite::TStrokaBackedUpParts>(data);
953
+ auto parts = MakeIntrusive<NPDisk::TEvChunkWrite::TAlignedParts>(TString (123 , ' 0' ));
959
954
960
955
// write to own chunk is OK
961
956
testCtx.TestResponse <NPDisk::TEvChunkWriteResult>(new NPDisk::TEvChunkWrite (
@@ -996,8 +991,7 @@ Y_UNIT_TEST_SUITE(TPDiskTest) {
996
991
for (ui32 i = 0 ; i < 100 ; ++i) {
997
992
testCtx.Send (new NPDisk::TEvLog (
998
993
vdisk.PDiskParams ->Owner , vdisk.PDiskParams ->OwnerRound , 0 , TRcBuf (PrepareData (logBuffSize)), vdisk.GetLsnSeg (), nullptr ));
999
- auto data = PrepareData (chunkBuffSize);
1000
- auto parts = MakeIntrusive<NPDisk::TEvChunkWrite::TStrokaBackedUpParts>(data);
994
+ auto parts = MakeIntrusive<NPDisk::TEvChunkWrite::TAlignedParts>(PrepareData (chunkBuffSize));
1001
995
testCtx.Send (new NPDisk::TEvChunkWrite (
1002
996
vdisk.PDiskParams ->Owner , vdisk.PDiskParams ->OwnerRound ,
1003
997
chunk, 0 , parts, nullptr , false , 0 ));
@@ -1028,6 +1022,112 @@ Y_UNIT_TEST_SUITE(TPDiskTest) {
1028
1022
Cerr << " all log writes are received" << Endl;
1029
1023
}
1030
1024
}
1025
+
1026
+ NPDisk::TEvChunkWrite::TPartsPtr GenParts (TReallyFastRng32& rng, size_t size) {
1027
+ static int testCase = 0 ;
1028
+ switch (testCase++) {
1029
+ case 0 : {
1030
+ auto data = PrepareData (size);
1031
+
1032
+ auto counter = MakeIntrusive<::NMonitoring::TCounterForPtr>();
1033
+ TMemoryConsumer consumer (counter);
1034
+ TTrackableBuffer buffer (std::move (consumer), data.data (), data.size ());
1035
+ return MakeIntrusive<NPDisk::TEvChunkWrite::TBufBackedUpParts>(std::move (buffer));
1036
+ }
1037
+ case 1 : {
1038
+ size_t partsCount = rng.Uniform (1 , 10 );
1039
+ TRope rope;
1040
+ size_t createdBytes = 0 ;
1041
+ if (size >= partsCount) {
1042
+ for (size_t i = 0 ; i < partsCount - 1 ; ++i) {
1043
+ TRope x (PrepareData (rng.Uniform (1 , size / partsCount)));
1044
+ createdBytes += x.size ();
1045
+ rope.Insert (rope.End (), std::move (x));
1046
+ }
1047
+ }
1048
+ if (createdBytes < size) {
1049
+ rope.Insert (rope.End (), TRope (PrepareData (size - createdBytes)));
1050
+ }
1051
+ return MakeIntrusive<NPDisk::TEvChunkWrite::TRopeAlignedParts>(std::move (rope), size);
1052
+ }
1053
+ case 2 : {
1054
+ testCase = 0 ;
1055
+ return MakeIntrusive<NPDisk::TEvChunkWrite::TAlignedParts>(PrepareData (size));
1056
+ }
1057
+ }
1058
+ UNIT_ASSERT (false );
1059
+ return nullptr ;
1060
+ }
1061
+
1062
+ TString ConvertIPartsToString (NPDisk::TEvChunkWrite::IParts* parts) {
1063
+ auto data = TString::Uninitialized (parts->ByteSize ());
1064
+ char *ptr = data.Detach ();
1065
+ for (ui32 i = 0 ; i < parts->Size (); ++i) {
1066
+ auto [buf, bufSize] = (*parts)[i];
1067
+ memcpy (ptr, buf, bufSize);
1068
+ ptr += bufSize;
1069
+ }
1070
+ return data;
1071
+ }
1072
+
1073
+ Y_UNIT_TEST (ChunkWriteDifferentOffsetAndSize) {
1074
+ TActorTestContext testCtx{{}};
1075
+
1076
+ TVDiskMock vdisk (&testCtx);
1077
+ vdisk.InitFull ();
1078
+
1079
+ vdisk.ReserveChunk ();
1080
+ vdisk.CommitReservedChunks ();
1081
+ UNIT_ASSERT (vdisk.Chunks [EChunkState::COMMITTED].size () == 1 );
1082
+ const ui32 reservedChunk = *vdisk.Chunks [EChunkState::COMMITTED].begin ();
1083
+
1084
+ auto seed = TInstant::Now ().MicroSeconds ();
1085
+ Cerr << " seed# " << seed << Endl;
1086
+ TReallyFastRng32 rng (seed);
1087
+
1088
+ auto blockSize = vdisk.PDiskParams ->AppendBlockSize ;
1089
+ size_t maxSize = 8 * blockSize;
1090
+ for (ui32 offset = 0 ; offset <= vdisk.PDiskParams ->ChunkSize - maxSize; offset += rng.Uniform (vdisk.PDiskParams ->ChunkSize / 100 )) {
1091
+ offset = offset / blockSize * blockSize;
1092
+ auto size = rng.Uniform (1 , maxSize + 1 ); // + 1 for maxSize to be included in distribution
1093
+ NPDisk::TEvChunkWrite::TPartsPtr parts = GenParts (rng, size);
1094
+ Ctest << " offset# " << offset << " size# " << size << Endl;
1095
+ testCtx.TestResponse <NPDisk::TEvChunkWriteResult>(
1096
+ new NPDisk::TEvChunkWrite (vdisk.PDiskParams ->Owner , vdisk.PDiskParams ->OwnerRound ,
1097
+ reservedChunk, offset, parts, nullptr , false , 0 ),
1098
+ NKikimrProto::OK);
1099
+ auto res = testCtx.TestResponse <NPDisk::TEvChunkReadResult>(
1100
+ new NPDisk::TEvChunkRead (vdisk.PDiskParams ->Owner , vdisk.PDiskParams ->OwnerRound ,
1101
+ reservedChunk, offset, size, 0 , 0 ),
1102
+ NKikimrProto::OK);
1103
+ UNIT_ASSERT (ConvertIPartsToString (parts.Get ()) == res->Data .ToString ().Slice ());
1104
+ }
1105
+ }
1106
+
1107
+ Y_UNIT_TEST (ChunkWriteBadOffset) {
1108
+ TActorTestContext testCtx{{}};
1109
+
1110
+ TVDiskMock vdisk (&testCtx);
1111
+ vdisk.InitFull ();
1112
+
1113
+ vdisk.ReserveChunk ();
1114
+ vdisk.CommitReservedChunks ();
1115
+ UNIT_ASSERT (vdisk.Chunks [EChunkState::COMMITTED].size () == 1 );
1116
+ const ui32 reservedChunk = *vdisk.Chunks [EChunkState::COMMITTED].begin ();
1117
+
1118
+ auto seed = TInstant::Now ().MicroSeconds ();
1119
+ Cerr << " seed# " << seed << Endl;
1120
+ TReallyFastRng32 rng (seed);
1121
+
1122
+ auto blockSize = vdisk.PDiskParams ->AppendBlockSize ;
1123
+ for (ui32 offset = 1 ; offset < blockSize; offset += rng.Uniform (1 , blockSize / 20 )) {
1124
+ NPDisk::TEvChunkWrite::TPartsPtr parts = GenParts (rng, 1 );
1125
+ testCtx.TestResponse <NPDisk::TEvChunkWriteResult>(
1126
+ new NPDisk::TEvChunkWrite (vdisk.PDiskParams ->Owner , vdisk.PDiskParams ->OwnerRound ,
1127
+ reservedChunk, offset, parts, nullptr , false , 0 ),
1128
+ NKikimrProto::ERROR);
1129
+ }
1130
+ }
1031
1131
}
1032
1132
1033
1133
Y_UNIT_TEST_SUITE (PDiskCompatibilityInfo) {
0 commit comments