Skip to content

Commit 016b43a

Browse files
Michicosunzvonand
authored andcommitted
Merge pull request ClickHouse#90059 from ClickHouse/unblock_ttl_drop_merges_in_cold_volumes
Unblock ttl part drops for cold volumes
1 parent 92e2155 commit 016b43a

File tree

13 files changed

+141
-21
lines changed

13 files changed

+141
-21
lines changed

src/Storages/MergeTree/Compaction/MergePredicates/DistributedMergePredicate.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ class DistributedMergePredicate : public IMergePredicate
8282
if (left.info.isPatch() != right.info.isPatch())
8383
return std::unexpected(PreformattedMessage::create("One of parts ({}, {}) is patch part and another is regular part", left.name, right.name));
8484

85+
if (left.is_in_volume_where_merges_avoid || right.is_in_volume_where_merges_avoid)
86+
return std::unexpected(PreformattedMessage::create("One of parts ({}, {}) lies on volume where merges should be avoided", left.name, right.name));
87+
8588
int64_t left_max_block = left.info.max_block;
8689
int64_t right_min_block = right.info.min_block;
8790
chassert(left_max_block < right_min_block);

src/Storages/MergeTree/Compaction/MergePredicates/MergeTreeMergePredicate.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ std::expected<void, PreformattedMessage> MergeTreeMergePredicate::canMergeParts(
3737
if (left.info.isPatch() != right.info.isPatch())
3838
return std::unexpected(PreformattedMessage::create("One of parts ({}, {}) is patch part and another is regular part", left.name, right.name));
3939

40+
if (left.is_in_volume_where_merges_avoid || right.is_in_volume_where_merges_avoid)
41+
return std::unexpected(PreformattedMessage::create("One of parts ({}, {}) lies on volume where merges should be avoided", left.name, right.name));
42+
4043
if (left.projection_names != right.projection_names)
4144
{
4245
return std::unexpected(PreformattedMessage::create(

src/Storages/MergeTree/Compaction/MergeSelectors/TTLMergeSelector.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,9 @@ time_t TTLRowDeleteMergeSelector::getTTLForPart(const PartProperties & part) con
213213

214214
bool TTLRowDeleteMergeSelector::canConsiderPart(const PartProperties & part) const
215215
{
216+
if (part.is_in_volume_where_merges_avoid)
217+
return false;
218+
216219
if (!part.general_ttl_info.has_value())
217220
return false;
218221

@@ -231,6 +234,9 @@ time_t TTLRecompressMergeSelector::getTTLForPart(const PartProperties & part) co
231234

232235
bool TTLRecompressMergeSelector::canConsiderPart(const PartProperties & part) const
233236
{
237+
if (part.is_in_volume_where_merges_avoid)
238+
return false;
239+
234240
if (!part.recompression_ttl_info.has_value())
235241
return false;
236242

src/Storages/MergeTree/Compaction/PartProperties.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,15 @@ std::set<std::string> getCalculatedProjectionNames(const MergeTreeDataPartPtr &
6767
PartProperties buildPartProperties(
6868
const MergeTreeDataPartPtr & part,
6969
const StorageMetadataPtr & metadata_snapshot,
70+
const StoragePolicyPtr & storage_policy,
7071
time_t current_time)
7172
{
7273
return PartProperties{
7374
.name = part->name,
7475
.info = part->info,
7576
.projection_names = getCalculatedProjectionNames(part),
7677
.all_ttl_calculated_if_any = part->checkAllTTLCalculated(metadata_snapshot),
78+
.is_in_volume_where_merges_avoid = !part->shallParticipateInMerges(storage_policy),
7779
.size = part->getExistingBytesOnDisk(),
7880
.age = current_time - part->modification_time,
7981
.general_ttl_info = buildGeneralTTLInfo(metadata_snapshot, part),

src/Storages/MergeTree/Compaction/PartProperties.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#pragma once
22

33
#include <Storages/MergeTree/MergeTreePartInfo.h>
4+
5+
#include <Disks/IStoragePolicy.h>
6+
47
#include <Core/UUID.h>
58

69
#include <optional>
@@ -24,6 +27,7 @@ struct PartProperties
2427
const std::set<std::string> projection_names = {};
2528

2629
const bool all_ttl_calculated_if_any = false;
30+
const bool is_in_volume_where_merges_avoid = false;
2731

2832
/// Size of data part in bytes.
2933
const size_t size = 0;
@@ -56,6 +60,7 @@ using PartsRangeView = std::span<const PartProperties>;
5660
PartProperties buildPartProperties(
5761
const MergeTreeDataPartPtr & part,
5862
const StorageMetadataPtr & metadata_snapshot,
63+
const StoragePolicyPtr & storage_policy,
5964
time_t current_time);
6065

6166
}

src/Storages/MergeTree/Compaction/PartsCollectors/Common.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ namespace DB
66
{
77

88
PartsRanges constructPartsRanges(
9-
std::vector<MergeTreeDataPartsVector> && ranges, const StorageMetadataPtr & metadata_snapshot, const time_t & current_time)
9+
std::vector<MergeTreeDataPartsVector> && ranges,
10+
const StorageMetadataPtr & metadata_snapshot,
11+
const StoragePolicyPtr & storage_policy,
12+
const time_t & current_time)
1013
{
1114
PartsRanges properties_ranges;
1215
properties_ranges.reserve(ranges.size());
@@ -17,7 +20,7 @@ PartsRanges constructPartsRanges(
1720
properties_ranges.reserve(range.size());
1821

1922
for (const auto & part : range)
20-
properties_range.push_back(buildPartProperties(part, metadata_snapshot, current_time));
23+
properties_range.push_back(buildPartProperties(part, metadata_snapshot, storage_policy, current_time));
2124

2225
properties_ranges.push_back(std::move(properties_range));
2326
}

src/Storages/MergeTree/Compaction/PartsCollectors/Common.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ std::expected<void, PreformattedMessage> checkAllPartsSatisfyPredicate(const std
5555
}
5656

5757
PartsRanges constructPartsRanges(
58-
std::vector<MergeTreeDataPartsVector> && ranges, const StorageMetadataPtr & metadata_snapshot, const time_t & current_time);
58+
std::vector<MergeTreeDataPartsVector> && ranges,
59+
const StorageMetadataPtr & metadata_snapshot,
60+
const StoragePolicyPtr & storage_policy,
61+
const time_t & current_time);
5962

6063
MergeTreeDataPartsVector filterByPartitions(
6164
MergeTreeDataPartsVector && parts, const std::optional<PartitionIdsHint> & partitions_to_keep);

src/Storages/MergeTree/Compaction/PartsCollectors/MergeTreePartsCollector.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,7 @@ MergeTreeDataPartsVector collectInitial(const MergeTreeData & data, const MergeT
7777

7878
auto constructPreconditionsPredicate(const StoragePolicyPtr & storage_policy, const MergeTreeTransactionPtr & tx, const MergeTreeMergePredicatePtr & merge_pred)
7979
{
80-
bool has_volumes_with_disabled_merges = storage_policy->hasAnyVolumeWithDisabledMerges();
81-
82-
auto predicate = [storage_policy, tx, merge_pred, has_volumes_with_disabled_merges](const MergeTreeDataPartPtr & part) -> std::expected<void, PreformattedMessage>
80+
auto predicate = [storage_policy, tx, merge_pred](const MergeTreeDataPartPtr & part) -> std::expected<void, PreformattedMessage>
8381
{
8482
if (tx)
8583
{
@@ -93,9 +91,6 @@ auto constructPreconditionsPredicate(const StoragePolicyPtr & storage_policy, co
9391
return std::unexpected(PreformattedMessage::create("Part {} is locked for removal", part->name));
9492
}
9593

96-
if (has_volumes_with_disabled_merges && !part->shallParticipateInMerges(storage_policy))
97-
return std::unexpected(PreformattedMessage::create("Merges for part's {} volume are disabled", part->name));
98-
9994
chassert(merge_pred);
10095
return merge_pred->canUsePartInMerges(part);
10196
};
@@ -135,7 +130,7 @@ PartsRanges MergeTreePartsCollector::grabAllPossibleRanges(
135130
{
136131
auto parts = filterByPartitions(collectInitial(storage, tx), partitions_hint);
137132
auto ranges = splitPartsByPreconditions(std::move(parts), storage_policy, tx, merge_pred, series_log);
138-
return constructPartsRanges(std::move(ranges), metadata_snapshot, current_time);
133+
return constructPartsRanges(std::move(ranges), metadata_snapshot, storage_policy, current_time);
139134
}
140135

141136
std::expected<PartsRange, PreformattedMessage> MergeTreePartsCollector::grabAllPartsInsidePartition(
@@ -148,7 +143,7 @@ std::expected<PartsRange, PreformattedMessage> MergeTreePartsCollector::grabAllP
148143
if (auto result = checkAllParts(parts, storage_policy, tx, merge_pred); !result)
149144
return std::unexpected(std::move(result.error()));
150145

151-
auto ranges = constructPartsRanges({std::move(parts)}, metadata_snapshot, current_time);
146+
auto ranges = constructPartsRanges({std::move(parts)}, metadata_snapshot, storage_policy, current_time);
152147
chassert(ranges.size() == 1);
153148

154149
return std::move(ranges.front());

src/Storages/MergeTree/Compaction/PartsCollectors/ReplicatedMergeTreePartsCollector.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,8 @@ MergeTreeDataPartsVector collectInitial(const MergeTreeData & data)
1717

1818
auto constructPreconditionsPredicate(const StoragePolicyPtr & storage_policy, const ReplicatedMergeTreeMergePredicatePtr & merge_pred)
1919
{
20-
bool has_volumes_with_disabled_merges = storage_policy->hasAnyVolumeWithDisabledMerges();
21-
22-
auto predicate = [storage_policy, merge_pred, has_volumes_with_disabled_merges](const MergeTreeDataPartPtr & part) -> std::expected<void, PreformattedMessage>
20+
auto predicate = [storage_policy, merge_pred](const MergeTreeDataPartPtr & part) -> std::expected<void, PreformattedMessage>
2321
{
24-
if (has_volumes_with_disabled_merges && !part->shallParticipateInMerges(storage_policy))
25-
return std::unexpected(PreformattedMessage::create("Merges for part's {} volume are disabled", part->name));
26-
27-
chassert(merge_pred);
2822
return merge_pred->canUsePartInMerges(part);
2923
};
3024

@@ -62,7 +56,7 @@ PartsRanges ReplicatedMergeTreePartsCollector::grabAllPossibleRanges(
6256
{
6357
auto parts = filterByPartitions(collectInitial(storage), partitions_hint);
6458
auto ranges = splitPartsByPreconditions(std::move(parts), storage_policy, merge_pred, series_log);
65-
return constructPartsRanges(std::move(ranges), metadata_snapshot, current_time);
59+
return constructPartsRanges(std::move(ranges), metadata_snapshot, storage_policy, current_time);
6660
}
6761

6862
std::expected<PartsRange, PreformattedMessage> ReplicatedMergeTreePartsCollector::grabAllPartsInsidePartition(
@@ -75,7 +69,7 @@ std::expected<PartsRange, PreformattedMessage> ReplicatedMergeTreePartsCollector
7569
if (auto result = checkAllParts(parts, storage_policy, merge_pred); !result)
7670
return std::unexpected(std::move(result.error()));
7771

78-
auto ranges = constructPartsRanges({std::move(parts)}, metadata_snapshot, current_time);
72+
auto ranges = constructPartsRanges({std::move(parts)}, metadata_snapshot, storage_policy, current_time);
7973
chassert(ranges.size() == 1);
8074

8175
return std::move(ranges.front());

src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,10 +300,11 @@ MergeSelectorChoices chooseMergesFrom(
300300

301301
for (size_t i = 0; i < choices.size(); ++i)
302302
{
303+
const auto & merge_type = choices[i].merge_type;
303304
const auto & range = choices[i].range;
304305
const auto & range_patches = choices[i].range_patches;
305306
ProfileEvents::increment(ProfileEvents::MergerMutatorSelectRangePartsCount, range.size());
306-
LOG_TRACE(log, "Merge #{} with {} parts from {} to {} with {} patches", i, range.size(), range.front().name, range.back().name, range_patches.size());
307+
LOG_TRACE(log, "Merge #{} type {} with {} parts from {} to {} with {} patches", i, merge_type, range.size(), range.front().name, range.back().name, range_patches.size());
307308
}
308309
}
309310

0 commit comments

Comments
 (0)