@@ -29,6 +29,25 @@ class TPortionInfoConstructor {
2929 YDB_ACCESSOR_DEF (std::vector<TColumnRecord>, Records);
3030 std::vector<TUnifiedBlobId> BlobIds;
3131
32+ class TAddressBlobId {
33+ private:
34+ TChunkAddress Address;
35+ YDB_READONLY (TBlobRangeLink16::TLinkId, BlobIdx, 0 );
36+
37+ public:
38+ const TChunkAddress& GetAddress () const {
39+ return Address;
40+ }
41+
42+ TAddressBlobId (const TChunkAddress& address, const TBlobRangeLink16::TLinkId blobIdx)
43+ : Address(address)
44+ , BlobIdx(blobIdx)
45+ {
46+
47+ }
48+ };
49+ std::vector<TAddressBlobId> BlobIdxs;
50+
3251public:
3352 void SetPortionId (const ui64 value) {
3453 AFL_VERIFY (value);
@@ -226,19 +245,7 @@ class TPortionInfoConstructor {
226245 }
227246
228247 void RegisterBlobIdx (const TChunkAddress& address, const TBlobRangeLink16::TLinkId blobIdx) {
229- for (auto && i : Records) {
230- if (i.GetColumnId () == address.GetEntityId () && i.GetChunkIdx () == address.GetChunkIdx ()) {
231- i.RegisterBlobIdx (blobIdx);
232- return ;
233- }
234- }
235- for (auto && i : Indexes) {
236- if (i.GetIndexId () == address.GetEntityId () && i.GetChunkIdx () == address.GetChunkIdx ()) {
237- i.RegisterBlobIdx (blobIdx);
238- return ;
239- }
240- }
241- AFL_VERIFY (false )(" problem" , " portion haven't address for blob registration" )(" address" , address.DebugString ());
248+ BlobIdxs.emplace_back (address, blobIdx);
242249 }
243250
244251 TString DebugString () const {
@@ -265,26 +272,37 @@ class TPortionInfoConstructor {
265272 std::sort (Indexes.begin (), Indexes.end (), pred);
266273 CheckChunksOrder (Indexes);
267274 }
275+ {
276+ auto pred = [](const TAddressBlobId& l, const TAddressBlobId& r) {
277+ return l.GetAddress () < r.GetAddress ();
278+ };
279+ std::sort (BlobIdxs.begin (), BlobIdxs.end (), pred);
280+ }
268281 }
269282
270283 void FullValidation () const {
271284 AFL_VERIFY (Records.size ());
272285 CheckChunksOrder (Records);
273286 CheckChunksOrder (Indexes);
274- std::set<ui32> blobIdxs;
275- for (auto && i : Records) {
276- blobIdxs.emplace (i.GetBlobRange ().GetBlobIdxVerified ());
277- }
278- for (auto && i : Indexes) {
279- if (i.HasBlobRange ()) {
280- blobIdxs.emplace (i.GetBlobRangeVerified ().GetBlobIdxVerified ());
281- }
282- }
283- if (BlobIds.size ()) {
284- AFL_VERIFY (BlobIds.size () == blobIdxs.size ());
285- AFL_VERIFY (BlobIds.size () == *blobIdxs.rbegin () + 1 );
287+ if (BlobIdxs.size ()) {
288+ AFL_VERIFY (BlobIdxs.size () == Records.size () + Indexes.size ())(" blobs" , BlobIdxs.size ())(" records" , Records.size ())(
289+ " indexes" , Indexes.size ());
286290 } else {
287- AFL_VERIFY (blobIdxs.empty ());
291+ std::set<ui32> blobIdxs;
292+ for (auto && i : Records) {
293+ blobIdxs.emplace (i.GetBlobRange ().GetBlobIdxVerified ());
294+ }
295+ for (auto && i : Indexes) {
296+ if (i.HasBlobRange ()) {
297+ blobIdxs.emplace (i.GetBlobRangeVerified ().GetBlobIdxVerified ());
298+ }
299+ }
300+ if (BlobIds.size ()) {
301+ AFL_VERIFY (BlobIds.size () == blobIdxs.size ());
302+ AFL_VERIFY (BlobIds.size () == *blobIdxs.rbegin () + 1 );
303+ } else {
304+ AFL_VERIFY (blobIdxs.empty ());
305+ }
288306 }
289307 }
290308
0 commit comments