diff options
author | HÃ¥vard Pettersen <3535158+havardpe@users.noreply.github.com> | 2022-04-28 15:13:15 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-28 15:13:15 +0200 |
commit | 2d91e0d828d639e6384d87be3a8f9e3d1787a9c9 (patch) | |
tree | 48b76c898927e9108a0e7d23cbf28f0c26e258f4 | |
parent | 04add1191a91616173e3a84a9e69a9215a108d6d (diff) | |
parent | 5d6a1db90ef7fab03ac64fe41bfe6044937dc522 (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.
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)); |