diff options
Diffstat (limited to 'vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp')
-rw-r--r-- | vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp | 77 |
1 files changed, 65 insertions, 12 deletions
diff --git a/vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp b/vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp index 96d94e9a71b..d647a659eb6 100644 --- a/vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp +++ b/vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp @@ -14,6 +14,7 @@ struct Setup { uint32_t _minArrays; ElemCount _usedElems; ElemCount _neededElems; + ElemCount _deadElems; uint32_t _bufferId; float _allocGrowFactor; bool _resizing; @@ -21,6 +22,7 @@ struct Setup { : _minArrays(0), _usedElems(0), _neededElems(0), + _deadElems(0), _bufferId(1), _allocGrowFactor(0.5), _resizing(false) @@ -28,30 +30,46 @@ struct Setup { Setup &minArrays(uint32_t value) { _minArrays = value; return *this; } Setup &used(size_t value) { _usedElems = value; return *this; } Setup &needed(size_t value) { _neededElems = value; return *this; } + Setup &dead(size_t value) { _deadElems = value; return *this; } Setup &bufferId(uint32_t value) { _bufferId = value; return *this; } Setup &resizing(bool value) { _resizing = value; return *this; } }; struct Fixture { - Setup setup; + std::vector<Setup> setups; IntBufferType bufferType; - ElemCount deadElems; int buffer[ARRAYS_SIZE]; Fixture(const Setup &setup_) - : setup(setup_), - bufferType(ARRAYS_SIZE, setup._minArrays, MAX_ARRAYS, NUM_ARRAYS_FOR_NEW_BUFFER, setup._allocGrowFactor), - deadElems(0), + : setups(), + bufferType(ARRAYS_SIZE, setup_._minArrays, MAX_ARRAYS, NUM_ARRAYS_FOR_NEW_BUFFER, setup_._allocGrowFactor), buffer() - {} + { + setups.reserve(4); + setups.push_back(setup_); + } ~Fixture() { - bufferType.onHold(&setup._usedElems); - bufferType.onFree(setup._usedElems); + for (auto& setup : setups) { + bufferType.onHold(&setup._usedElems, &setup._deadElems); + bufferType.onFree(setup._usedElems); + } + } + Setup& curr_setup() { + return setups.back(); + } + void add_setup(const Setup& setup_in) { + // The buffer type stores pointers to ElemCount (from Setup) and we must ensure these do not move in memory. + assert(setups.size() < setups.capacity()); + setups.push_back(setup_in); } void onActive() { - bufferType.onActive(setup._bufferId, &setup._usedElems, deadElems, &buffer[0]); + bufferType.onActive(curr_setup()._bufferId, &curr_setup()._usedElems, &curr_setup()._deadElems, &buffer[0]); } size_t arraysToAlloc() { - return bufferType.calcArraysToAlloc(setup._bufferId, setup._neededElems, setup._resizing); + return bufferType.calcArraysToAlloc(curr_setup()._bufferId, curr_setup()._neededElems, curr_setup()._resizing); + } + void assertArraysToAlloc(size_t exp) { + onActive(); + EXPECT_EQUAL(exp, arraysToAlloc()); } }; @@ -59,8 +77,7 @@ void assertArraysToAlloc(size_t exp, const Setup &setup) { Fixture f(setup); - f.onActive(); - EXPECT_EQUAL(exp, f.arraysToAlloc()); + f.assertArraysToAlloc(exp); } TEST("require that complete arrays are allocated") @@ -113,4 +130,40 @@ TEST("require that arrays to alloc is capped to min arrays") TEST_DO(assertArraysToAlloc(17, Setup().used(34 * 4).needed(4).minArrays(16))); } +TEST("arrays to alloc considers used elements across all active buffers (no resizing)") +{ + Fixture f(Setup().used(6 * 4)); + f.assertArraysToAlloc(6 * 0.5); + f.add_setup(Setup().used(8 * 4)); + f.assertArraysToAlloc((6 + 8) * 0.5); + f.add_setup(Setup().used(10 * 4)); + f.assertArraysToAlloc((6 + 8 + 10) * 0.5); +} + +TEST("arrays to alloc only considers used elements in current buffer when resizing") +{ + Fixture f(Setup().used(6 * 4)); + f.assertArraysToAlloc(6 * 0.5); + f.add_setup(Setup().used(8 * 4).resizing(true)); + f.assertArraysToAlloc(8 + 8 * 0.5); +} + +TEST("arrays to alloc considers (and subtracts) dead elements across all active buffers (no resizing)") +{ + Fixture f(Setup().used(6 * 4).dead(2 * 4)); + f.assertArraysToAlloc((6 - 2) * 0.5); + f.add_setup(Setup().used(12 * 4).dead(4 * 4)); + f.assertArraysToAlloc((6 - 2 + 12 - 4) * 0.5); + f.add_setup(Setup().used(20 * 4).dead(6 * 4)); + f.assertArraysToAlloc((6 - 2 + 12 - 4 + 20 - 6) * 0.5); +} + +TEST("arrays to alloc only considers (and subtracts) dead elements in current buffer when resizing") +{ + Fixture f(Setup().used(6 * 4).dead(2 * 4)); + f.assertArraysToAlloc((6 - 2) * 0.5); + f.add_setup(Setup().used(12 * 4).dead(4 * 4).resizing(true)); + f.assertArraysToAlloc(12 + (12 - 4) * 0.5); +} + TEST_MAIN() { TEST_RUN_ALL(); } |