template <typename I>
void OpenSourceImageRequest<I>::send() {
- open_source();
-}
-
-template <typename I>
-void OpenSourceImageRequest<I>::open_source() {
ldout(m_cct, 10) << dendl;
- // note that all source image ctx properties are placeholders
- *m_src_image_ctx = I::create("", "", CEPH_NOSNAP, m_dst_io_ctx, true);
- auto src_image_ctx = *m_src_image_ctx;
- src_image_ctx->child = m_dst_image_ctx;
-
- // use default layout values (can be overridden by source layers later)
- src_image_ctx->order = 22;
- src_image_ctx->layout = file_layout_t();
- src_image_ctx->layout.stripe_count = 1;
- src_image_ctx->layout.stripe_unit = 1ULL << src_image_ctx->order;
- src_image_ctx->layout.object_size = 1Ull << src_image_ctx->order;
- src_image_ctx->layout.pool_id = -1;
-
bool import_only = true;
auto source_spec = m_migration_info.source_spec;
if (source_spec.empty()) {
<< "source_snap_id=" << m_src_snap_id << ", "
<< "import_only=" << import_only << dendl;
- SourceSpecBuilder<I> source_spec_builder{src_image_ctx};
json_spirit::mObject source_spec_object;
- int r = source_spec_builder.parse_source_spec(source_spec,
- &source_spec_object);
+ int r = SourceSpecBuilder<I>::parse_source_spec(source_spec,
+ &source_spec_object);
if (r < 0) {
lderr(m_cct) << "failed to parse migration source-spec: "
<< cpp_strerror(r) << dendl;
- (*m_src_image_ctx)->state->close();
finish(r);
return;
}
- r = source_spec_builder.build_format(source_spec_object, import_only,
- &m_format);
+ open_source(source_spec_object, import_only);
+}
+
+template <typename I>
+void OpenSourceImageRequest<I>::open_source(
+ const json_spirit::mObject& source_spec_object, bool import_only) {
+ ldout(m_cct, 10) << dendl;
+
+ // note that all source image ctx properties are placeholders
+ *m_src_image_ctx = I::create("", "", CEPH_NOSNAP, m_dst_io_ctx, true);
+ auto src_image_ctx = *m_src_image_ctx;
+ src_image_ctx->child = m_dst_image_ctx;
+
+ // use default layout values (can be overridden by source layers later)
+ src_image_ctx->order = 22;
+ src_image_ctx->layout = file_layout_t();
+ src_image_ctx->layout.stripe_count = 1;
+ src_image_ctx->layout.stripe_unit = 1ULL << src_image_ctx->order;
+ src_image_ctx->layout.object_size = 1Ull << src_image_ctx->order;
+ src_image_ctx->layout.pool_id = -1;
+
+ SourceSpecBuilder<I> source_spec_builder{src_image_ctx};
+ int r = source_spec_builder.build_format(source_spec_object, import_only,
+ &m_format);
if (r < 0) {
lderr(m_cct) << "failed to build migration format handler: "
<< cpp_strerror(r) << dendl;
template <typename I>
int SourceSpecBuilder<I>::parse_source_spec(
const std::string& source_spec,
- json_spirit::mObject* source_spec_object) const {
- auto cct = m_image_ctx->cct;
- ldout(cct, 10) << dendl;
-
+ json_spirit::mObject* source_spec_object) {
json_spirit::mValue json_root;
- if(json_spirit::read(source_spec, json_root)) {
+ if (json_spirit::read(source_spec, json_root)) {
try {
*source_spec_object = json_root.get_obj();
return 0;
}
}
- lderr(cct) << "invalid source-spec JSON" << dendl;
return -EBADMSG;
}
#include "include/int_types.h"
#include <json_spirit/json_spirit.h>
#include <memory>
-#include <optional>
#include <string>
struct Context;
template <typename ImageCtxT>
class SourceSpecBuilder {
public:
+ static int parse_source_spec(const std::string& source_spec,
+ json_spirit::mObject* source_spec_object);
+
SourceSpecBuilder(ImageCtxT* image_ctx) : m_image_ctx(image_ctx) {
}
- int parse_source_spec(const std::string& source_spec,
- json_spirit::mObject* source_spec_object) const;
-
int build_format(const json_spirit::mObject& format_object, bool import_only,
std::unique_ptr<FormatInterface>* format) const;
private:
ImageCtxT* m_image_ctx;
-
};
} // namespace migration