From 250a3422e7ab332f3964039912a96923c95180fe Mon Sep 17 00:00:00 2001 From: liaoxin Date: Fri, 7 Feb 2025 13:04:38 +0000 Subject: [PATCH] [Fix](load) Reset memtable immediately after insert failure to prevent crash --- be/src/olap/memtable_writer.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/be/src/olap/memtable_writer.cpp b/be/src/olap/memtable_writer.cpp index e2721b25c8a1c7..82e275d1d361f5 100644 --- a/be/src/olap/memtable_writer.cpp +++ b/be/src/olap/memtable_writer.cpp @@ -105,7 +105,20 @@ Status MemTableWriter::write(const vectorized::Block* block, } _total_received_rows += row_idxs.size(); - RETURN_IF_ERROR(_mem_table->insert(block, row_idxs)); + auto st = _mem_table->insert(block, row_idxs); + + // Reset memtable immediately after insert failure to prevent potential flush operations. + // This is a defensive measure because: + // 1. When insert fails (e.g., memory allocation failure during add_rows), + // the memtable is in an inconsistent state and should not be flushed + // 2. However, memory pressure might trigger a flush operation on this failed memtable + // 3. By resetting here, we ensure the failed memtable won't be included in any subsequent flush, + // thus preventing potential crashes + if (!st.ok()) [[unlikely]] { + std::lock_guard l(_mem_table_ptr_lock); + _mem_table.reset(); + return st; + } if (UNLIKELY(_mem_table->need_agg() && config::enable_shrink_memory)) { _mem_table->shrink_memtable_by_agg();