diff --git a/configure.py b/configure.py index 203a9439a5..0dfe47e93e 100755 --- a/configure.py +++ b/configure.py @@ -1464,6 +1464,7 @@ idls = ['idl/gossip_digest.idl.hh', 'idl/frozen_mutation.idl.hh', 'idl/reconcilable_result.idl.hh', 'idl/streaming.idl.hh', + 'idl/sstables_loader.idl.hh', 'idl/paging_state.idl.hh', 'idl/frozen_schema.idl.hh', 'idl/repair.idl.hh', diff --git a/idl/CMakeLists.txt b/idl/CMakeLists.txt index 518ec32835..b64fc00f3e 100644 --- a/idl/CMakeLists.txt +++ b/idl/CMakeLists.txt @@ -53,6 +53,7 @@ set(idl_headers group0.idl.hh hinted_handoff.idl.hh sstables.idl.hh + sstables_loader.idl.hh storage_proxy.idl.hh storage_service.idl.hh strong_consistency/state_machine.idl.hh diff --git a/idl/sstables_loader.idl.hh b/idl/sstables_loader.idl.hh new file mode 100644 index 0000000000..83cd353487 --- /dev/null +++ b/idl/sstables_loader.idl.hh @@ -0,0 +1,12 @@ +/* + * Copyright 2026-present ScyllaDB + */ + +/* + * SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.1 + */ + +class restore_result { +}; + +verb [[]] restore_tablet (raft::server_id dst_id, locator::global_tablet_id gid) -> restore_result; diff --git a/message/messaging_service.cc b/message/messaging_service.cc index 20ccb921a9..947c8d5df1 100644 --- a/message/messaging_service.cc +++ b/message/messaging_service.cc @@ -24,6 +24,7 @@ #include "service/storage_service.hh" #include "service/qos/service_level_controller.hh" #include "streaming/prepare_message.hh" +#include "sstables_loader.hh" #include "gms/gossip_digest_syn.hh" #include "gms/gossip_digest_ack.hh" #include "gms/gossip_digest_ack2.hh" @@ -139,6 +140,7 @@ #include "idl/tasks.dist.impl.hh" #include "idl/forward_cql.dist.impl.hh" #include "gms/feature_service.hh" +#include "idl/sstables_loader.dist.impl.hh" namespace netw { @@ -734,6 +736,7 @@ static constexpr unsigned do_get_rpc_client_idx(messaging_verb verb) { case messaging_verb::TABLE_LOAD_STATS: case messaging_verb::WORK_ON_VIEW_BUILDING_TASKS: case messaging_verb::SNAPSHOT_WITH_TABLETS: + case messaging_verb::RESTORE_TABLET: return 1; case messaging_verb::CLIENT_ID: case messaging_verb::MUTATION: diff --git a/message/messaging_service.hh b/message/messaging_service.hh index 658d7b74e3..2c19947d03 100644 --- a/message/messaging_service.hh +++ b/message/messaging_service.hh @@ -214,7 +214,8 @@ enum class messaging_verb : int32_t { RAFT_READ_BARRIER = 85, FORWARD_CQL_EXECUTE = 86, FORWARD_CQL_PREPARE = 87, - LAST = 88, + RESTORE_TABLET = 88, + LAST = 89, }; } // namespace netw diff --git a/sstables_loader.cc b/sstables_loader.cc index f0ec901acf..8e4d727724 100644 --- a/sstables_loader.cc +++ b/sstables_loader.cc @@ -33,6 +33,7 @@ #include "service/storage_service.hh" #include "sstables_loader_helpers.hh" #include "db/system_distributed_keyspace.hh" +#include "idl/sstables_loader.dist.hh" #include "sstables/object_storage_client.hh" #include "utils/rjson.hh" @@ -868,9 +869,20 @@ sstables_loader::sstables_loader(sharded& db, , _sched_group(std::move(sg)) { tm.register_module("sstables_loader", _task_manager_module); + ser::sstables_loader_rpc_verbs::register_restore_tablet(&_messaging, [this] (raft::server_id dst_id, locator::global_tablet_id gid) -> future { + return _ss.local().handle_raft_rpc(dst_id, [&sl = container(), gid] (auto& ss) { + return ss.do_tablet_operation(gid, "Restore", [&sl, gid] (locator::tablet_metadata_guard& guard) -> future { + co_await sl.local().download_tablet_sstables(gid, guard); + co_return service::tablet_operation_empty_result{}; + }).then([] (auto res) { + return make_ready_future(); + }); + }); + }); } future<> sstables_loader::stop() { + co_await ser::sstables_loader_rpc_verbs::unregister(&_messaging), co_await _task_manager_module->stop(); } diff --git a/sstables_loader.hh b/sstables_loader.hh index 6d5dee382e..31cb089528 100644 --- a/sstables_loader.hh +++ b/sstables_loader.hh @@ -25,6 +25,8 @@ class database; } struct minimal_sst_info; +struct restore_result { +}; namespace sstables { class storage_manager; }