diff options
Diffstat (limited to 'vespalib')
4 files changed, 37 insertions, 5 deletions
diff --git a/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp b/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp index 222e820546e..39c93dd98fe 100644 --- a/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp +++ b/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp @@ -84,6 +84,7 @@ DataStoreBase::DataStoreBase(uint32_t numBuffers, size_t maxArrays) _elemHold2List(), _numBuffers(numBuffers), _maxArrays(maxArrays), + _compaction_count(0u), _genHolder() { } @@ -453,6 +454,7 @@ DataStoreBase::markCompacting(uint32_t bufferId) state.setCompacting(); state.disableElemHoldList(); state.setFreeListList(nullptr); + ++_compaction_count; } std::vector<uint32_t> diff --git a/vespalib/src/vespa/vespalib/datastore/datastorebase.h b/vespalib/src/vespa/vespalib/datastore/datastorebase.h index 4886237194f..2c7f3eae920 100644 --- a/vespalib/src/vespa/vespalib/datastore/datastorebase.h +++ b/vespalib/src/vespa/vespalib/datastore/datastorebase.h @@ -8,6 +8,7 @@ #include <vespa/vespalib/util/memoryusage.h> #include <vector> #include <deque> +#include <atomic> namespace search::datastore { @@ -148,6 +149,7 @@ protected: const uint32_t _numBuffers; const size_t _maxArrays; + mutable std::atomic<uint64_t> _compaction_count; vespalib::GenerationHolder _genHolder; @@ -355,6 +357,8 @@ public: uint32_t startCompactWorstBuffer(uint32_t typeId); std::vector<uint32_t> startCompactWorstBuffers(bool compactMemory, bool compactAddressSpace); + uint64_t get_compaction_count() const { return _compaction_count.load(std::memory_order_relaxed); } + void bump_compaction_count() const { ++_compaction_count; } }; } diff --git a/vespalib/src/vespa/vespalib/datastore/unique_store_enumerator.h b/vespalib/src/vespa/vespalib/datastore/unique_store_enumerator.h index 94c217bf836..a2e626c6b20 100644 --- a/vespalib/src/vespa/vespalib/datastore/unique_store_enumerator.h +++ b/vespalib/src/vespa/vespalib/datastore/unique_store_enumerator.h @@ -14,24 +14,29 @@ namespace search::datastore { */ template <typename RefT> class UniqueStoreEnumerator { +public: using RefType = RefT; + using EnumValues = std::vector<std::vector<uint32_t>>; +private: const UniqueStoreDictionaryBase &_dict; - EntryRef _root; + EntryRef _frozen_root; const DataStoreBase &_store; - std::vector<std::vector<uint32_t>> _enumValues; + EnumValues _enumValues; uint32_t _next_enum_val; public: UniqueStoreEnumerator(const UniqueStoreDictionaryBase &dict, const DataStoreBase &store); ~UniqueStoreEnumerator(); + EntryRef get_frozen_root() const { return _frozen_root; } void enumerateValue(EntryRef ref); void enumerateValues(); + void clear(); template <typename Function> void foreach_key(Function &&func) const { - _dict.foreach_key(_root, func); + _dict.foreach_key(_frozen_root, func); } uint32_t mapEntryRefToEnumValue(EntryRef ref) const { @@ -45,6 +50,19 @@ public: return 0u; } } + + uint32_t map_entry_ref_to_enum_value_or_zero(EntryRef ref) const { + if (ref.valid()) { + RefType iRef(ref); + if (iRef.unscaled_offset() < _enumValues[iRef.bufferId()].size()) { + return _enumValues[iRef.bufferId()][iRef.unscaled_offset()]; + } else { + return 0u; + } + } else { + return 0u; + } + } }; } diff --git a/vespalib/src/vespa/vespalib/datastore/unique_store_enumerator.hpp b/vespalib/src/vespa/vespalib/datastore/unique_store_enumerator.hpp index b364c2a2ba3..a6053d4f64e 100644 --- a/vespalib/src/vespa/vespalib/datastore/unique_store_enumerator.hpp +++ b/vespalib/src/vespa/vespalib/datastore/unique_store_enumerator.hpp @@ -9,8 +9,9 @@ namespace search::datastore { template <typename RefT> UniqueStoreEnumerator<RefT>::UniqueStoreEnumerator(const UniqueStoreDictionaryBase &dict, const DataStoreBase &store) : _dict(dict), - _root(_dict.get_frozen_root()), + _frozen_root(_dict.get_frozen_root()), _store(store), + _enumValues(), _next_enum_val(1) { } @@ -45,7 +46,14 @@ UniqueStoreEnumerator<RefT>::enumerateValues() } } _next_enum_val = 1; - _dict.foreach_key(_root, [this](EntryRef ref) { enumerateValue(ref); }); + _dict.foreach_key(_frozen_root, [this](EntryRef ref) { enumerateValue(ref); }); +} + +template <typename RefT> +void +UniqueStoreEnumerator<RefT>::clear() +{ + EnumValues().swap(_enumValues); } } |