[Tarantool-patches] [PATCH 2/3] memtx: don't reserve extra memory if not needed
Vladislav Shpilevoy
v.shpilevoy at tarantool.org
Thu Dec 19 03:31:58 MSK 2019
Thanks for the patch!
On 13/12/2019 08:05, Ilya Kosarev wrote:
> 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.
The thing is that delete also can cause tree rebalancing. Maybe
that is why reservation was done for all 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;
Why does it work only when index count > 1? Why delete don't need
a reservation (I pointed out above that it needs)? And why do you
check for new_tuple != NULL second time after having it already
checked in the if's condition?
> + }
> + 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;
>
>
More information about the Tarantool-patches
mailing list