aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Rutkovsky <alexander.rutkovsky@gmail.com>2022-05-17 18:03:28 +0300
committerAlexander Rutkovsky <alexander.rutkovsky@gmail.com>2022-05-17 18:03:28 +0300
commit17dc7acf6ad7b66e65ab0e09b353cf938d793a88 (patch)
tree6e08fb7def79f0828f777b357c05c86d4ac7ec01
parentf219f68442e33d822331e6f3828c359dbd3dc4cb (diff)
downloadydb-17dc7acf6ad7b66e65ab0e09b353cf938d793a88.tar.gz
Fix bug KIKIMR-14895
ref:2a7536370f5cfa4587a4c02164dbd923c3c5bb58
-rw-r--r--ydb/core/blobstorage/vdisk/defrag/defrag_rewriter.cpp78
1 files changed, 51 insertions, 27 deletions
diff --git a/ydb/core/blobstorage/vdisk/defrag/defrag_rewriter.cpp b/ydb/core/blobstorage/vdisk/defrag/defrag_rewriter.cpp
index 83bcfa1572..c8ba107ca9 100644
--- a/ydb/core/blobstorage/vdisk/defrag/defrag_rewriter.cpp
+++ b/ydb/core/blobstorage/vdisk/defrag/defrag_rewriter.cpp
@@ -20,6 +20,41 @@ namespace NKikimr {
size_t RewrittenRecsCounter = 0;
size_t RewrittenBytes = 0;
+ struct TCheckLocationMerger {
+ TDefragRecord& Rec;
+ TBlobStorageGroupType GType;
+ bool Found = false;
+
+ TCheckLocationMerger(TDefragRecord& rec, TBlobStorageGroupType gtype)
+ : Rec(rec)
+ , GType(gtype)
+ {}
+
+ void AddFromFresh(const TMemRecLogoBlob& memRec, const TRope*, const TKeyLogoBlob&, ui64) {
+ Process(memRec, nullptr);
+ }
+
+ void AddFromSegment(const TMemRecLogoBlob& memRec, const TDiskPart *outbound, const TKeyLogoBlob&, ui64) {
+ Process(memRec, outbound);
+ }
+
+ static constexpr bool HaveToMergeData() { return false; }
+
+ void Process(const TMemRecLogoBlob& memRec, const TDiskPart *outbound) {
+ TDiskDataExtractor extr;
+ if (memRec.GetType() == TBlobType::HugeBlob || memRec.GetType() == TBlobType::ManyHugeBlobs) {
+ memRec.GetDiskData(&extr, outbound);
+ const NMatrix::TVectorType local = memRec.GetIngress().LocalParts(GType);
+ ui8 partIdx = local.FirstPosition();
+ for (const TDiskPart *p = extr.Begin; p != extr.End; ++p, partIdx = local.NextPosition(partIdx)) {
+ if (*p == Rec.OldDiskPart && partIdx + 1 == Rec.LogoBlobId.PartId()) {
+ Found = true;
+ }
+ }
+ }
+ }
+ };
+
void Bootstrap(const TActorContext &ctx) {
SendNextRead(ctx);
Become(&TThis::StateFunc);
@@ -40,37 +75,26 @@ namespace NKikimr {
FullSnap->BarriersSnap.Destroy();
TLogoBlobsSnapshot::TForwardIterator iter(FullSnap->HullCtx, &FullSnap->LogoBlobsSnap);
- const TLogoBlobID id = Recs[RecToReadIdx].LogoBlobId;
+ auto& rec = Recs[RecToReadIdx];
+ const TLogoBlobID id = rec.LogoBlobId;
iter.Seek(id.FullID());
if (iter.Valid() && iter.GetCurKey().LogoBlobID() == id.FullID()) {
- struct TCallback {
- const ui32 PartId;
- TDiskPart Location;
-
- void operator ()(const TDiskPart& data, const NMatrix::TVectorType v) {
- if (v.Get(PartId - 1)) {
- Y_VERIFY(v == NMatrix::TVectorType::MakeOneHot(PartId - 1, v.GetSize()));
- Location = data;
- }
- }
-
- void operator ()(const TDiskBlob&) {}
- } callback{id.PartId(), {}};
- TRecordMergerCallback<TKeyLogoBlob, TMemRecLogoBlob, TCallback> merger(&callback, DCtx->VCtx->Top->GType);
+ TCheckLocationMerger merger(rec, DCtx->VCtx->Top->GType);
iter.PutToMerger(&merger);
- merger.Finish();
-
- const TDiskPart &p = callback.Location;
- auto msg = std::make_unique<NPDisk::TEvChunkRead>(DCtx->PDiskCtx->Dsk->Owner,
- DCtx->PDiskCtx->Dsk->OwnerRound, p.ChunkIdx, p.Offset, p.Size, NPriRead::HullComp, nullptr);
- ctx.Send(DCtx->PDiskCtx->PDiskId, msg.release());
- DCtx->DefragMonGroup.DefragBytesRewritten() += p.Size;
- RewrittenBytes += p.Size;
- } else {
- ++RecToReadIdx;
- ++RewrittenRecsCounter;
- SendNextRead(ctx);
+ if (merger.Found) {
+ const TDiskPart& p = rec.OldDiskPart;
+ auto msg = std::make_unique<NPDisk::TEvChunkRead>(DCtx->PDiskCtx->Dsk->Owner,
+ DCtx->PDiskCtx->Dsk->OwnerRound, p.ChunkIdx, p.Offset, p.Size, NPriRead::HullComp, nullptr);
+ ctx.Send(DCtx->PDiskCtx->PDiskId, msg.release());
+ DCtx->DefragMonGroup.DefragBytesRewritten() += p.Size;
+ RewrittenBytes += p.Size;
+ return;
+ }
}
+
+ ++RecToReadIdx;
+ ++RewrittenRecsCounter;
+ SendNextRead(ctx);
}
void Handle(NPDisk::TEvChunkReadResult::TPtr ev, const TActorContext& ctx) {