summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2019-08-27 10:34:34 +0200
committerGitHub <noreply@github.com>2019-08-27 10:34:34 +0200
commit6130643ad1dd31064b47fcac4d07a3a590cbdf29 (patch)
tree8fcd33ccf337a0e9d64fc87899bd6a7b43f94dd6 /vespalib
parenta6441b5c9ac6cdb89aafe8d62bbf6222dd7d8dd0 (diff)
parent919cbab31203663df7d417e9457714f009d1eb87 (diff)
Merge pull request #10417 from vespa-engine/toregge/use-unique-store-enumerator-when-saving-enumerated-attributes
Use unique store enumerator when saving enumerated attribute vectors.
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/vespa/vespalib/datastore/datastorebase.cpp2
-rw-r--r--vespalib/src/vespa/vespalib/datastore/datastorebase.h4
-rw-r--r--vespalib/src/vespa/vespalib/datastore/unique_store_enumerator.h24
-rw-r--r--vespalib/src/vespa/vespalib/datastore/unique_store_enumerator.hpp12
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);
}
}