rbd migration execute test1
rbd migration commit test1
+ # testing trash
+ rbd migration prepare test1
+ expect_fail rbd trash mv test1
+ ID=`rbd trash ls -a | cut -d ' ' -f 1`
+ expect_fail rbd trash rm $ID
+ expect_fail rbd trash restore $ID
+ rbd migration abort test1
+
for format in 1 2; do
# Abort migration after successful prepare
rbd create -s 128M --image-format ${format} test2
int Migration<I>::v2_relink_src_image() {
ldout(m_cct, 10) << dendl;
- int r = Trash<I>::restore(m_src_io_ctx, m_src_image_ctx->id,
- m_src_image_ctx->name);
+ int r = Trash<I>::restore(m_src_io_ctx, RBD_TRASH_IMAGE_SOURCE_MIGRATION,
+ m_src_image_ctx->id, m_src_image_ctx->name);
if (r < 0) {
lderr(m_cct) << "failed restoring image from trash: " << cpp_strerror(r)
<< dendl;
}
template <typename I>
-int Trash<I>::restore(librados::IoCtx &io_ctx, const std::string &image_id,
+int Trash<I>::restore(librados::IoCtx &io_ctx, rbd_trash_image_source_t source,
+ const std::string &image_id,
const std::string &image_new_name) {
CephContext *cct((CephContext *)io_ctx.cct());
ldout(cct, 20) << "trash_restore " << &io_ctx << " " << image_id << " "
return r;
}
+ if (trash_spec.source != static_cast<cls::rbd::TrashImageSource>(source)) {
+ lderr(cct) << "Current trash source: " << trash_spec.source
+ << " does not match expected: "
+ << static_cast<cls::rbd::TrashImageSource>(source) << dendl;
+ return -EINVAL;
+ }
+
std::string image_name = image_new_name;
if (trash_spec.state != cls::rbd::TRASH_IMAGE_STATE_NORMAL &&
trash_spec.state != cls::rbd::TRASH_IMAGE_STATE_RESTORING) {
std::vector<trash_image_info_t> &entries);
static int remove(librados::IoCtx &io_ctx, const std::string &image_id,
bool force, ProgressContext& prog_ctx);
- static int restore(librados::IoCtx &io_ctx, const std::string &image_id,
+ static int restore(librados::IoCtx &io_ctx, rbd_trash_image_source_t source,
+ const std::string &image_id,
const std::string &image_new_name);
};
TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
tracepoint(librbd, trash_undelete_enter, io_ctx.get_pool_name().c_str(),
io_ctx.get_id(), id, name);
- int r = librbd::api::Trash<>::restore(io_ctx, id, name);
+ int r = librbd::api::Trash<>::restore(io_ctx, RBD_TRASH_IMAGE_SOURCE_USER,
+ id, name);
tracepoint(librbd, trash_undelete_exit, r);
return r;
}
TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
tracepoint(librbd, trash_undelete_enter, io_ctx.get_pool_name().c_str(),
io_ctx.get_id(), id, name);
- int r = librbd::api::Trash<>::restore(io_ctx, id, name);
+ int r = librbd::api::Trash<>::restore(io_ctx, RBD_TRASH_IMAGE_SOURCE_USER,
+ id, name);
tracepoint(librbd, trash_undelete_exit, r);
return r;
}
ASSERT_EQ(status.source_image_id, string());
} else {
ASSERT_NE(status.source_image_id, string());
+ ASSERT_EQ(-EROFS, rbd_trash_remove(ioctx, status.source_image_id, false));
+ ASSERT_EQ(-EINVAL, rbd_trash_restore(ioctx, status.source_image_id, name.c_str()));
}
ASSERT_EQ(status.dest_pool_id, rados_ioctx_get_id(ioctx));
ASSERT_EQ(status.dest_image_name, name);
rbd_migration_status_cleanup(&status);
ASSERT_EQ(-EBUSY, rbd_remove(ioctx, name.c_str()));
+ ASSERT_EQ(-EINVAL, rbd_trash_move(ioctx, name.c_str(), 0));
ASSERT_EQ(0, rbd_migration_execute(ioctx, name.c_str()));
new_name.c_str(), image_options));
ASSERT_EQ(-EBUSY, rbd_remove(ioctx, new_name.c_str()));
+ ASSERT_EQ(-EINVAL, rbd_trash_move(ioctx, new_name.c_str(), 0));
ASSERT_EQ(0, rbd_migration_abort(ioctx, name.c_str()));
ASSERT_EQ(status.source_image_id, "");
} else {
ASSERT_NE(status.source_image_id, "");
+ ASSERT_EQ(-EROFS, rbd.trash_remove(ioctx, status.source_image_id.c_str(), false));
+ ASSERT_EQ(-EINVAL, rbd.trash_restore(ioctx, status.source_image_id.c_str(), name.c_str()));
}
ASSERT_EQ(status.dest_pool_id, ioctx.get_id());
ASSERT_EQ(status.dest_image_name, name);
ASSERT_EQ(status.state, RBD_IMAGE_MIGRATION_STATE_PREPARED);
ASSERT_EQ(-EBUSY, rbd.remove(ioctx, name.c_str()));
+ ASSERT_EQ(-EINVAL, rbd.trash_move(ioctx, name.c_str(), 0));
ASSERT_EQ(0, rbd.migration_execute(ioctx, name.c_str()));
new_name.c_str(), image_options));
ASSERT_EQ(-EBUSY, rbd.remove(ioctx, new_name.c_str()));
+ ASSERT_EQ(-EINVAL, rbd.trash_move(ioctx, new_name.c_str(), 0));
ASSERT_EQ(0, rbd.migration_abort(ioctx, name.c_str()));