diff --git a/src/storage/v2/disk/storage.cpp b/src/storage/v2/disk/storage.cpp index a6f5834ba..250ac3f55 100644 --- a/src/storage/v2/disk/storage.cpp +++ b/src/storage/v2/disk/storage.cpp @@ -552,7 +552,6 @@ VerticesIterable DiskStorage::DiskAccessor::Vertices(LabelId label, View view) { std::list *index_deltas{nullptr}; auto merge_with_main_cache = [&](auto &index, auto &index_delta_storage) -> std::unordered_set { - index[cache_key] = utils::SkipList(); indexed_vertices = &index[cache_key]; index_delta_storage.emplace_back(); index_deltas = &index_delta_storage.back(); @@ -560,24 +559,36 @@ VerticesIterable DiskStorage::DiskAccessor::Vertices(LabelId label, View view) { return MergeVerticesFromMainCacheWithLabelIndexCache(cache_key, view, *index_deltas, *indexed_vertices); }; - auto &label_index_cache = transaction_.label_index_cache_; - auto &label_index_cache_ci = transaction_.label_index_cache_ci_; + auto &cache = transaction_.label_index_cache_; + auto &cache_ci = transaction_.label_index_cache_ci_; auto &index_delta_storage = transaction_.index_deltas_storage_; - if (transaction_.command_id > label_index_cache_ci) { - label_index_cache_ci = transaction_.command_id; + SyncDeletedVertices(cache, cache_key, index_delta_storage, view, merge_with_main_cache); - auto gids = merge_with_main_cache(label_index_cache, index_delta_storage); - LoadVerticesFromDiskLabelIndex(gids, cache_key, *index_deltas, *indexed_vertices); + if (transaction_.command_id > cache_ci) { + cache_ci = transaction_.command_id; } else { - if (label_index_cache.contains(cache_key) && view == View::OLD) { - merge_with_main_cache(label_index_cache, index_delta_storage); - } else { - auto gids = merge_with_main_cache(label_index_cache, index_delta_storage); - LoadVerticesFromDiskLabelIndex(gids, cache_key, *index_deltas, *indexed_vertices); + if (cache.contains(cache_key)) { + if (view == View::OLD) { + // TODO + // we do not need this merge if we can make sure that + // the removing and re-adding the same label to a given + // vertex within one transaction is not permitted. + merge_with_main_cache(cache, index_delta_storage); + return VerticesIterable(AllVerticesIterable(cache[cache_key].access(), storage_, &transaction_, view)); + } + cache[cache_key] = utils::SkipList(); + merge_with_main_cache(cache, index_delta_storage); + return VerticesIterable(AllVerticesIterable(cache[cache_key].access(), storage_, &transaction_, view)); } + + cache[cache_key] = utils::SkipList(); + index_delta_storage.emplace_back(); + index_deltas = &index_delta_storage.back(); + LoadVerticesFromDiskLabelIndex({}, cache_key, *index_deltas, transaction_.vertices_); } + merge_with_main_cache(cache, index_delta_storage); return VerticesIterable(AllVerticesIterable(indexed_vertices->access(), storage_, &transaction_, view)); } @@ -620,22 +631,35 @@ VerticesIterable DiskStorage::DiskAccessor::Vertices(LabelId label, PropertyId p auto &label_property_index_cache_ci = transaction_.label_property_index_cache_ci_; auto &index_delta_storage = transaction_.index_deltas_storage_; + SyncDeletedVertices(label_property_index_cache, cache_key, index_delta_storage, view, merge_with_main_cache); + if (transaction_.command_id > label_property_index_cache_ci) { label_property_index_cache_ci = transaction_.command_id; - - auto gids = merge_with_main_cache(label_property_index_cache, index_delta_storage); - LoadVerticesFromDiskLabelPropertyIndex(gids, label, property, *index_deltas, *indexed_vertices, - disk_label_property_filter); } else { - if (label_property_index_cache.contains(cache_key) && view == View::OLD) { + if (label_property_index_cache.contains(cache_key)) { + if (view == View::OLD) { + // TODO + // we do not need this merge if we can make sure that + // the removing and re-adding the same label to a given + // vertex within one transaction is not permitted. + merge_with_main_cache(label_property_index_cache, index_delta_storage); + return VerticesIterable( + AllVerticesIterable(label_property_index_cache[cache_key].access(), storage_, &transaction_, view)); + } + label_property_index_cache[cache_key] = utils::SkipList(); merge_with_main_cache(label_property_index_cache, index_delta_storage); - } else { - auto gids = merge_with_main_cache(label_property_index_cache, index_delta_storage); - LoadVerticesFromDiskLabelPropertyIndex(gids, label, property, *index_deltas, *indexed_vertices, - disk_label_property_filter); + return VerticesIterable( + AllVerticesIterable(label_property_index_cache[cache_key].access(), storage_, &transaction_, view)); } + + label_property_index_cache[cache_key] = utils::SkipList(); + index_delta_storage.emplace_back(); + index_deltas = &index_delta_storage.back(); + LoadVerticesFromDiskLabelPropertyIndex({}, label, property, *index_deltas, transaction_.vertices_, + disk_label_property_filter); } + merge_with_main_cache(label_property_index_cache, index_delta_storage); return VerticesIterable(AllVerticesIterable(indexed_vertices->access(), storage_, &transaction_, view)); } @@ -671,26 +695,37 @@ VerticesIterable DiskStorage::DiskAccessor::Vertices(LabelId label, PropertyId p *indexed_vertices, label_property_filter); }; - auto &label_property_val_index_cache = transaction_.label_property_val_index_cache_; - auto &label_property_val_index_cache_ci = transaction_.label_property_val_index_cache_ci_; + auto &cache = transaction_.label_property_val_index_cache_; + auto &cache_ci = transaction_.label_property_val_index_cache_ci_; auto &index_delta_storage = transaction_.index_deltas_storage_; - if (transaction_.command_id > label_property_val_index_cache_ci) { - label_property_val_index_cache_ci = transaction_.command_id; + SyncDeletedVertices(cache, cache_key, index_delta_storage, view, merge_with_main_cache); - auto gids = merge_with_main_cache(label_property_val_index_cache, index_delta_storage); - LoadVerticesFromDiskLabelPropertyIndexWithPointValueLookup(gids, label, property, value, *index_deltas, - *indexed_vertices); + if (transaction_.command_id > cache_ci) { + cache_ci = transaction_.command_id; } else { - if (label_property_val_index_cache.contains(cache_key) && view == View::OLD) { - merge_with_main_cache(label_property_val_index_cache, index_delta_storage); - } else { - auto gids = merge_with_main_cache(label_property_val_index_cache, index_delta_storage); - LoadVerticesFromDiskLabelPropertyIndexWithPointValueLookup(gids, label, property, value, *index_deltas, - *indexed_vertices); + if (cache.contains(cache_key)) { + if (view == View::OLD) { + // TODO + // we do not need this merge if we can make sure that + // the removing and re-adding the same label to a given + // vertex within one transaction is not permitted. + merge_with_main_cache(cache, index_delta_storage); + return VerticesIterable(AllVerticesIterable(cache[cache_key].access(), storage_, &transaction_, view)); + } + cache[cache_key] = utils::SkipList(); + merge_with_main_cache(cache, index_delta_storage); + return VerticesIterable(AllVerticesIterable(cache[cache_key].access(), storage_, &transaction_, view)); } + + cache[cache_key] = utils::SkipList(); + index_delta_storage.emplace_back(); + index_deltas = &index_delta_storage.back(); + LoadVerticesFromDiskLabelPropertyIndexWithPointValueLookup({}, label, property, value, *index_deltas, + transaction_.vertices_); } + merge_with_main_cache(cache, index_delta_storage); return VerticesIterable(AllVerticesIterable(indexed_vertices->access(), storage_, &transaction_, view)); } @@ -720,26 +755,37 @@ VerticesIterable DiskStorage::DiskAccessor::Vertices(LabelId label, PropertyId p label, property, view, lower_bound, upper_bound, *index_deltas, *indexed_vertices); }; - auto &label_property_range_index_cache = transaction_.label_property_range_index_cache_; - auto &label_property_range_index_cache_ci = transaction_.label_property_range_index_cache_ci_; + auto &cache = transaction_.label_property_range_index_cache_; + auto &cache_ci = transaction_.label_property_range_index_cache_ci_; auto &index_delta_storage = transaction_.index_deltas_storage_; - if (transaction_.command_id > label_property_range_index_cache_ci) { - label_property_range_index_cache_ci = transaction_.command_id; + SyncDeletedVertices(cache, cache_key, index_delta_storage, view, merge_with_main_cache); - auto gids = merge_with_main_cache(label_property_range_index_cache, index_delta_storage); - LoadVerticesFromDiskLabelPropertyIndexForIntervalSearch(gids, label, property, lower_bound, upper_bound, - *index_deltas, *indexed_vertices); + if (transaction_.command_id > cache_ci) { + cache_ci = transaction_.command_id; } else { - if (label_property_range_index_cache.contains(cache_key) && view == View::OLD) { - merge_with_main_cache(label_property_range_index_cache, index_delta_storage); - } else { - auto gids = merge_with_main_cache(label_property_range_index_cache, index_delta_storage); - LoadVerticesFromDiskLabelPropertyIndexForIntervalSearch(gids, label, property, lower_bound, upper_bound, - *index_deltas, *indexed_vertices); + if (cache.contains(cache_key)) { + if (view == View::OLD) { + // TODO + // we do not need this merge if we can make sure that + // the removing and re-adding the same label to a given + // vertex within one transaction is not permitted. + merge_with_main_cache(cache, index_delta_storage); + return VerticesIterable(AllVerticesIterable(cache[cache_key].access(), storage_, &transaction_, view)); + } + cache[cache_key] = utils::SkipList(); + merge_with_main_cache(cache, index_delta_storage); + return VerticesIterable(AllVerticesIterable(cache[cache_key].access(), storage_, &transaction_, view)); } + + cache[cache_key] = utils::SkipList(); + index_delta_storage.emplace_back(); + index_deltas = &index_delta_storage.back(); + LoadVerticesFromDiskLabelPropertyIndexForIntervalSearch({}, label, property, lower_bound, upper_bound, + *index_deltas, transaction_.vertices_); } + merge_with_main_cache(cache, index_delta_storage); return VerticesIterable(AllVerticesIterable(indexed_vertices->access(), storage_, &transaction_, view)); } diff --git a/src/storage/v2/disk/storage.hpp b/src/storage/v2/disk/storage.hpp index cbb85d062..01e8605a4 100644 --- a/src/storage/v2/disk/storage.hpp +++ b/src/storage/v2/disk/storage.hpp @@ -94,6 +94,17 @@ class DiskStorage final : public Storage { const std::optional> &upper_bound, std::list &index_deltas, utils::SkipList &indexed_vertices); + template + void SyncDeletedVertices(TIndex &index, TIndexCacheKey &cache_key, + std::vector> &index_delta_storage, View view, TMergeFunc &merge_func) { + if (!transaction_.vertices_to_delete_.empty()) { + index[cache_key] = utils::SkipList(); + if (view == View::OLD) { + merge_func(index, index_delta_storage); + } + } + } + public: DiskAccessor(const DiskAccessor &) = delete; DiskAccessor &operator=(const DiskAccessor &) = delete;