summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2020-06-25 10:15:27 +0200
committerGitHub <noreply@github.com>2020-06-25 10:15:27 +0200
commit0680bf96a4bf17aec0b9fde98ac5369c0991f0fb (patch)
treef70164f29b20b702d5fdad39c0dbfb3319d7c83a /searchlib
parent76ae6e30afa952cefad465d4b83329715b9c1bef (diff)
parent8a5e393a17979ee3252fa9b23e7e24414b1e4743 (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.cpp10
-rw-r--r--searchlib/src/vespa/searchlib/tensor/hnsw_index.h11
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: