@@ -490,15 +490,6 @@ TMaybe<TReadAnswer> TReadInfo::AddBlobsFromBody(const TVector<NPQ::TRequestedBlo
490490 TClientBlob &res = batch.Blobs [i];
491491 VERIFY_RESULT_BLOB (res, i);
492492
493- Y_ABORT_UNLESS (PartNo == res.GetPartNo (), " %s" ,
494- (TStringBuilder () <<
495- " \n pos=" << pos <<
496- " \n i=" << i <<
497- " \n Offset=" << Offset <<
498- " \n PartNo=" << PartNo <<
499- " \n offset=" << offset <<
500- " \n partNo=" << res.GetPartNo ()
501- ).data ());
502493 AFL_ENSURE (PartNo == res.GetPartNo ())(" pos" , pos)(" i" , i)(" Offset" , Offset)(" PartNo" , PartNo)(" offset" , offset)(" partNo" , res.GetPartNo ());
503494
504495 if (userInfo) {
@@ -641,29 +632,34 @@ TReadAnswer TReadInfo::FormAnswer(
641632
642633 AddResultBlob (readResult, writeBlob, Offset);
643634 if (writeBlob.IsLastPart ()) {
635+ PartNo = 0 ;
644636 ++Offset;
637+ } else {
638+ ++PartNo;
645639 }
646640 if (updateUsage (writeBlob)) {
647641 break ;
648642 }
649643 }
650644 }
651645
652- readAnswer = AddBlobsFromBody (blobs,
653- CompactedBlobsCount, blobs.size (),
654- userInfo,
655- startOffset,
656- endOffset,
657- sizeLag,
658- tablet,
659- realReadOffset,
660- readResult,
661- answer,
662- needStop,
663- cnt, size, lastBlobSize,
664- ctx);
665- if (readAnswer) {
666- return std::move (*readAnswer);
646+ if (!needStop && cnt < Count && size < Size) { // body blobs are fully processed and need to take more data
647+ readAnswer = AddBlobsFromBody (blobs,
648+ CompactedBlobsCount, blobs.size (),
649+ userInfo,
650+ startOffset,
651+ endOffset,
652+ sizeLag,
653+ tablet,
654+ realReadOffset,
655+ readResult,
656+ answer,
657+ needStop,
658+ cnt, size, lastBlobSize,
659+ ctx);
660+ if (readAnswer) {
661+ return std::move (*readAnswer);
662+ }
667663 }
668664
669665 AFL_ENSURE (Offset <= (ui64)Max<i64 >())(" Offset is too big" , Offset);
@@ -702,13 +698,14 @@ void TPartition::Handle(TEvPQ::TEvReadTimeout::TPtr& ev, const TActorContext& ct
702698 OnReadRequestFinished (res->Destination , answer.Size , res->User , ctx);
703699}
704700
705- void CollectReadRequestFromBody (const ui64 startOffset, const ui16 partNo, const ui32 maxCount,
701+ void CollectReadRequestFromBody (ui64 startOffset, const ui16 partNo, const ui32 maxCount,
706702 const ui32 maxSize, ui32* rcount, ui32* rsize, ui64 lastOffset,
707703 TBlobKeyTokens* blobKeyTokens,
708704 TPartitionBlobEncoder& zone,
709705 TVector<TRequestedBlob>& result)
710706{
711707 AFL_ENSURE (rcount && rsize);
708+ startOffset = Max (startOffset, zone.DataKeysBody .empty () ? zone.StartOffset : zone.DataKeysBody .front ().Key .GetOffset ());
712709 auto blobs = zone.GetBlobsFromBody (startOffset,
713710 partNo,
714711 maxCount,
@@ -860,7 +857,7 @@ void TPartition::DoRead(TEvPQ::TEvRead::TPtr&& readEvent, TDuration waitQuotaTim
860857
861858 LOG_D (" read cookie " << cookie << " Topic '" << TopicConverter->GetClientsideName () << " ' partition " << Partition
862859 << " user " << user
863- << " offset " << read->Offset << " count " << read->Count << " size " << read->Size << " endOffset " << GetEndOffset ()
860+ << " offset " << read->Offset << " partno " << read-> PartNo << " count " << read->Count << " size " << read->Size << " endOffset " << GetEndOffset ()
864861 << " max time lag " << read->MaxTimeLagMs << " ms effective offset " << offset);
865862
866863 if (offset == GetEndOffset ()) {
@@ -1068,14 +1065,6 @@ void TPartition::ProcessRead(const TActorContext& ctx, TReadInfo&& info, const u
10681065 GetReadRequestFromCompactedBody (info.Offset , info.PartNo , info.Count , info.Size , &count, &size, info.LastOffset ,
10691066 &info.BlobKeyTokens , blobs);
10701067 info.CompactedBlobsCount = blobs.size ();
1071- GetReadRequestFromFastWriteBody (info.Offset , info.PartNo , info.Count , info.Size , &count, &size, info.LastOffset ,
1072- &info.BlobKeyTokens , blobs);
1073-
1074- info.Blobs = blobs;
1075- ui64 lastOffset = blobs.empty () ? info.Offset : blobs.back ().Key .GetOffset ();
1076-
1077- LOG_D (" read cookie " << cookie << " added " << info.Blobs .size ()
1078- << " blobs, size " << size << " count " << count << " last offset " << lastOffset << " , current partition end offset: " << GetEndOffset ());
10791068
10801069 if (blobs.empty () ||
10811070 ((info.CompactedBlobsCount > 0 ) && (blobs[info.CompactedBlobsCount - 1 ].Key == CompactionBlobEncoder.DataKeysBody .back ().Key ))) { // read from head only when all blobs from body processed
@@ -1087,6 +1076,15 @@ void TPartition::ProcessRead(const TActorContext& ctx, TReadInfo&& info, const u
10871076 info.CachedOffset = insideHeadOffset;
10881077 }
10891078
1079+ GetReadRequestFromFastWriteBody (info.Offset , info.PartNo , info.Count , info.Size , &count, &size, info.LastOffset ,
1080+ &info.BlobKeyTokens , blobs);
1081+
1082+ info.Blobs = blobs;
1083+ ui64 lastOffset = blobs.empty () ? info.Offset : blobs.back ().Key .GetOffset ();
1084+
1085+ LOG_D (" read cookie " << cookie << " added " << info.Blobs .size ()
1086+ << " blobs, size " << size << " count " << count << " last offset " << lastOffset << " , current partition end offset: " << GetEndOffset ());
1087+
10901088 PQ_ENSURE (info.BlobKeyTokens .Size () == info.Blobs .size ());
10911089 if (info.Destination != 0 ) {
10921090 ++userInfo.ActiveReads ;
0 commit comments