sstables: Introduce storage::clone()
And call it from sstable::clone() instead of storage::snapshot(). The snapshot arguements are: - target directory is storage::prefix(), that's _dir itself - new generation is always provided, no need for optional - leave_unsealed bool flag With that, the implementation of filesystem_storage::clone() is as simple as call create_links_common() forwarding args and _dir to it. The unification of leave_unsealed branches will come a bit later making this code even shorter. Signed-off-by: Pavel Emelyanov <xemul@scylladb.com>
This commit is contained in:
@@ -902,7 +902,7 @@ future<std::unordered_map<component_type, file>> sstable::readable_file_for_all_
|
||||
}
|
||||
|
||||
future<entry_descriptor> sstable::clone(generation_type new_generation, bool leave_unsealed) const {
|
||||
co_await _storage->snapshot(*this, _storage->prefix(), storage::absolute_path::yes, new_generation, storage::leave_unsealed(leave_unsealed));
|
||||
co_await _storage->clone(*this, new_generation, leave_unsealed);
|
||||
co_return entry_descriptor(new_generation, _version, _format, component_type::TOC, _state);
|
||||
}
|
||||
|
||||
|
||||
@@ -93,6 +93,7 @@ public:
|
||||
|
||||
virtual future<> seal(const sstable& sst) override;
|
||||
virtual future<> snapshot(const sstable& sst, sstring dir, absolute_path abs, std::optional<generation_type> gen, storage::leave_unsealed) const override;
|
||||
virtual future<> clone(const sstable& sst, generation_type gen, bool leave_unsealed) const override;
|
||||
virtual future<> change_state(const sstable& sst, sstable_state state, generation_type generation, delayed_commit_changes* delay) override;
|
||||
// runs in async context
|
||||
virtual void open(sstable& sst) override;
|
||||
@@ -438,6 +439,13 @@ future<> filesystem_storage::snapshot(const sstable& sst, sstring dir, absolute_
|
||||
co_await create_links_common(sst, snapshot_dir, std::move(gen));
|
||||
}
|
||||
}
|
||||
future<> filesystem_storage::clone(const sstable& sst, generation_type gen, bool leave_unsealed) const {
|
||||
if (leave_unsealed) {
|
||||
co_await create_links_common(sst, _dir.path(), std::move(gen), leave_unsealed_tag{});
|
||||
} else {
|
||||
co_await create_links_common(sst, _dir.path(), std::move(gen));
|
||||
}
|
||||
}
|
||||
|
||||
future<> filesystem_storage::move(const sstable& sst, sstring new_dir, generation_type new_generation, delayed_commit_changes* delay_commit) {
|
||||
co_await touch_directory(new_dir);
|
||||
@@ -630,6 +638,7 @@ public:
|
||||
|
||||
future<> seal(const sstable& sst) override;
|
||||
future<> snapshot(const sstable& sst, sstring dir, absolute_path abs, std::optional<generation_type>, storage::leave_unsealed) const override;
|
||||
future<> clone(const sstable& sst, generation_type gen, bool leave_unsealed) const override;
|
||||
future<> change_state(const sstable& sst, sstable_state state, generation_type generation, delayed_commit_changes* delay) override;
|
||||
// runs in async context
|
||||
void open(sstable& sst) override;
|
||||
@@ -851,6 +860,11 @@ future<> object_storage_base::snapshot(const sstable& sst, sstring dir, absolute
|
||||
co_return;
|
||||
}
|
||||
|
||||
future<> object_storage_base::clone(const sstable& sst, generation_type gen, bool leave_unsealed) const {
|
||||
on_internal_error(sstlog, "Cloning S3 objects not implemented");
|
||||
co_return;
|
||||
}
|
||||
|
||||
std::unique_ptr<sstables::storage> make_storage(sstables_manager& manager, const data_dictionary::storage_options& s_opts, sstable_state state) {
|
||||
return std::visit(overloaded_functor {
|
||||
[state] (const data_dictionary::storage_options::local& loc) mutable -> std::unique_ptr<sstables::storage> {
|
||||
|
||||
@@ -101,6 +101,7 @@ public:
|
||||
|
||||
virtual future<> seal(const sstable& sst) = 0;
|
||||
virtual future<> snapshot(const sstable& sst, sstring dir, absolute_path abs, std::optional<generation_type> gen = {}, leave_unsealed lu = leave_unsealed::no) const = 0;
|
||||
virtual future<> clone(const sstable& sst, generation_type gen, bool leave_unsealed) const = 0;
|
||||
virtual future<> change_state(const sstable& sst, sstable_state to, generation_type generation, delayed_commit_changes* delay) = 0;
|
||||
// runs in async context
|
||||
virtual void open(sstable& sst) = 0;
|
||||
|
||||
Reference in New Issue
Block a user