mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 08:02:02 +00:00
Fix mutation stuck on invalid partitions in non-replicated MergeTree
v2: Do not try to process empty mutations Found with flaky check [1]. [1]: https://clickhouse-test-reports.s3.yandex.net/27248/66e8c0833392c20ba8dba3780f2b0d5c18f8194e/functional_stateless_tests_flaky_check_(address).html#fail1
This commit is contained in:
parent
5139067631
commit
7964355ecf
@ -958,9 +958,19 @@ std::shared_ptr<StorageMergeTree::MergeMutateSelectedEntry> StorageMergeTree::se
|
||||
|
||||
if (!commands_for_size_validation.empty())
|
||||
{
|
||||
MutationsInterpreter interpreter(
|
||||
shared_from_this(), metadata_snapshot, commands_for_size_validation, getContext(), false);
|
||||
commands_size += interpreter.evaluateCommandsSize();
|
||||
try
|
||||
{
|
||||
MutationsInterpreter interpreter(
|
||||
shared_from_this(), metadata_snapshot, commands_for_size_validation, getContext(), false);
|
||||
commands_size += interpreter.evaluateCommandsSize();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
MergeTreeMutationEntry & entry = it->second;
|
||||
entry.latest_fail_time = time(nullptr);
|
||||
entry.latest_fail_reason = getCurrentExceptionMessage(false);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (current_ast_elements + commands_size >= max_ast_elements)
|
||||
@ -970,17 +980,25 @@ std::shared_ptr<StorageMergeTree::MergeMutateSelectedEntry> StorageMergeTree::se
|
||||
commands.insert(commands.end(), it->second.commands.begin(), it->second.commands.end());
|
||||
}
|
||||
|
||||
auto new_part_info = part->info;
|
||||
new_part_info.mutation = current_mutations_by_version.rbegin()->first;
|
||||
if (!commands.empty())
|
||||
{
|
||||
auto new_part_info = part->info;
|
||||
new_part_info.mutation = current_mutations_by_version.rbegin()->first;
|
||||
|
||||
future_part.parts.push_back(part);
|
||||
future_part.part_info = new_part_info;
|
||||
future_part.name = part->getNewName(new_part_info);
|
||||
future_part.type = part->getType();
|
||||
future_part.parts.push_back(part);
|
||||
future_part.part_info = new_part_info;
|
||||
future_part.name = part->getNewName(new_part_info);
|
||||
future_part.type = part->getType();
|
||||
|
||||
tagger = std::make_unique<CurrentlyMergingPartsTagger>(future_part, MergeTreeDataMergerMutator::estimateNeededDiskSpace({part}), *this, metadata_snapshot, true);
|
||||
return std::make_shared<MergeMutateSelectedEntry>(future_part, std::move(tagger), commands);
|
||||
tagger = std::make_unique<CurrentlyMergingPartsTagger>(future_part, MergeTreeDataMergerMutator::estimateNeededDiskSpace({part}), *this, metadata_snapshot, true);
|
||||
return std::make_shared<MergeMutateSelectedEntry>(future_part, std::move(tagger), commands);
|
||||
}
|
||||
}
|
||||
|
||||
/// Notify in case of errors
|
||||
std::unique_lock lock(mutation_wait_mutex);
|
||||
mutation_wait_event.notify_all();
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,33 @@
|
||||
SET mutations_sync=2;
|
||||
|
||||
DROP TABLE IF EXISTS rep_data;
|
||||
CREATE TABLE rep_data
|
||||
(
|
||||
p Int,
|
||||
t DateTime,
|
||||
INDEX idx t TYPE minmax GRANULARITY 1
|
||||
)
|
||||
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/rep_data', '1')
|
||||
PARTITION BY p
|
||||
ORDER BY t
|
||||
SETTINGS number_of_free_entries_in_pool_to_execute_mutation=0;
|
||||
INSERT INTO rep_data VALUES (1, now());
|
||||
ALTER TABLE rep_data MATERIALIZE INDEX idx IN PARTITION ID 'NO_SUCH_PART'; -- { serverError 248 }
|
||||
ALTER TABLE rep_data MATERIALIZE INDEX idx IN PARTITION ID '1';
|
||||
ALTER TABLE rep_data MATERIALIZE INDEX idx IN PARTITION ID '2';
|
||||
|
||||
DROP TABLE IF EXISTS data;
|
||||
CREATE TABLE data
|
||||
(
|
||||
p Int,
|
||||
t DateTime,
|
||||
INDEX idx t TYPE minmax GRANULARITY 1
|
||||
)
|
||||
ENGINE = MergeTree
|
||||
PARTITION BY p
|
||||
ORDER BY t
|
||||
SETTINGS number_of_free_entries_in_pool_to_execute_mutation=0;
|
||||
INSERT INTO data VALUES (1, now());
|
||||
ALTER TABLE data MATERIALIZE INDEX idx IN PARTITION ID 'NO_SUCH_PART'; -- { serverError 341 }
|
||||
ALTER TABLE data MATERIALIZE INDEX idx IN PARTITION ID '1';
|
||||
ALTER TABLE data MATERIALIZE INDEX idx IN PARTITION ID '2';
|
Loading…
Reference in New Issue
Block a user