aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHÃ¥vard Pettersen <3535158+havardpe@users.noreply.github.com>2022-04-28 15:13:15 +0200
committerGitHub <noreply@github.com>2022-04-28 15:13:15 +0200
commit2d91e0d828d639e6384d87be3a8f9e3d1787a9c9 (patch)
tree48b76c898927e9108a0e7d23cbf28f0c26e258f4
parent04add1191a91616173e3a84a9e69a9215a108d6d (diff)
parent5d6a1db90ef7fab03ac64fe41bfe6044937dc522 (diff)
Merge pull request #22339 from vespa-engine/toregge/use-atomic-entry-ref-as-value-for-memory-index-dictionary
Use vespalib::datastore::AtomicEntryRef as value type for memory index dictionary.
-rw-r--r--searchlib/src/vespa/searchlib/memoryindex/field_index.cpp14
-rw-r--r--searchlib/src/vespa/searchlib/memoryindex/field_index_base.h2
-rw-r--r--searchlib/src/vespa/searchlib/memoryindex/ordered_field_index_inserter.cpp10
3 files changed, 11 insertions, 15 deletions
diff --git a/searchlib/src/vespa/searchlib/memoryindex/field_index.cpp b/searchlib/src/vespa/searchlib/memoryindex/field_index.cpp
index 2a026704a0e..60e22ee4a1a 100644
--- a/searchlib/src/vespa/searchlib/memoryindex/field_index.cpp
+++ b/searchlib/src/vespa/searchlib/memoryindex/field_index.cpp
@@ -62,12 +62,10 @@ FieldIndex<interleaved_features>::~FieldIndex()
// XXX: Kludge
for (DictionaryTree::Iterator it = _dict.begin();
it.valid(); ++it) {
- EntryRef pidx(it.getData());
+ EntryRef pidx(it.getData().load_relaxed());
if (pidx.valid()) {
_postingListStore.clear(pidx);
- // Before updating ref
- std::atomic_thread_fence(std::memory_order_release);
- it.writeData(EntryRef().ref());
+ it.getWData().store_release(EntryRef());
}
}
_postingListStore.clearBuilder();
@@ -86,7 +84,7 @@ FieldIndex<interleaved_features>::find(const vespalib::stringref word) const
{
DictionaryTree::Iterator itr = _dict.find(WordKey(EntryRef()), KeyComp(_wordStore, word));
if (itr.valid()) {
- return _postingListStore.begin(EntryRef(itr.getData()));
+ return _postingListStore.begin(itr.getData().load_relaxed());
}
return typename PostingList::Iterator();
}
@@ -97,7 +95,7 @@ FieldIndex<interleaved_features>::findFrozen(const vespalib::stringref word) con
{
auto itr = _dict.getFrozenView().find(WordKey(EntryRef()), KeyComp(_wordStore, word));
if (itr.valid()) {
- return _postingListStore.beginFrozen(EntryRef(itr.getData()));
+ return _postingListStore.beginFrozen(itr.getData().load_acquire());
}
return typename PostingList::Iterator();
}
@@ -112,7 +110,7 @@ FieldIndex<interleaved_features>::compactFeatures()
auto itr = _dict.begin();
uint32_t packedIndex = _fieldId;
for (; itr.valid(); ++itr) {
- typename PostingListStore::RefType pidx(EntryRef(itr.getData()));
+ typename PostingListStore::RefType pidx(itr.getData().load_relaxed());
if (!pidx.valid()) {
continue;
}
@@ -170,7 +168,7 @@ FieldIndex<interleaved_features>::dump(search::index::IndexBuilder & indexBuilde
_featureStore.setupForField(_fieldId, decoder);
for (auto itr = _dict.begin(); itr.valid(); ++itr) {
const WordKey & wk = itr.getKey();
- typename PostingListStore::RefType plist(EntryRef(itr.getData()));
+ typename PostingListStore::RefType plist(itr.getData().load_relaxed());
word = _wordStore.getWord(wk._wordRef);
if (!plist.valid()) {
continue;
diff --git a/searchlib/src/vespa/searchlib/memoryindex/field_index_base.h b/searchlib/src/vespa/searchlib/memoryindex/field_index_base.h
index ea5146457d8..ea373662290 100644
--- a/searchlib/src/vespa/searchlib/memoryindex/field_index_base.h
+++ b/searchlib/src/vespa/searchlib/memoryindex/field_index_base.h
@@ -65,7 +65,7 @@ public:
}
};
- using PostingListPtr = uint32_t;
+ using PostingListPtr = vespalib::datastore::AtomicEntryRef;
using DictionaryTree = vespalib::btree::BTree<WordKey, PostingListPtr,
vespalib::btree::NoAggregated,
const KeyComp>;
diff --git a/searchlib/src/vespa/searchlib/memoryindex/ordered_field_index_inserter.cpp b/searchlib/src/vespa/searchlib/memoryindex/ordered_field_index_inserter.cpp
index f2c56506ebf..be6de7d3360 100644
--- a/searchlib/src/vespa/searchlib/memoryindex/ordered_field_index_inserter.cpp
+++ b/searchlib/src/vespa/searchlib/memoryindex/ordered_field_index_inserter.cpp
@@ -54,16 +54,14 @@ OrderedFieldIndexInserter<interleaved_features>::flushWord()
}
//XXX: Feature store leak, removed features not marked dead
PostingListStore &postingListStore(_fieldIndex.getPostingListStore());
- vespalib::datastore::EntryRef pidx(_dItr.getData());
+ vespalib::datastore::EntryRef pidx(_dItr.getData().load_relaxed());
postingListStore.apply(pidx,
&_adds[0],
&_adds[0] + _adds.size(),
&_removes[0],
&_removes[0] + _removes.size());
- if (pidx.ref() != _dItr.getData()) {
- // Before updating ref
- std::atomic_thread_fence(std::memory_order_release);
- _dItr.writeData(pidx.ref());
+ if (pidx != _dItr.getData().load_relaxed()) {
+ _dItr.getWData().store_release(pidx);
}
_removes.clear();
_adds.clear();
@@ -105,7 +103,7 @@ OrderedFieldIndexInserter<interleaved_features>::setNextWord(const vespalib::str
WordKey insertKey(wordRef);
DictionaryTree &dTree(_fieldIndex.getDictionaryTree());
- dTree.insert(_dItr, insertKey, vespalib::datastore::EntryRef().ref());
+ dTree.insert(_dItr, insertKey, vespalib::datastore::AtomicEntryRef());
}
assert(_dItr.valid());
assert(_word == wordStore.getWord(_dItr.getKey()._wordRef));