CEPH_RBD_API int rbd_group_create(rados_ioctx_t p, const char *name);
CEPH_RBD_API int rbd_group_remove(rados_ioctx_t p, const char *name);
CEPH_RBD_API int rbd_group_list(rados_ioctx_t p, char *names, size_t *size);
+CEPH_RBD_API int rbd_group_rename(rados_ioctx_t p, const char *src_name,
+ const char *dest_name);
CEPH_RBD_API int rbd_group_info_cleanup(rbd_group_info_t *group_info,
size_t group_info_size);
int group_create(IoCtx& io_ctx, const char *group_name);
int group_remove(IoCtx& io_ctx, const char *group_name);
int group_list(IoCtx& io_ctx, std::vector<std::string> *names);
+ int group_rename(IoCtx& io_ctx, const char *src_group_name,
+ const char *dest_group_name);
int group_image_add(IoCtx& io_ctx, const char *group_name,
IoCtx& image_io_ctx, const char *image_name);
return 0;
}
+template <typename I>
+int Group<I>::rename(librados::IoCtx& io_ctx, const char *src_name,
+ const char *dest_name)
+{
+ CephContext *cct((CephContext *)io_ctx.cct());
+ ldout(cct, 20) << "group_rename " << &io_ctx << " " << src_name
+ << " -> " << dest_name << dendl;
+
+ std::string group_id;
+ int r = cls_client::dir_get_id(&io_ctx, RBD_GROUP_DIRECTORY,
+ std::string(src_name), &group_id);
+ if (r < 0) {
+ if (r != -ENOENT)
+ lderr(cct) << "error getting id of group" << dendl;
+ return r;
+ }
+
+ r = cls_client::group_dir_rename(&io_ctx, RBD_GROUP_DIRECTORY,
+ src_name, dest_name, group_id);
+ if (r < 0 && r != -ENOENT) {
+ lderr(cct) << "error renaming group from directory" << dendl;
+ return r;
+ }
+
+ return 0;
+}
+
+
template <typename I>
int Group<I>::image_get_group(I *ictx, group_info_t *group_info)
{
static int create(librados::IoCtx& io_ctx, const char *group_name);
static int remove(librados::IoCtx& io_ctx, const char *group_name);
static int list(librados::IoCtx& io_ctx, std::vector<std::string> *names);
+ static int rename(librados::IoCtx& io_ctx, const char *src_group_name,
+ const char *dest_group_name);
static int image_add(librados::IoCtx& group_ioctx, const char *group_name,
librados::IoCtx& image_ioctx, const char *image_name);
return r;
}
+ int RBD::group_rename(IoCtx& io_ctx, const char *src_name,
+ const char *dest_name)
+ {
+ TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
+ tracepoint(librbd, group_rename_enter, io_ctx.get_pool_name().c_str(),
+ io_ctx.get_id(), src_name, dest_name);
+ int r = librbd::api::Group<>::rename(io_ctx, src_name, dest_name);
+ tracepoint(librbd, group_rename_exit, r);
+ return r;
+ }
+
int RBD::group_image_add(IoCtx& group_ioctx, const char *group_name,
IoCtx& image_ioctx, const char *image_name)
{
return (int)expected_size;
}
+extern "C" int rbd_group_rename(rados_ioctx_t p, const char *src_name,
+ const char *dest_name)
+{
+ librados::IoCtx io_ctx;
+ librados::IoCtx::from_rados_ioctx_t(p, io_ctx);
+ TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
+ tracepoint(librbd, group_rename_enter, io_ctx.get_pool_name().c_str(),
+ io_ctx.get_id(), src_name, dest_name);
+ int r = librbd::api::Group<>::rename(io_ctx, src_name, dest_name);
+ tracepoint(librbd, group_rename_exit, r);
+ return r;
+}
+
extern "C" int rbd_group_image_add(rados_ioctx_t group_p,
const char *group_name,
rados_ioctx_t image_p,
ASSERT_EQ(1U, groups.size());
ASSERT_EQ("mygroup", groups[0]);
- ASSERT_EQ(0, rbd.group_remove(ioctx, "mygroup"));
+ groups.clear();
+ ASSERT_EQ(0, rbd.group_rename(ioctx, "mygroup", "newgroup"));
+ ASSERT_EQ(0, rbd.group_list(ioctx, &groups));
+ ASSERT_EQ(1U, groups.size());
+ ASSERT_EQ("newgroup", groups[0]);
+
+ ASSERT_EQ(0, rbd.group_remove(ioctx, "newgroup"));
groups.clear();
ASSERT_EQ(0, rbd.group_list(ioctx, &groups));
)
)
+TRACEPOINT_EVENT(librbd, group_rename_enter,
+ TP_ARGS(
+ const char*, pool_name,
+ int64_t, id,
+ const char*, groupname,
+ const char*, destgroupname),
+ TP_FIELDS(
+ ctf_string(pool_name, pool_name)
+ ctf_integer(int64_t, id, id)
+ ctf_string(groupname, groupname)
+ ctf_string(destgroupname, destgroupname)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, group_rename_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
TRACEPOINT_EVENT(librbd, group_list_enter,
TP_ARGS(
const char*, pool_name,