From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp50.i.mail.ru (smtp50.i.mail.ru [94.100.177.110]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id A39A04696C1 for ; Fri, 13 Dec 2019 10:05:20 +0300 (MSK) From: Ilya Kosarev Date: Fri, 13 Dec 2019 10:05:10 +0300 Message-Id: <95c49cb56ed3eb7f2051ee1690f9b28a45210367.1575627361.git.i.kosarev@tarantool.org> In-Reply-To: References: In-Reply-To: References: Subject: [Tarantool-patches] [PATCH 2/3] memtx: don't reserve extra memory if not needed List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tarantool-patches@dev.tarantool.org Cc: v.shpilevoy@tarantool.org memtx_index_extent_reserve was always being called from memtx_space_replace_all_keys. It could lead to slab allocator failure while reaching memtx_memory limit, which is especially distressing on space:truncate() and space:delete() invocations. we Now it is not being called if not needed, including space:truncate() and space:delete() cases. Part of #3807 --- src/box/memtx_space.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/box/memtx_space.c b/src/box/memtx_space.c index 6ef84e04564..1e8759778e7 100644 --- a/src/box/memtx_space.c +++ b/src/box/memtx_space.c @@ -260,10 +260,18 @@ memtx_space_replace_all_keys(struct space *space, struct tuple *old_tuple, * Ensure we have enough slack memory to guarantee * successful statement-level rollback. */ - if (memtx_index_extent_reserve(memtx, new_tuple != NULL ? - RESERVE_EXTENTS_BEFORE_REPLACE : - RESERVE_EXTENTS_BEFORE_DELETE) != 0) + if (space->index_count > 1 && new_tuple != NULL) { + if (memtx_index_extent_reserve(memtx, new_tuple != NULL ? + RESERVE_EXTENTS_BEFORE_REPLACE : + RESERVE_EXTENTS_BEFORE_DELETE) != 0) + return -1; + } + ERROR_INJECT(ERRINJ_INDEX_ALLOC, { + /* same error as in mempool_alloc */ + diag_set(OutOfMemory, MEMTX_EXTENT_SIZE, + "mempool", "new slab"); return -1; + }); uint32_t i = 0; -- 2.17.1