diff options
author | Tor Egge <Tor.Egge@broadpark.no> | 2021-03-29 12:39:30 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@broadpark.no> | 2021-03-29 12:47:22 +0200 |
commit | a2e063d3394e1eb32b8899daebe3a222f5db4cdb (patch) | |
tree | b2e71e6272269ddc9c7158c27cd3a3600e55db2c /vespalib/src | |
parent | f9c63106a9800731b272aaf9c1be32513b303c87 (diff) |
Control document meta store compaction pace.
Diffstat (limited to 'vespalib/src')
-rw-r--r-- | vespalib/src/vespa/vespalib/btree/btreenodestore.h | 4 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/datastore/datastorebase.cpp | 11 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/datastore/datastorebase.h | 3 |
3 files changed, 18 insertions, 0 deletions
diff --git a/vespalib/src/vespa/vespalib/btree/btreenodestore.h b/vespalib/src/vespa/vespalib/btree/btreenodestore.h index 0b273b54c3a..81017447580 100644 --- a/vespalib/src/vespa/vespalib/btree/btreenodestore.h +++ b/vespalib/src/vespa/vespalib/btree/btreenodestore.h @@ -191,6 +191,10 @@ public: return _store.getCompacting(ref); } + bool has_held_buffers() const { + return _store.has_held_buffers(); + } + template <typename FunctionType> void foreach_key(EntryRef ref, FunctionType func) const { if (!ref.valid()) diff --git a/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp b/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp index 2ec8cb3bda3..cce0b0695c2 100644 --- a/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp +++ b/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp @@ -66,6 +66,7 @@ public: _dsb(dsb), _bufferId(bufferId) { + _dsb.inc_hold_buffer_count(); } ~BufferHold() override @@ -85,6 +86,7 @@ DataStoreBase::DataStoreBase(uint32_t numBuffers, size_t maxArrays) _elemHold1List(), _elemHold2List(), _numBuffers(numBuffers), + _hold_buffer_count(0u), _maxArrays(maxArrays), _compaction_count(0u), _genHolder() @@ -187,6 +189,8 @@ DataStoreBase::transferHoldLists(generation_t generation) void DataStoreBase::doneHoldBuffer(uint32_t bufferId) { + assert(_hold_buffer_count > 0); + --_hold_buffer_count; _states[bufferId].onFree(_buffers[bufferId].getBuffer()); } @@ -515,5 +519,12 @@ DataStoreBase::startCompactWorstBuffers(bool compactMemory, bool compactAddressS return result; } +void +DataStoreBase::inc_hold_buffer_count() +{ + assert(_hold_buffer_count < std::numeric_limits<uint32_t>::max()); + ++_hold_buffer_count; +} + } diff --git a/vespalib/src/vespa/vespalib/datastore/datastorebase.h b/vespalib/src/vespa/vespalib/datastore/datastorebase.h index 2617973d239..13c242e85a7 100644 --- a/vespalib/src/vespa/vespalib/datastore/datastorebase.h +++ b/vespalib/src/vespa/vespalib/datastore/datastorebase.h @@ -156,6 +156,7 @@ protected: ElemHold2List _elemHold2List; const uint32_t _numBuffers; + uint32_t _hold_buffer_count; const size_t _maxArrays; mutable std::atomic<uint64_t> _compaction_count; @@ -350,6 +351,7 @@ private: */ void onActive(uint32_t bufferId, uint32_t typeId, size_t elemsNeeded); + void inc_hold_buffer_count(); public: uint32_t getTypeId(uint32_t bufferId) const { return _buffers[bufferId].getTypeId(); @@ -368,6 +370,7 @@ public: std::vector<uint32_t> startCompactWorstBuffers(bool compactMemory, bool compactAddressSpace); uint64_t get_compaction_count() const { return _compaction_count.load(std::memory_order_relaxed); } void inc_compaction_count() const { ++_compaction_count; } + bool has_held_buffers() const noexcept { return _hold_buffer_count != 0u; } }; } |