From 1ba32c6fbbaa0a837cefafc2930ca1785dfba871 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 6 Mar 2015 23:14:45 +0300 Subject: [PATCH] dbms: fixed one of errors [#METR-15352]. --- dbms/include/DB/DataStreams/BlockIO.h | 23 ++++++++++++++++++++++- dbms/src/Server/TCPHandler.h | 9 --------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/dbms/include/DB/DataStreams/BlockIO.h b/dbms/include/DB/DataStreams/BlockIO.h index 461e475e026..6c3c83a63bd 100644 --- a/dbms/include/DB/DataStreams/BlockIO.h +++ b/dbms/include/DB/DataStreams/BlockIO.h @@ -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; + } }; } diff --git a/dbms/src/Server/TCPHandler.h b/dbms/src/Server/TCPHandler.h index 8a9ecd5c8fe..ffae284d459 100644 --- a/dbms/src/Server/TCPHandler.h +++ b/dbms/src/Server/TCPHandler.h @@ -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(); }