aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-03-13 13:10:08 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-03-13 13:10:08 +0000
commita59edb3ea9b98105528f7544094e7ccae63f883c (patch)
tree5054f3ed5c03c153a735bbc7a57d46b5c42de90d
parent8ad3f6f9fc210ced8915275f795c660fe87ef4a4 (diff)
Properly propagate hold list and free list settings when creating new state.
-rw-r--r--vespalib/src/vespa/vespalib/datastore/datastorebase.cpp21
-rw-r--r--vespalib/src/vespa/vespalib/datastore/datastorebase.h1
2 files changed, 12 insertions, 10 deletions
diff --git a/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp b/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp
index a0c5e282f9a..a9406fa7cde 100644
--- a/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp
+++ b/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp
@@ -94,6 +94,7 @@ DataStoreBase::DataStoreBase(uint32_t numBuffers, uint32_t offset_bits, size_t m
_hold_buffer_count(0u),
_offset_bits(offset_bits),
_freeListsEnabled(false),
+ _disableElemHoldList(false),
_initializing(false)
{
}
@@ -334,15 +335,6 @@ DataStoreBase::disableFreeLists()
}
void
-DataStoreBase::enableFreeList(uint32_t bufferId)
-{
- BufferState &state = getBufferState(bufferId);
- if (_freeListsEnabled && state.isActive() && !state.getCompacting()) {
- state.enable_free_list(_free_lists[state.getTypeId()]);
- }
-}
-
-void
DataStoreBase::disableElemHoldList()
{
for (const auto& buffer : _buffers) {
@@ -351,6 +343,7 @@ DataStoreBase::disableElemHoldList()
state->disableElemHoldList();
}
}
+ _disableElemHoldList = true;
}
MemoryStats
@@ -426,6 +419,12 @@ DataStoreBase::onActive(uint32_t bufferId, uint32_t typeId, size_t elemsNeeded)
BufferState *state = bufferMeta.get_state_relaxed();
if (state == nullptr) {
BufferState & newState = _stash.create<BufferState>();
+ if (_disableElemHoldList) {
+ newState.disableElemHoldList();
+ }
+ if ( ! _freeListsEnabled) {
+ newState.disable_free_list();
+ }
state = & newState;
bufferMeta.set_state(state);
_bufferIdLimit.store(bufferId + 1);
@@ -434,7 +433,9 @@ DataStoreBase::onActive(uint32_t bufferId, uint32_t typeId, size_t elemsNeeded)
state->onActive(bufferId, typeId, _typeHandlers[typeId], elemsNeeded, bufferMeta.get_atomic_buffer());
bufferMeta.setTypeId(typeId);
bufferMeta.setArraySize(state->getArraySize());
- enableFreeList(bufferId);
+ if (_freeListsEnabled && state->isActive() && !state->getCompacting()) {
+ state->enable_free_list(_free_lists[state->getTypeId()]);
+ }
}
void
diff --git a/vespalib/src/vespa/vespalib/datastore/datastorebase.h b/vespalib/src/vespa/vespalib/datastore/datastorebase.h
index fd5b97503c9..186d8611194 100644
--- a/vespalib/src/vespa/vespalib/datastore/datastorebase.h
+++ b/vespalib/src/vespa/vespalib/datastore/datastorebase.h
@@ -265,6 +265,7 @@ private:
uint32_t _hold_buffer_count;
const uint8_t _offset_bits;
bool _freeListsEnabled;
+ bool _disableElemHoldList;
bool _initializing;
};