diff --git a/src/storage/v3/splitter.cpp b/src/storage/v3/splitter.cpp index c0f6fac09..e7de81f79 100644 --- a/src/storage/v3/splitter.cpp +++ b/src/storage/v3/splitter.cpp @@ -238,16 +238,15 @@ void Splitter::AdjustClonedTransaction(Transaction &cloned_transaction, const Tr const auto *delta = &*delta_it; auto *cloned_delta = &*cloned_delta_it; Delta *cloned_delta_prev_ptr = cloned_delta; + // The head of delta chains contain either vertex/edge as prev ptr so we adjust + // it just at the beginning of delta chain + AdjustDeltaPrevPtr(*delta, *cloned_delta_prev_ptr, cloned_transactions, cloned_edges); + while (delta->next != nullptr) { AdjustEdgeRef(*cloned_delta, cloned_edges); - // Align next ptr - AdjustDeltaNext(*delta, *cloned_delta, cloned_transactions); - - // Align prev ptr - if (cloned_delta_prev_ptr != nullptr) { - AdjustDeltaPrevPtr(*delta, *cloned_delta_prev_ptr, cloned_transactions, cloned_vertices, cloned_edges); - } + // Align next ptr and prev ptr + AdjustDeltaNextAndPrev(*delta, *cloned_delta, cloned_transactions); // TODO Next delta might not belong to the cloned transaction and thats // why we skip this delta of the delta chain @@ -261,7 +260,7 @@ void Splitter::AdjustClonedTransaction(Transaction &cloned_transaction, const Tr } // Align prev ptr if (cloned_delta_prev_ptr != nullptr) { - AdjustDeltaPrevPtr(*delta, *cloned_delta_prev_ptr, cloned_transactions, cloned_vertices, cloned_edges); + AdjustDeltaPrevPtr(*delta, *cloned_delta_prev_ptr, cloned_transactions, cloned_edges); } ++delta_it; @@ -299,8 +298,8 @@ void Splitter::AdjustEdgeRef(Delta &cloned_delta, EdgeContainer &cloned_edges) c } } -void Splitter::AdjustDeltaNext(const Delta &original, Delta &cloned, - std::map<uint64_t, std::unique_ptr<Transaction>> &cloned_transactions) { +void Splitter::AdjustDeltaNextAndPrev(const Delta &original, Delta &cloned, + std::map<uint64_t, std::unique_ptr<Transaction>> &cloned_transactions) { // Get cloned_delta->next transaction, using delta->next original transaction // cloned_transactions key is start_timestamp auto cloned_transaction_it = @@ -319,15 +318,16 @@ void Splitter::AdjustDeltaNext(const Delta &original, Delta &cloned, cloned_transaction_it->second->deltas, [&original](const auto &elem) { return elem.id == original.next->id; }); MG_ASSERT(found_cloned_delta_it != cloned_transaction_it->second->deltas.end(), "Delta with given uuid must exist!"); cloned.next = &*found_cloned_delta_it; + found_cloned_delta_it->prev.Set(&cloned); } void Splitter::AdjustDeltaPrevPtr(const Delta &original, Delta &cloned, std::map<uint64_t, std::unique_ptr<Transaction>> &cloned_transactions, - VertexContainer & /*cloned_vertices*/, EdgeContainer &cloned_edges) { + EdgeContainer &cloned_edges) { auto ptr = original.prev.Get(); switch (ptr.type) { case PreviousPtr::Type::NULLPTR: { - // noop + MG_ASSERT(false, "PreviousPtr cannot be a nullptr!"); break; } case PreviousPtr::Type::DELTA: { diff --git a/src/storage/v3/splitter.hpp b/src/storage/v3/splitter.hpp index 71c8aa901..be27291e1 100644 --- a/src/storage/v3/splitter.hpp +++ b/src/storage/v3/splitter.hpp @@ -87,12 +87,12 @@ class Splitter final { void AdjustEdgeRef(Delta &cloned_delta, EdgeContainer &cloned_edges) const; - static void AdjustDeltaNext(const Delta &original, Delta &cloned, - std::map<uint64_t, std::unique_ptr<Transaction>> &cloned_transactions); + static void AdjustDeltaNextAndPrev(const Delta &original, Delta &cloned, + std::map<uint64_t, std::unique_ptr<Transaction>> &cloned_transactions); static void AdjustDeltaPrevPtr(const Delta &original, Delta &cloned, std::map<uint64_t, std::unique_ptr<Transaction>> &cloned_transactions, - VertexContainer &cloned_vertices, EdgeContainer &cloned_edges); + EdgeContainer &cloned_edges); const LabelId primary_label_; VertexContainer &vertices_;