@@ -128,10 +128,16 @@ TCompletionChunkReadPart::TCompletionChunkReadPart(TPDisk *pDisk, TIntrusivePtr<
128128 , PayloadReadSize(payloadReadSize)
129129 , CommonBufferOffset(commonBufferOffset)
130130 , CumulativeCompletion(cumulativeCompletion)
131+ , ChunkNonce(CumulativeCompletion->GetChunkNonce ())
131132 , Buffer(PDisk->BufferPool->Pop ())
132133 , IsTheLastPart(isTheLastPart)
133134 , Span(std::move(span))
134135{
136+ TCompletionAction::CanBeExecutedInAdditionalCompletionThread = true ;
137+
138+ TBufferWithGaps *commonBuffer = CumulativeCompletion->GetCommonBuffer ();
139+ Destination = commonBuffer->RawDataPtr (CommonBufferOffset, PayloadReadSize);
140+
135141 if (!IsTheLastPart) {
136142 CumulativeCompletion->AddPart ();
137143 }
@@ -166,8 +172,6 @@ void TCompletionChunkReadPart::Exec(TActorSystem *actorSystem) {
166172 Read->Offset + CommonBufferOffset, PayloadReadSize, firstSector, lastSector, sectorOffset);
167173 Y_ABORT_UNLESS (isOk);
168174
169- TBufferWithGaps *commonBuffer = CumulativeCompletion->GetCommonBuffer ();
170- ui8 *destination = commonBuffer->RawDataPtr (CommonBufferOffset, PayloadReadSize);
171175
172176 ui8* source = Buffer->Data ();
173177
@@ -183,8 +187,6 @@ void TCompletionChunkReadPart::Exec(TActorSystem *actorSystem) {
183187 sectorOffset = 0 ;
184188 }
185189
186- ui64 chunkNonce = CumulativeCompletion->GetChunkNonce ();
187-
188190 ui32 beginBadUserOffset = 0xffffffff ;
189191 ui32 endBadUserOffset = 0xffffffff ;
190192 ui32 userSectorSize = format.SectorPayloadSize ();
@@ -193,7 +195,7 @@ void TCompletionChunkReadPart::Exec(TActorSystem *actorSystem) {
193195
194196 TSectorRestorator restorator (false , 1 , false ,
195197 format, PDisk->PCtx .get (), &PDisk->Mon , PDisk->BufferPool .Get ());
196- ui64 lastNonce = Min ((ui64)0 , chunkNonce - 1 );
198+ ui64 lastNonce = Min ((ui64)0 , ChunkNonce - 1 );
197199 restorator.Restore (source, format.Offset (Read->ChunkIdx , sectorIdx), format.MagicDataChunk , lastNonce,
198200 Read->Owner );
199201
@@ -211,7 +213,7 @@ void TCompletionChunkReadPart::Exec(TActorSystem *actorSystem) {
211213 << " for owner# " << Read->Owner
212214 << " beginBadUserOffet# " << beginBadUserOffset << " endBadUserOffset# " << endBadUserOffset
213215 << " due to multiple sectors with incorrect hashes. Marker# BPC001" );
214- commonBuffer ->AddGap (beginBadUserOffset, endBadUserOffset);
216+ CumulativeCompletion ->AddGap (beginBadUserOffset, endBadUserOffset);
215217 beginBadUserOffset = 0xffffffff ;
216218 endBadUserOffset = 0xffffffff ;
217219 }
@@ -221,35 +223,35 @@ void TCompletionChunkReadPart::Exec(TActorSystem *actorSystem) {
221223
222224 // Decrypt data
223225 if (beginBadUserOffset != 0xffffffff ) {
224- memset (destination , 0 , sectorPayloadSize);
226+ memset (Destination , 0 , sectorPayloadSize);
225227 } else {
226228 TDataSectorFooter *footer = (TDataSectorFooter*) (source + format.SectorSize - sizeof (TDataSectorFooter));
227- if (footer->Nonce != chunkNonce + sectorIdx) {
229+ if (footer->Nonce != ChunkNonce + sectorIdx) {
228230 ui32 userOffset = sectorIdx * userSectorSize;
229231 LOG_INFO_S (*actorSystem, NKikimrServices::BS_PDISK, " PDiskId# " << PDisk->PCtx ->PDiskId
230232 << " ReqId# " << Read->ReqId
231233 << " Can't read chunk chunkIdx# " << Read->ChunkIdx
232234 << " for owner# " << Read->Owner
233- << " nonce mismatch: expected# " << (ui64)(chunkNonce + sectorIdx)
235+ << " nonce mismatch: expected# " << (ui64)(ChunkNonce + sectorIdx)
234236 << " , on-disk# " << (ui64)footer->Nonce
235237 << " for userOffset# " << userOffset
236238 << " ! Marker# BPC002" );
237239 if (beginBadUserOffset == 0xffffffff ) {
238240 beginBadUserOffset = userOffset;
239241 }
240242 endBadUserOffset = beginUserOffset + userSectorSize;
241- memset (destination , 0 , sectorPayloadSize);
243+ memset (Destination , 0 , sectorPayloadSize);
242244 } else {
243245 cypher.StartMessage (footer->Nonce );
244- if (sectorOffset > 0 || intptr_t (destination ) % 32 ) {
246+ if (sectorOffset > 0 || intptr_t (Destination ) % 32 ) {
245247 cypher.InplaceEncrypt (source, sectorOffset + sectorPayloadSize);
246248 if (CommonBufferOffset == 0 || !IsTheLastPart) {
247- memcpy (destination , source + sectorOffset, sectorPayloadSize);
249+ memcpy (Destination , source + sectorOffset, sectorPayloadSize);
248250 } else {
249- memcpy (destination , source, sectorPayloadSize);
251+ memcpy (Destination , source, sectorPayloadSize);
250252 }
251253 } else {
252- cypher.Encrypt (destination , source, sectorPayloadSize);
254+ cypher.Encrypt (Destination , source, sectorPayloadSize);
253255 }
254256 if (CanarySize > 0 ) {
255257 ui32 canaryPosition = sectorOffset + sectorPayloadSize;
@@ -259,7 +261,7 @@ void TCompletionChunkReadPart::Exec(TActorSystem *actorSystem) {
259261 }
260262 }
261263 }
262- destination += sectorPayloadSize;
264+ Destination += sectorPayloadSize;
263265 source += format.SectorSize ;
264266 PayloadReadSize -= sectorPayloadSize;
265267 sectorPayloadSize = Min (format.SectorPayloadSize (), PayloadReadSize);
@@ -273,7 +275,7 @@ void TCompletionChunkReadPart::Exec(TActorSystem *actorSystem) {
273275 << " for owner# " << Read->Owner
274276 << " beginBadUserOffet# " << beginBadUserOffset << " endBadUserOffset# " << endBadUserOffset
275277 << " due to multiple sectors with incorrect hashes/nonces. Marker# BPC003" );
276- commonBuffer ->AddGap (beginBadUserOffset, endBadUserOffset);
278+ CumulativeCompletion ->AddGap (beginBadUserOffset, endBadUserOffset);
277279 beginBadUserOffset = 0xffffffff ;
278280 endBadUserOffset = 0xffffffff ;
279281 }
@@ -407,4 +409,3 @@ void TChunkTrimCompletion::Exec(TActorSystem *actorSystem) {
407409
408410} // NPDisk
409411} // NKikimr
410-
0 commit comments