Remove redundant index update
This commit is contained in:
parent
c2ec41cb37
commit
97cab6650b
@ -31,7 +31,7 @@ struct CommitInfo;
|
||||
|
||||
inline uint64_t GetNextDeltaUUID() noexcept {
|
||||
static utils::Synchronized<uint64_t, utils::SpinLock> delta_id{0};
|
||||
return delta_id.WithLock([](auto id) { return id++; });
|
||||
return delta_id.WithLock([](auto &id) { return id++; });
|
||||
}
|
||||
|
||||
// This class stores one of three pointers (`Delta`, `Vertex` and `Edge`)
|
||||
|
@ -122,9 +122,7 @@ class LabelIndex {
|
||||
|
||||
void Clear() { index_.clear(); }
|
||||
|
||||
std::map<IndexType, IndexContainer> SplitIndexEntries(
|
||||
const PrimaryKey &split_key,
|
||||
std::map<IndexType, std::multimap<const Vertex *, const IndexContainer::iterator>> &vertex_entry_map) {
|
||||
std::map<IndexType, IndexContainer> SplitIndexEntries(const PrimaryKey &split_key) {
|
||||
if (index_.empty()) {
|
||||
return {};
|
||||
}
|
||||
@ -144,7 +142,7 @@ class LabelIndex {
|
||||
cloned_indices_container.insert(index.extract(entry_it));
|
||||
MG_ASSERT(inserted, "Failed to extract index entry!");
|
||||
|
||||
vertex_entry_map[index_type_val].insert({inserted_entry_it->vertex, inserted_entry_it});
|
||||
// vertex_entry_map[index_type_val].insert({inserted_entry_it->vertex, inserted_entry_it});
|
||||
}
|
||||
entry_it = next_entry_it;
|
||||
}
|
||||
@ -269,9 +267,7 @@ class LabelPropertyIndex {
|
||||
|
||||
void Clear() { index_.clear(); }
|
||||
|
||||
std::map<IndexType, IndexContainer> SplitIndexEntries(
|
||||
const PrimaryKey &split_key,
|
||||
std::map<IndexType, std::multimap<const Vertex *, const IndexContainer::iterator>> &vertex_entry_map) {
|
||||
std::map<IndexType, IndexContainer> SplitIndexEntries(const PrimaryKey &split_key) {
|
||||
if (index_.empty()) {
|
||||
return {};
|
||||
}
|
||||
@ -290,8 +286,7 @@ class LabelPropertyIndex {
|
||||
[[maybe_unused]] const auto &[inserted_entry_it, inserted, node] =
|
||||
cloned_index_container.insert(index.extract(entry_it));
|
||||
MG_ASSERT(inserted, "Failed to extract index entry!");
|
||||
|
||||
vertex_entry_map[index_type_val].insert({inserted_entry_it->vertex, inserted_entry_it});
|
||||
// vertex_entry_map[index_type_val].insert({inserted_entry_it->vertex, inserted_entry_it});
|
||||
}
|
||||
entry_it = next_entry_it;
|
||||
}
|
||||
|
@ -69,31 +69,8 @@ void Splitter::ScanDeltas(std::set<uint64_t> &collected_transactions_, Delta *de
|
||||
|
||||
VertexContainer Splitter::CollectVertices(SplitData &data, std::set<uint64_t> &collected_transactions_,
|
||||
const PrimaryKey &split_key) {
|
||||
// Collection of indices is here since it heavily depends on vertices
|
||||
// Old vertex pointer new entry pointer
|
||||
std::map<LabelId, std::multimap<const Vertex *, const LabelIndex::IndexContainer::iterator>>
|
||||
label_index_vertex_entry_map;
|
||||
std::map<std::pair<LabelId, PropertyId>,
|
||||
std::multimap<const Vertex *, const LabelPropertyIndex::IndexContainer::iterator>>
|
||||
label_property_vertex_entry_map;
|
||||
|
||||
data.label_indices = indices_.label_index.SplitIndexEntries(split_key, label_index_vertex_entry_map);
|
||||
data.label_property_indices =
|
||||
indices_.label_property_index.SplitIndexEntries(split_key, label_property_vertex_entry_map);
|
||||
// This is needed to replace old vertex pointers in index entries with new ones
|
||||
const auto update_indices = [](auto &entry_vertex_map, auto &updating_index, const auto *old_vertex_ptr,
|
||||
auto &new_vertex_it) {
|
||||
for ([[maybe_unused]] auto &[index_type, vertex_entry_mappings] : entry_vertex_map) {
|
||||
auto [it, end] = vertex_entry_mappings.equal_range(old_vertex_ptr);
|
||||
while (it != end) {
|
||||
auto entry_to_update = *it->second;
|
||||
entry_to_update.vertex = &*new_vertex_it;
|
||||
updating_index.at(index_type).erase(it->second);
|
||||
updating_index.at(index_type).insert(std::move(entry_to_update));
|
||||
++it;
|
||||
}
|
||||
}
|
||||
};
|
||||
data.label_indices = indices_.label_index.SplitIndexEntries(split_key);
|
||||
data.label_property_indices = indices_.label_property_index.SplitIndexEntries(split_key);
|
||||
|
||||
VertexContainer splitted_data;
|
||||
auto split_key_it = vertices_.find(split_key);
|
||||
@ -101,16 +78,11 @@ VertexContainer Splitter::CollectVertices(SplitData &data, std::set<uint64_t> &c
|
||||
// Go through deltas and pick up transactions start_id/commit_id
|
||||
ScanDeltas(collected_transactions_, split_key_it->second.delta);
|
||||
|
||||
const auto *old_vertex_ptr = &*split_key_it;
|
||||
auto next_it = std::next(split_key_it);
|
||||
|
||||
const auto &[splitted_vertex_it, inserted, node] = splitted_data.insert(vertices_.extract(split_key_it->first));
|
||||
MG_ASSERT(inserted, "Failed to extract vertex!");
|
||||
|
||||
// Update indices
|
||||
update_indices(label_index_vertex_entry_map, data.label_indices, old_vertex_ptr, splitted_vertex_it);
|
||||
update_indices(label_property_vertex_entry_map, data.label_property_indices, old_vertex_ptr, splitted_vertex_it);
|
||||
|
||||
split_key_it = next_it;
|
||||
}
|
||||
return splitted_data;
|
||||
|
@ -147,11 +147,11 @@ TEST_F(ShardSplitTest, TestBasicSplitWithVertices) {
|
||||
EXPECT_EQ(splitted_data.label_property_indices.size(), 0);
|
||||
|
||||
CommitInfo commit_info{.start_or_commit_timestamp = current_hlc};
|
||||
Delta delta_delete1{Delta::DeleteObjectTag{}, &commit_info, 5, 1};
|
||||
Delta delta_delete2{Delta::DeleteObjectTag{}, &commit_info, 6, 2};
|
||||
Delta delta_remove_label{Delta::RemoveLabelTag{}, secondary_label, &commit_info, 8, 4};
|
||||
Delta delta_set_property{Delta::SetPropertyTag{}, secondary_property, PropertyValue(), &commit_info, 7, 4};
|
||||
Delta delta_delete3{Delta::DeleteObjectTag{}, &commit_info, 9, 3};
|
||||
Delta delta_delete1{Delta::DeleteObjectTag{}, &commit_info, 4, 1};
|
||||
Delta delta_delete2{Delta::DeleteObjectTag{}, &commit_info, 5, 2};
|
||||
Delta delta_remove_label{Delta::RemoveLabelTag{}, secondary_label, &commit_info, 7, 4};
|
||||
Delta delta_set_property{Delta::SetPropertyTag{}, secondary_property, PropertyValue(), &commit_info, 6, 4};
|
||||
Delta delta_delete3{Delta::DeleteObjectTag{}, &commit_info, 8, 3};
|
||||
|
||||
VertexContainer expected_vertices;
|
||||
expected_vertices.emplace(PrimaryKey{PropertyValue{4}}, VertexData(&delta_delete1));
|
||||
@ -191,29 +191,29 @@ TEST_F(ShardSplitTest, TestBasicSplitVerticesAndEdges) {
|
||||
EXPECT_EQ(splitted_data.label_property_indices.size(), 0);
|
||||
|
||||
CommitInfo commit_info{.start_or_commit_timestamp = current_hlc};
|
||||
Delta delta_delete1{Delta::DeleteObjectTag{}, &commit_info, 13, 1};
|
||||
Delta delta_delete2{Delta::DeleteObjectTag{}, &commit_info, 14, 1};
|
||||
Delta delta_delete3{Delta::DeleteObjectTag{}, &commit_info, 15, 1};
|
||||
Delta delta_delete1{Delta::DeleteObjectTag{}, &commit_info, 12, 1};
|
||||
Delta delta_delete2{Delta::DeleteObjectTag{}, &commit_info, 13, 1};
|
||||
Delta delta_delete3{Delta::DeleteObjectTag{}, &commit_info, 14, 1};
|
||||
Delta delta_add_in_edge1{Delta::RemoveInEdgeTag{},
|
||||
edge_type_id,
|
||||
VertexId{primary_label, {PropertyValue(1)}},
|
||||
EdgeRef{Gid::FromUint(1)},
|
||||
&commit_info,
|
||||
18,
|
||||
17,
|
||||
1};
|
||||
Delta delta_add_out_edge2{Delta::RemoveOutEdgeTag{},
|
||||
edge_type_id,
|
||||
VertexId{primary_label, {PropertyValue(6)}},
|
||||
EdgeRef{Gid::FromUint(2)},
|
||||
&commit_info,
|
||||
20,
|
||||
19,
|
||||
1};
|
||||
Delta delta_add_in_edge2{Delta::RemoveInEdgeTag{},
|
||||
edge_type_id,
|
||||
VertexId{primary_label, {PropertyValue(4)}},
|
||||
EdgeRef{Gid::FromUint(2)},
|
||||
&commit_info,
|
||||
21,
|
||||
20,
|
||||
1};
|
||||
VertexContainer expected_vertices;
|
||||
auto [vtx4, inserted4] = expected_vertices.emplace(PrimaryKey{PropertyValue{4}}, VertexData(&delta_delete1));
|
||||
|
Loading…
Reference in New Issue
Block a user