dbms: fixed one of errors [#METR-15352].

This commit is contained in:
Alexey Milovidov 2015-03-06 23:14:45 +03:00
parent 7c9b2a1789
commit 1ba32c6fbb
2 changed files with 22 additions and 10 deletions

View File

@ -10,13 +10,34 @@ namespace DB
struct BlockIO
{
/** process_list_entry должен уничтожаться позже, чем in и out,
* так как внутри in и out есть ссылка на объект внутри process_list_entry
* (MemoryTracker * current_memory_tracker),
* которая может использоваться до уничтожения in и out.
*/
ProcessList::EntryPtr process_list_entry;
BlockInputStreamPtr in;
BlockOutputStreamPtr out;
Block in_sample; /// Пример блока, который будет прочитан из in.
Block out_sample; /// Пример блока, которого нужно писать в out.
ProcessList::EntryPtr process_list_entry;
BlockIO & operator= (const BlockIO & rhs)
{
/// Обеспечиваем правильный порядок уничтожения.
out = nullptr;
in = nullptr;
process_list_entry = nullptr;
process_list_entry = rhs.process_list_entry;
in = rhs.in;
out = rhs.out;
in_sample = rhs.in_sample;
out_sample = rhs.out_sample;
return *this;
}
};
}

View File

@ -54,15 +54,6 @@ struct QueryState
void reset()
{
/** process_list_entry также включает/выключает учёт памяти MemoryTracker-ом.
* Члены maybe_compressed_in, block_in, maybe_compressed_out, block_out
* могли быть инициализированы до io, и выделенная в них память могла не быть учтена MemoryTracker-ом.
* Если эти члены будут уничтожены раньше, то освобождение памяти будет учтено MemoryTracker-ом,
* и вычисленный расход памяти может оказаться отрицательным (это не проблема, но некрасиво).
* Поэтому, сначала уничтожим process_list_entry.
*/
io.process_list_entry = nullptr;
*this = QueryState();
}