aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Borzenkov <snaury@gmail.com>2022-05-26 17:48:08 +0300
committerAlexey Borzenkov <snaury@gmail.com>2022-05-26 17:48:08 +0300
commitf14a5a5c4cd28fa6351b5588c22b6334b570bf2f (patch)
tree5c23ad860ffb7aee2099b1d0ba866d354ef110f1
parenta2130178e7652dc319f3edd9001e2dbb0d44ad6b (diff)
downloadydb-f14a5a5c4cd28fa6351b5588c22b6334b570bf2f.tar.gz
Compact borrowed mvcc garbage after split/merge, KIKIMR-14979
ref:58c92a54c8a558f4781de7663cdd048fe0fae7ee
-rw-r--r--ydb/core/tablet_flat/flat_comp.h8
-rw-r--r--ydb/core/tablet_flat/flat_comp_gen.cpp12
-rw-r--r--ydb/core/tablet_flat/flat_comp_gen.h3
-rw-r--r--ydb/core/tablet_flat/flat_executor.cpp6
-rw-r--r--ydb/core/tablet_flat/flat_executor.h2
-rw-r--r--ydb/core/tablet_flat/flat_executor_compaction_logic.cpp11
-rw-r--r--ydb/core/tablet_flat/flat_executor_compaction_logic.h4
-rw-r--r--ydb/core/tablet_flat/tablet_flat_executor.h6
-rw-r--r--ydb/core/tx/datashard/datashard.cpp9
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);