summaryrefslogtreecommitdiffstats
path: root/vespalib/src
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2021-03-29 12:39:30 +0200
committerTor Egge <Tor.Egge@broadpark.no>2021-03-29 12:47:22 +0200
commita2e063d3394e1eb32b8899daebe3a222f5db4cdb (patch)
treeb2e71e6272269ddc9c7158c27cd3a3600e55db2c /vespalib/src
parentf9c63106a9800731b272aaf9c1be32513b303c87 (diff)
Control document meta store compaction pace.
Diffstat (limited to 'vespalib/src')
-rw-r--r--vespalib/src/vespa/vespalib/btree/btreenodestore.h4
-rw-r--r--vespalib/src/vespa/vespalib/datastore/datastorebase.cpp11
-rw-r--r--vespalib/src/vespa/vespalib/datastore/datastorebase.h3
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; }
};
}