<< dest_image_name << ", opts=" << opts << dendl;
auto src_image_ctx = I::create("", "", nullptr, dest_io_ctx, true);
- BOOST_SCOPE_EXIT_TPL(src_image_ctx) {
- src_image_ctx->state->close();
- } BOOST_SCOPE_EXIT_END;
+ auto asio_engine = src_image_ctx->asio_engine;
migration::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);
if (r < 0) {
lderr(cct) << "failed to parse source spec: " << cpp_strerror(r)
<< dendl;
+ src_image_ctx->state->close();
return r;
}
if (r < 0) {
lderr(cct) << "failed to build migration format handler: "
<< cpp_strerror(r) << dendl;
+ src_image_ctx->state->close();
return r;
}
return r;
}
+ BOOST_SCOPE_EXIT_TPL(src_image_ctx) {
+ src_image_ctx->state->close();
+ } BOOST_SCOPE_EXIT_END;
+
uint64_t image_format = 2;
if (opts.get(RBD_IMAGE_OPTION_FORMAT, &image_format) != 0) {
opts.set(RBD_IMAGE_OPTION_FORMAT, image_format);
#include "common/dout.h"
#include "common/errno.h"
#include "librbd/ImageCtx.h"
+#include "librbd/ImageState.h"
#include "librbd/Utils.h"
#include "librbd/io/AioCompletion.h"
#include "librbd/io/ReadResult.h"
auto cct = raw_format->m_image_ctx->cct;
ldout(cct, 10) << "r=" << r << dendl;
- on_finish->complete(r);
+ if (r < 0) {
+ raw_format->m_image_ctx->state->close(new LambdaContext(
+ [r, on_finish=on_finish](int _) { on_finish->complete(r); }));
+ } else {
+ on_finish->complete(0);
+ }
+
delete this;
}
};
if (r < 0) {
lderr(cct) << "failed to build migration stream handler" << cpp_strerror(r)
<< dendl;
- on_finish->complete(r);
+ m_image_ctx->state->close(
+ new LambdaContext([r, on_finish](int _) { on_finish->complete(r); }));
return;
}
})));
}
+ void expect_close(MockTestImageCtx &mock_image_ctx, int r) {
+ EXPECT_CALL(*mock_image_ctx.state, close(_))
+ .WillOnce(Invoke([this, r](Context* ctx) {
+ ctx->complete(r);
+ }));
+ }
+
json_spirit::mObject json_object;
};
ASSERT_EQ(0, ctx2.wait());
}
+TEST_F(TestMockMigrationRawFormat, OpenError) {
+ MockTestImageCtx mock_image_ctx(*m_image_ctx);
+
+ InSequence seq;
+ MockSourceSpecBuilder mock_source_spec_builder;
+
+ auto mock_stream_interface = new MockStreamInterface();
+ expect_build_stream(mock_source_spec_builder, mock_stream_interface, 0);
+
+ expect_stream_open(*mock_stream_interface, -ENOENT);
+
+ expect_close(mock_image_ctx, 0);
+
+ MockRawFormat mock_raw_format(&mock_image_ctx, json_object,
+ &mock_source_spec_builder);
+
+ C_SaferCond ctx;
+ mock_raw_format.open(&ctx);
+ ASSERT_EQ(-ENOENT, ctx.wait());
+}
+
TEST_F(TestMockMigrationRawFormat, GetSnapshots) {
MockTestImageCtx mock_image_ctx(*m_image_ctx);