diff options
author | Alexey Borzenkov <snaury@gmail.com> | 2022-05-26 17:48:08 +0300 |
---|---|---|
committer | Alexey Borzenkov <snaury@gmail.com> | 2022-05-26 17:48:08 +0300 |
commit | f14a5a5c4cd28fa6351b5588c22b6334b570bf2f (patch) | |
tree | 5c23ad860ffb7aee2099b1d0ba866d354ef110f1 | |
parent | a2130178e7652dc319f3edd9001e2dbb0d44ad6b (diff) | |
download | ydb-f14a5a5c4cd28fa6351b5588c22b6334b570bf2f.tar.gz |
Compact borrowed mvcc garbage after split/merge, KIKIMR-14979
ref:58c92a54c8a558f4781de7663cdd048fe0fae7ee
-rw-r--r-- | ydb/core/tablet_flat/flat_comp.h | 8 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_comp_gen.cpp | 12 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_comp_gen.h | 3 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_executor.cpp | 6 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_executor.h | 2 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_executor_compaction_logic.cpp | 11 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_executor_compaction_logic.h | 4 | ||||
-rw-r--r-- | ydb/core/tablet_flat/tablet_flat_executor.h | 6 | ||||
-rw-r--r-- | ydb/core/tx/datashard/datashard.cpp | 9 |
9 files changed, 60 insertions, 1 deletions
diff --git a/ydb/core/tablet_flat/flat_comp.h b/ydb/core/tablet_flat/flat_comp.h index a768863386e..e010255a59b 100644 --- a/ydb/core/tablet_flat/flat_comp.h +++ b/ydb/core/tablet_flat/flat_comp.h @@ -312,6 +312,14 @@ namespace NTable { return false; } + /** + * Called to signal it's ok to compact borrowed garbage + * even if there's no private tablet data + */ + virtual void AllowBorrowedGarbageCompaction() { + // nothing + } + virtual ui64 GetLastFinishedForcedCompactionId() const = 0; virtual TInstant GetLastFinishedForcedCompactionTs() const = 0; diff --git a/ydb/core/tablet_flat/flat_comp_gen.cpp b/ydb/core/tablet_flat/flat_comp_gen.cpp index 16ec271bd16..63aeca89caa 100644 --- a/ydb/core/tablet_flat/flat_comp_gen.cpp +++ b/ydb/core/tablet_flat/flat_comp_gen.cpp @@ -1412,7 +1412,10 @@ bool TGenCompactionStrategy::MaybeAutoStartForceCompaction() { // belongs to our own tablet, i.e. not borrowed. This is so we don't // compact borrowed data mid-merge, which might cause epochs to become // out of sync across generations. - if (Generations && ForcedState == EForcedState::None && StatsPerTablet.contains(Backend->OwnerTabletId())) { + if (Generations && + ForcedState == EForcedState::None && + (CompactBorrowedGarbageAllowed || StatsPerTablet.contains(Backend->OwnerTabletId()))) + { bool startForcedCompaction = NeedToStartForceCompaction(); if (startForcedCompaction) { ForcedState = EForcedState::Pending; @@ -1424,6 +1427,13 @@ bool TGenCompactionStrategy::MaybeAutoStartForceCompaction() { return false; } +void TGenCompactionStrategy::AllowBorrowedGarbageCompaction() { + if (!CompactBorrowedGarbageAllowed) { + CompactBorrowedGarbageAllowed = true; + ReflectRemovedRowVersions(); + } +} + } } } diff --git a/ydb/core/tablet_flat/flat_comp_gen.h b/ydb/core/tablet_flat/flat_comp_gen.h index 07b39415492..3ba12cd623b 100644 --- a/ydb/core/tablet_flat/flat_comp_gen.h +++ b/ydb/core/tablet_flat/flat_comp_gen.h @@ -41,6 +41,7 @@ namespace NCompGen { ui64 GetBackingSize(ui64 ownerTabletId) override; ui64 BeginMemCompaction(TTaskId taskId, TSnapEdge edge, ui64 forcedCompactionId) override; bool ScheduleBorrowedCompaction() override; + void AllowBorrowedGarbageCompaction() override; ui64 GetLastFinishedForcedCompactionId() const override { return FinishedForcedGenCompactionId; } TInstant GetLastFinishedForcedCompactionTs() const override { return FinishedForcedGenCompactionTs; } TCompactionChanges CompactionFinished( @@ -279,6 +280,8 @@ namespace NCompGen { TStats Stats; THashMap<ui64, TStats> StatsPerTablet; NPage::TGarbageStatsAgg GarbageStatsAgg; + + bool CompactBorrowedGarbageAllowed = false; }; } diff --git a/ydb/core/tablet_flat/flat_executor.cpp b/ydb/core/tablet_flat/flat_executor.cpp index 4b8fc706e76..76ef090dd1a 100644 --- a/ydb/core/tablet_flat/flat_executor.cpp +++ b/ydb/core/tablet_flat/flat_executor.cpp @@ -3708,6 +3708,12 @@ bool TExecutor::CompactTables() { } } +void TExecutor::AllowBorrowedGarbageCompaction(ui32 tableId) { + if (CompactionLogic) { + return CompactionLogic->AllowBorrowedGarbageCompaction(tableId); + } +} + STFUNC(TExecutor::StateInit) { Y_UNUSED(ev); Y_UNUSED(ctx); diff --git a/ydb/core/tablet_flat/flat_executor.h b/ydb/core/tablet_flat/flat_executor.h index 5fd0e391d98..b9c6753bf03 100644 --- a/ydb/core/tablet_flat/flat_executor.h +++ b/ydb/core/tablet_flat/flat_executor.h @@ -628,6 +628,8 @@ public: ui64 CompactTable(ui32 tableId) override; bool CompactTables() override; + void AllowBorrowedGarbageCompaction(ui32 tableId) override; + void FollowerAttached() override; void FollowerSyncComplete() override; void FollowerGcApplied(ui32 step, TDuration followerSyncDelay) override; diff --git a/ydb/core/tablet_flat/flat_executor_compaction_logic.cpp b/ydb/core/tablet_flat/flat_executor_compaction_logic.cpp index b28c5214496..514aea3725a 100644 --- a/ydb/core/tablet_flat/flat_executor_compaction_logic.cpp +++ b/ydb/core/tablet_flat/flat_executor_compaction_logic.cpp @@ -201,6 +201,13 @@ TFinishedCompactionInfo TCompactionLogic::GetFinishedCompactionInfo(ui32 table) tableInfo->Strategy->GetLastFinishedForcedCompactionTs()); } +void TCompactionLogic::AllowBorrowedGarbageCompaction(ui32 table) { + auto *tableInfo = State->Tables.FindPtr(table); + Y_VERIFY(tableInfo && tableInfo->Strategy, "Cannot AllowBorrowedGarbageCompaction for unexpected table %" PRIu32, table); + tableInfo->AllowBorrowedGarbageCompaction = true; + tableInfo->Strategy->AllowBorrowedGarbageCompaction(); +} + TReflectSchemeChangesResult TCompactionLogic::ReflectSchemeChanges() { TReflectSchemeChangesResult result; @@ -248,6 +255,10 @@ TReflectSchemeChangesResult TCompactionLogic::ReflectSchemeChanges() } else { table.Strategy->Start({ }); } + + if (table.AllowBorrowedGarbageCompaction) { + table.Strategy->AllowBorrowedGarbageCompaction(); + } } else { Y_VERIFY(table.Strategy); table.Strategy->ReflectSchema(); diff --git a/ydb/core/tablet_flat/flat_executor_compaction_logic.h b/ydb/core/tablet_flat/flat_executor_compaction_logic.h index 7993fdb83c0..be7a3cda8d4 100644 --- a/ydb/core/tablet_flat/flat_executor_compaction_logic.h +++ b/ydb/core/tablet_flat/flat_executor_compaction_logic.h @@ -100,6 +100,8 @@ struct TCompactionLogicState { bool ChangesRequested = false; + bool AllowBorrowedGarbageCompaction = true; + TTableInfo() = default; ~TTableInfo(); @@ -217,6 +219,8 @@ public: TFinishedCompactionInfo GetFinishedCompactionInfo(ui32 table); + void AllowBorrowedGarbageCompaction(ui32 table); + TReflectSchemeChangesResult ReflectSchemeChanges(); void ReflectRemovedRowVersions(ui32 table); void UpdateInMemStatsStep(ui32 table, ui32 steps, ui64 size); diff --git a/ydb/core/tablet_flat/tablet_flat_executor.h b/ydb/core/tablet_flat/tablet_flat_executor.h index 8787bdb066f..efbae96a110 100644 --- a/ydb/core/tablet_flat/tablet_flat_executor.h +++ b/ydb/core/tablet_flat/tablet_flat_executor.h @@ -528,6 +528,12 @@ namespace NFlatExecutorSetup { virtual ui64 CompactTable(ui32 tableId) = 0; virtual bool CompactTables() = 0; + // Signal executor that it's ok to compact borrowed data in the given + // table even if there's no local modifications. Useful after finishing + // snapshot transfer on datashard split/merge so any mvcc data and/or + // erases can be compacted normally. + virtual void AllowBorrowedGarbageCompaction(ui32 tableId) = 0; + virtual void RenderHtmlPage(NMon::TEvRemoteHttpInfo::TPtr&) const = 0; virtual void RenderHtmlCounters(NMon::TEvRemoteHttpInfo::TPtr&) const = 0; virtual void RenderHtmlDb(NMon::TEvRemoteHttpInfo::TPtr &ev, const TActorContext &ctx) const = 0; diff --git a/ydb/core/tx/datashard/datashard.cpp b/ydb/core/tx/datashard/datashard.cpp index e7e5deb690c..f75f4b3585e 100644 --- a/ydb/core/tx/datashard/datashard.cpp +++ b/ydb/core/tx/datashard/datashard.cpp @@ -380,6 +380,15 @@ void TDataShard::SwitchToWork(const TActorContext &ctx) { LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD, "Switched to work state " << DatashardStateName(State) << " tabletId " << TabletID()); + if (State == TShardState::Ready && DstSplitDescription) { + // This shard was created as a result of split/merge (and not e.g. copy table) + // Signal executor that it should compact borrowed garbage even if this + // shard has no private data. + for (const auto& pr : TableInfos) { + Executor()->AllowBorrowedGarbageCompaction(pr.second->LocalTid); + } + } + // Cleanup any removed snapshots from the previous generation Execute(new TTxCleanupRemovedSnapshots(this), ctx); |