Account query memory limits and sampling for OPTIMIZE TABLE/merges

This commit is contained in:
Azat Khuzhin 2021-01-06 02:20:26 +03:00
parent bd05d9db2f
commit 82edbfb581
2 changed files with 22 additions and 2 deletions

View File

@ -40,6 +40,18 @@ MergeListElement::MergeListElement(const std::string & database_, const std::str
background_thread_memory_tracker = CurrentThread::getMemoryTracker();
if (background_thread_memory_tracker)
{
/// From the query context it will be ("for thread") memory tracker with VariableContext::Thread level,
/// which does not have any limits and sampling settings configured.
/// And parent for this memory tracker should be ("(for query)") with VariableContext::Process level,
/// that has limits and sampling configured.
MemoryTracker * parent;
if (background_thread_memory_tracker->level == VariableContext::Thread &&
(parent = background_thread_memory_tracker->getParent()) &&
parent != &total_memory_tracker)
{
background_thread_memory_tracker = parent;
}
background_thread_memory_tracker_prev_parent = background_thread_memory_tracker->getParent();
background_thread_memory_tracker->setParent(&memory_tracker);
}

View File

@ -7,7 +7,15 @@ set max_memory_usage='200Mi';
system stop merges data_01641;
insert into data_01641 select number, toString(number) from numbers(toUInt64(120e6));
-- FIXME: this limit does not work
set max_memory_usage='10Mi';
-- peak:
-- - is 21MiB if background merges already scheduled
-- - is ~60MiB otherwise
set max_memory_usage='80Mi';
system start merges data_01641;
optimize table data_01641 final;
-- definitely should fail
set max_memory_usage='1Mi';
optimize table data_01641 final; -- { serverError 241 }
drop table data_01641;