From ac585eb42dab5d1a5df243e5ff91d7cf4cbaf2e6 Mon Sep 17 00:00:00 2001 From: Ivan Baidakou Date: Wed, 14 Aug 2024 09:59:45 +0300 Subject: [PATCH] core, sequencer WIP --- src/model/diff/modify/clone_file.cpp | 15 ++++++++------- src/model/diff/modify/clone_file.h | 6 ++++-- src/net/controller_actor.cpp | 2 +- tests/076-scan_actor.cpp | 22 +++++++--------------- tests/diff-builder.cpp | 2 +- 5 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/model/diff/modify/clone_file.cpp b/src/model/diff/modify/clone_file.cpp index 150c5fd5..59c3d6bd 100644 --- a/src/model/diff/modify/clone_file.cpp +++ b/src/model/diff/modify/clone_file.cpp @@ -7,7 +7,7 @@ using namespace syncspirit::model::diff::modify; -clone_file_t::clone_file_t(const model::file_info_t &source) noexcept +clone_file_t::clone_file_t(const model::file_info_t &source, sequencer_t &sequencer) noexcept : file{source.as_proto(false)}, has_blocks{!source.get_blocks().empty()} { auto peer_folder_info = source.get_folder_info(); @@ -41,6 +41,11 @@ clone_file_t::clone_file_t(const model::file_info_t &source) noexcept } } } + if (create_new_file) { + uuid = sequencer.next_uuid(); + } else { + assign(uuid, source.get_uuid()); + } } auto clone_file_t::apply_impl(cluster_t &cluster) const noexcept -> outcome::result { @@ -51,13 +56,9 @@ auto clone_file_t::apply_impl(cluster_t &cluster) const noexcept -> outcome::res auto &files = folder_my->get_file_infos(); auto prev_file = file_info_ptr_t{}; auto new_file = file_info_ptr_t{}; - uuid_t file_uuid; - if (create_new_file) { - file_uuid = cluster.next_uuid(); - } else { + if (!create_new_file) { prev_file = files.by_name(file.name()); - model::assign(file_uuid, prev_file->get_uuid()); } auto peer_file = folder_peer->get_file_infos().by_name(file.name()); @@ -72,7 +73,7 @@ auto clone_file_t::apply_impl(cluster_t &cluster) const noexcept -> outcome::res } else { file_info.set_sequence(0); } - return file_info_t::create(file_uuid, file_info, folder_my); + return file_info_t::create(uuid, file_info, folder_my); }; if (!has_blocks) { diff --git a/src/model/diff/modify/clone_file.h b/src/model/diff/modify/clone_file.h index 4cd5d41f..50d05eb6 100644 --- a/src/model/diff/modify/clone_file.h +++ b/src/model/diff/modify/clone_file.h @@ -1,10 +1,11 @@ // SPDX-License-Identifier: GPL-3.0-or-later -// SPDX-FileCopyrightText: 2019-2023 Ivan Baidakou +// SPDX-FileCopyrightText: 2019-2024 Ivan Baidakou #pragma once #include "../cluster_diff.h" #include "model/file_info.h" +#include "model/misc/sequencer.h" #include "bep.pb.h" namespace syncspirit::model::diff::modify { @@ -13,7 +14,7 @@ struct SYNCSPIRIT_API clone_file_t final : cluster_diff_t { using blocks_t = std::vector; using new_blocks_t = std::vector; - clone_file_t(const model::file_info_t &source) noexcept; + clone_file_t(const model::file_info_t &source, sequencer_t &sequencer) noexcept; outcome::result apply_impl(cluster_t &) const noexcept override; outcome::result visit(cluster_visitor_t &, void *) const noexcept override; @@ -21,6 +22,7 @@ struct SYNCSPIRIT_API clone_file_t final : cluster_diff_t { std::string folder_id; std::string device_id; std::string peer_id; + uuid_t uuid; proto::FileInfo file; bool has_blocks; bool create_new_file; diff --git a/src/net/controller_actor.cpp b/src/net/controller_actor.cpp index dc1c08b5..720b0c90 100644 --- a/src/net/controller_actor.cpp +++ b/src/net/controller_actor.cpp @@ -263,7 +263,7 @@ void controller_actor_t::on_pull_ready(message::pull_signal_t &) noexcept { file->locally_lock(); locally_locked_files.emplace(file); auto diff = model::diff::cluster_diff_ptr_t{}; - diff = new model::diff::modify::clone_file_t(*file); + diff = new model::diff::modify::clone_file_t(*file, *sequencer); send(coordinator, std::move(diff), this); } else { pull_ready(); diff --git a/tests/076-scan_actor.cpp b/tests/076-scan_actor.cpp index 728c81d8..4146b4e2 100644 --- a/tests/076-scan_actor.cpp +++ b/tests/076-scan_actor.cpp @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -// SPDX-FileCopyrightText: 2019-2023 Ivan Baidakou +// SPDX-FileCopyrightText: 2019-2024 Ivan Baidakou #include "test-utils.h" #include "access.h" @@ -7,8 +7,6 @@ #include "diff-builder.h" #include "model/cluster.h" -#include "model/diff/cluster_diff.h" -#include "model/diff/modify/clone_file.h" #include "hasher/hasher_proxy_actor.h" #include "hasher/hasher_actor.h" #include "fs/scan_actor.h" @@ -129,6 +127,7 @@ void test_meta_changes() { struct F : fixture_t { void main() noexcept override { sys::error_code ec; + auto builder = diff_builder_t(*cluster); SECTION("trivial") { SECTION("no files") { @@ -181,14 +180,11 @@ void test_meta_changes() { bi.set_offset(0); auto b = block_info_t::create(bi).value(); - SECTION("a file does not physically exist") { auto file_peer = file_info_t::create(cluster->next_uuid(), pr_fi, folder_info_peer).value(); file_peer->assign_block(b, 0); folder_info_peer->add(file_peer, false); - - auto diff = diff::cluster_diff_ptr_t(new diff::modify::clone_file_t(*file_peer)); - REQUIRE(diff->apply(*cluster)); + REQUIRE(builder.clone_file(*file_peer).apply()); auto file = files->by_name(pr_fi.name()); sup->do_process(); @@ -196,13 +192,13 @@ void test_meta_changes() { CHECK(!file->is_locally_available()); REQUIRE(scan_completions == 1); } + SECTION("complete file exists") { auto file_peer = file_info_t::create(cluster->next_uuid(), pr_fi, folder_info_peer).value(); file_peer->assign_block(b, 0); folder_info_peer->add(file_peer, false); - auto diff = diff::cluster_diff_ptr_t(new diff::modify::clone_file_t(*file_peer)); - REQUIRE(diff->apply(*cluster)); + REQUIRE(builder.clone_file(*file_peer).apply()); auto file = files->by_name(pr_fi.name()); file->set_source(nullptr); auto path = file->get_path(); @@ -214,7 +210,6 @@ void test_meta_changes() { CHECK(files->size() == 1); CHECK(file->is_locally_available()); } - SECTION("meta is changed (modification)") { write_file(path, "12345"); sup->do_process(); @@ -256,7 +251,6 @@ void test_meta_changes() { } REQUIRE(scan_completions == 1); } - SECTION("incomplete file exists") { pr_fi.set_size(10ul); pr_fi.set_block_size(5ul); @@ -273,8 +267,7 @@ void test_meta_changes() { file_peer->assign_block(b2, 1); folder_info_peer->add(file_peer, false); - auto diff = diff::cluster_diff_ptr_t(new diff::modify::clone_file_t(*file_peer)); - REQUIRE(diff->apply(*cluster)); + REQUIRE(builder.clone_file(*file_peer).apply()); auto file = files->by_name(pr_fi.name()); auto path = file->get_path().string() + ".syncspirit-tmp"; file->lock(); // should be locked on db, as there is a source @@ -374,8 +367,7 @@ void test_meta_changes() { file_peer->assign_block(b3, 2); folder_info_peer->add(file_peer, false); - auto diff = diff::cluster_diff_ptr_t(new diff::modify::clone_file_t(*file_peer)); - REQUIRE(diff->apply(*cluster)); + REQUIRE(builder.clone_file(*file_peer).apply()); auto file = files->by_name(pr_fi.name()); auto path_my = file->get_path().string(); auto path_peer = file->get_path().string() + ".syncspirit-tmp"; diff --git a/tests/diff-builder.cpp b/tests/diff-builder.cpp index c8c03356..eb57982b 100644 --- a/tests/diff-builder.cpp +++ b/tests/diff-builder.cpp @@ -175,7 +175,7 @@ diff_builder_t &diff_builder_t::unshare_folder(model::folder_info_t &fi) noexcep } diff_builder_t &diff_builder_t::clone_file(const model::file_info_t &source) noexcept { - return assign(new diff::modify::clone_file_t(source)); + return assign(new diff::modify::clone_file_t(source, *sequencer)); } diff_builder_t &diff_builder_t::finish_file(const model::file_info_t &source) noexcept {