diff options
author | Geir Storli <geirst@verizonmedia.com> | 2020-06-25 10:15:27 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-25 10:15:27 +0200 |
commit | 0680bf96a4bf17aec0b9fde98ac5369c0991f0fb (patch) | |
tree | f70164f29b20b702d5fdad39c0dbfb3319d7c83a /searchlib | |
parent | 76ae6e30afa952cefad465d4b83329715b9c1bef (diff) | |
parent | 8a5e393a17979ee3252fa9b23e7e24414b1e4743 (diff) |
Merge pull request #13700 from vespa-engine/arnej/keep-read-guard-until-write-finished
Arnej/keep read guard until write finished
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp | 10 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/tensor/hnsw_index.h | 11 |
2 files changed, 13 insertions, 8 deletions
diff --git a/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp b/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp index 5c36f7bcb37..2a17378f58a 100644 --- a/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp +++ b/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp @@ -289,16 +289,17 @@ HnswIndex::~HnswIndex() = default; void HnswIndex::add_document(uint32_t docid) { - PreparedAddDoc op = internal_prepare_add(docid, get_vector(docid)); + vespalib::GenerationHandler::Guard no_guard_needed; + PreparedAddDoc op = internal_prepare_add(docid, get_vector(docid), no_guard_needed); internal_complete_add(docid, op); } HnswIndex::PreparedAddDoc -HnswIndex::internal_prepare_add(uint32_t docid, TypedCells input_vector) const +HnswIndex::internal_prepare_add(uint32_t docid, TypedCells input_vector, vespalib::GenerationHandler::Guard read_guard) const { // TODO: Add capping on num_levels int level = _level_generator->max_level(); - PreparedAddDoc op(docid, level); + PreparedAddDoc op(docid, level, std::move(read_guard)); auto entry = _graph.get_entry_node(); if (entry.docid == 0) { // graph has no entry point @@ -379,8 +380,7 @@ HnswIndex::prepare_add_document(uint32_t docid, // to ensure they are linked together: return std::unique_ptr<PrepareResult>(); } - PreparedAddDoc op = internal_prepare_add(docid, vector); - (void) read_guard; // must keep guard until this point + PreparedAddDoc op = internal_prepare_add(docid, vector, std::move(read_guard)); return std::make_unique<PreparedAddDoc>(std::move(op)); } diff --git a/searchlib/src/vespa/searchlib/tensor/hnsw_index.h b/searchlib/src/vespa/searchlib/tensor/hnsw_index.h index c237e3b8fcf..f9adef0b86c 100644 --- a/searchlib/src/vespa/searchlib/tensor/hnsw_index.h +++ b/searchlib/src/vespa/searchlib/tensor/hnsw_index.h @@ -126,17 +126,22 @@ protected: const BitVector *filter, uint32_t explore_k) const; struct PreparedAddDoc : public PrepareResult { + using ReadGuard = vespalib::GenerationHandler::Guard; uint32_t docid; int32_t max_level; + ReadGuard read_guard; using Links = std::vector<std::pair<uint32_t, HnswGraph::NodeRef>>; std::vector<Links> connections; - PreparedAddDoc(uint32_t docid_in, int32_t max_level_in) - : docid(docid_in), max_level(max_level_in), connections(max_level+1) + PreparedAddDoc(uint32_t docid_in, int32_t max_level_in, ReadGuard read_guard_in) + : docid(docid_in), max_level(max_level_in), + read_guard(std::move(read_guard_in)), + connections(max_level+1) {} ~PreparedAddDoc() = default; PreparedAddDoc(PreparedAddDoc&& other) = default; }; - PreparedAddDoc internal_prepare_add(uint32_t docid, TypedCells input_vector) const; + PreparedAddDoc internal_prepare_add(uint32_t docid, TypedCells input_vector, + vespalib::GenerationHandler::Guard read_guard) const; LinkArray filter_valid_docids(uint32_t level, const PreparedAddDoc::Links &neighbors, uint32_t me); void internal_complete_add(uint32_t docid, PreparedAddDoc &op); public: |