Hi, thank you for review.I answer your questions below.   See 3 comments below.   >  src/box/memtx_engine.c                  |  8 +++ >  src/lib/small                           |  2 +- >  test/engine/engine.cfg                  |  3 ++ >  test/engine/small_alloc_factor.lua      | 11 ++++ >  test/engine/small_alloc_factor.result   | 70 +++++++++++++++++++++++++ >  test/engine/small_alloc_factor.test.lua | 20 +++++++ >  6 files changed, 113 insertions(+), 1 deletion(-) >  create mode 100644 test/engine/small_alloc_factor.lua >  create mode 100644 test/engine/small_alloc_factor.result >  create mode 100644 test/engine/small_alloc_factor.test.lua > > diff --git a/src/box/memtx_engine.c b/src/box/memtx_engine.c > index 4f1fe3a3f..3ab292f2e 100644 > --- a/src/box/memtx_engine.c > +++ b/src/box/memtx_engine.c > @@ -1116,6 +1116,14 @@ memtx_engine_new(const char *snap_dirname, bool force_recovery, >        if (objsize_min < OBJSIZE_MIN) >                   objsize_min = OBJSIZE_MIN; >  > +     if (alloc_factor > 2) { > +                say_error("Alloc factor must be less than or equal to 2.0. It will be reduced to 2.0"); > +                alloc_factor = 2.0; > +     } else if (alloc_factor <= 1.0) { > +                say_error("Alloc factor must be greater than then 1.0. It will be increased to 1.001");   1. Can't parse 'than then' - please, rephrase. I assume 'then' is not needed.   Fixed incorrect message, now:   +    if (alloc_factor > 2) { +        say_error("Alloc factor must be less than or equal to 2.0. It will be reduced to 2.0"); +        alloc_factor = 2.0; +    } else if (alloc_factor <= 1.0) { +        say_error("Alloc factor must be greater than 1.0. It will be increased to 1.001"); +        alloc_factor = 1.001; +    } +   > +                alloc_factor = 1.001;   2. I don't see the factor being rounded up in the original code. Why did you add it? And why 1.0 is bad?   Answer:   Here is a code which rounded up alloc factor in master branch.     /*      * Correct the user-supplied alloc_factor to ensure that      * it actually produces growing object sizes.      */     if (alloc->step_pool_objsize_max * alloc_factor <         alloc->step_pool_objsize_max + STEP_SIZE) {         alloc_factor =             (alloc->step_pool_objsize_max + STEP_SIZE + 0.5)/             alloc->step_pool_objsize_max;     }     I use gdb to show it:     tarantool> box.cfg{slab_alloc_factor = 1.01}     2020-12-24 19:22:33.416 [22602] main/103/interactive C> Tarantool 2.7.0-148-gd5a5754a3     2020-12-24 19:22:33.416 [22602] main/103/interactive C> log level 5     2020-12-24 19:22:33.416 [22602] main/103/interactive I> mapping 268435456 bytes for memtx tuple arena...     Breakpoint 1, small_alloc_create (alloc=0x555555cfe788, cache=0x555555cfe530, objsize_min=272,                           alloc_factor=1.00999999) at /home/evgeny/MASTER/tarantool/src/lib/small/small/small.c:135     135                     alloc_factor =     (gdb) n     139             alloc->factor = alloc_factor;     (gdb) p alloc_factor     $1 = 1.032197     (gdb)     As you can see if you pass slab_alloc_factor < 1.03 it's changed to 1.03. I try 0.01 factor and get the same value.     It's code from master branch, now user can pass >= 1.001 factor. We can't use 1.0, because we need increment to pool size.   > +     } > diff --git a/test/engine/small_alloc_factor.result b/test/engine/small_alloc_factor.result > new file mode 100644 > index 000000000..31d0f8ffd > --- /dev/null > +++ b/test/engine/small_alloc_factor.result   3. Please, read this document, and especially the specified section: https://github.com/tarantool/tarantool/wiki/Code-review-procedure#testing . The test file names should have a special pattern. Please, follow it.   Rename test, add necessary gh-5216 (issue number) prefix diff --git a/test/engine/gh-5216-small_alloc_factor.lua b/test/engine/gh-5216-small_alloc_factor.lua +#!/usr/bin/env tarantool + +require('console').listen(os.getenv('ADMIN')) + +box.cfg({ +    wal_mode = 'none', +    memtx_memory = 2*1024*1024*1024, +    listen = os.getenv("LISTEN"), +    memtx_min_tuple_size=32, +    slab_alloc_factor=1.03 +}) diff --git a/test/engine/gh-5216-small_alloc_factor.result b/test/engine/gh-5216-small_alloc_factor.result +env = require('test_run') +--- +... +test_run = env.new() +--- +... +test_run:cmd('create server test with script="engine/gh-5216-small_alloc_factor.lua"') +--- +- true +... +test_run:cmd('start server test with args="none"') +--- +- true +... +test_run:cmd('switch test') +--- +- true +... +s = box.schema.space.create('test') +--- +... +_ = s:create_index('test') +--- +... +function str(i) return string.rep('a', math.floor(256 * math.pow(1.03, i))) end +--- +... +for i=1,276 do _ = s:replace{i+200, str(i)} end +--- +... +for i=1,274 do _ = s:delete{i+200} end +--- +... +collectgarbage('collect') +--- +- 0 +... +_ = s:replace{200+277, str(275)} +--- +... +_ = s:delete{200+275} +--- +... +collectgarbage('collect') +--- +- 0 +... +_ = s:delete{200+276} +--- +... +collectgarbage('collect') +--- +- 0 +... +test_run:cmd('switch default') +--- +- true +... +test_run:cmd('stop server test') +--- +- true +... +test_run:cmd('cleanup server test') +--- +- true +... +test_run:cmd('delete server test') +--- +- true +... diff --git a/test/engine/gh-5216-small_alloc_factor.test.lua b/test/engine/gh-5216-small_alloc_factor.test.lua +env = require('test_run') +test_run = env.new() +test_run:cmd('create server test with script="engine/gh-5216-small_alloc_factor.lua"') +test_run:cmd('start server test with args="none"') +test_run:cmd('switch test') +s = box.schema.space.create('test') +_ = s:create_index('test') +function str(i) return string.rep('a', math.floor(256 * math.pow(1.03, i))) end +for i=1,276 do _ = s:replace{i+200, str(i)} end +for i=1,274 do _ = s:delete{i+200} end +collectgarbage('collect') +_ = s:replace{200+277, str(275)} +_ = s:delete{200+275} +collectgarbage('collect') +_ = s:delete{200+276} +collectgarbage('collect') +test_run:cmd('switch default') +test_run:cmd('stop server test') +test_run:cmd('cleanup server test') +test_run:cmd('delete server test')