return 0;
}
-static int check_duplicate_snap_id(cls_method_context_t hctx,
- std::string snap_key)
-{
- bufferlist bl;
- int r = cls_cxx_map_get_val(hctx, snap_key, &bl);
- if (r == -ENOENT) {
- return 0;
- } else if (r < 0) {
- return r;
- }
- return -EEXIST;
-}
-
}
/**
* Output:
* @return 0 on success, negative error code on failure
*/
-int group_snap_add(cls_method_context_t hctx,
+int group_snap_set(cls_method_context_t hctx,
bufferlist *in, bufferlist *out)
{
- CLS_LOG(20, "group_snap_add");
+ CLS_LOG(20, "group_snap_set");
cls::rbd::GroupSnapshot group_snap;
try {
bufferlist::iterator iter = in->begin();
} catch (const buffer::error &err) {
return -EINVAL;
}
+
if (group_snap.name.empty()) {
CLS_ERR("group snapshot name is empty");
return -EINVAL;
return -EINVAL;
}
- int r = group::check_duplicate_snap_name(hctx, group_snap.name, group_snap.id);
- if (r < 0) {
- return r;
- }
-
- r = group::check_duplicate_snap_id(hctx, group::snap_key(group_snap.id));
+ int r = group::check_duplicate_snap_name(hctx, group_snap.name,
+ group_snap.id);
if (r < 0) {
return r;
}
std::string key = group::snap_key(group_snap.id);
-
- bufferlist obl;
- ::encode(group_snap, obl);
- r = cls_cxx_map_set_val(hctx, key, &obl);
- return r;
-}
-
-/**
- * Update snapshot record.
- *
- * Input:
- * @param GroupSnapshot
- *
- * Output:
- * @return 0 on success, negative error code on failure
- */
-int group_snap_update(cls_method_context_t hctx,
- bufferlist *in, bufferlist *out)
-{
- CLS_LOG(20, "group_snap_update");
- cls::rbd::GroupSnapshot group_snap;
- try {
- bufferlist::iterator iter = in->begin();
- ::decode(group_snap, iter);
- } catch (const buffer::error &err) {
- return -EINVAL;
- }
- if (group_snap.name.empty()) {
- CLS_ERR("group snapshot name is empty");
- return -EINVAL;
- }
-
- int r = group::check_duplicate_snap_name(hctx, group_snap.name, group_snap.id);
- if (r < 0) {
- return r;
- }
-
- if (group_snap.id.empty()) {
- CLS_ERR("group snapshot id is empty");
- return -EINVAL;
+ if (group_snap.state == cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE) {
+ bufferlist snap_bl;
+ r = cls_cxx_map_get_val(hctx, key, &snap_bl);
+ if (r < 0 && r != -ENOENT) {
+ return r;
+ } else if (r >= 0) {
+ return -EEXIST;
+ }
}
- std::string key = group::snap_key(group_snap.id);
-
bufferlist obl;
::encode(group_snap, obl);
r = cls_cxx_map_set_val(hctx, key, &obl);
-
return r;
}
cls_method_handle_t h_image_add_group;
cls_method_handle_t h_image_remove_group;
cls_method_handle_t h_image_get_group;
- cls_method_handle_t h_group_snap_add;
- cls_method_handle_t h_group_snap_update;
+ cls_method_handle_t h_group_snap_set;
cls_method_handle_t h_group_snap_remove;
cls_method_handle_t h_group_snap_get_by_id;
cls_method_handle_t h_group_snap_list;
cls_register_cxx_method(h_class, "image_get_group",
CLS_METHOD_RD,
image_get_group, &h_image_get_group);
- cls_register_cxx_method(h_class, "group_snap_add",
- CLS_METHOD_RD | CLS_METHOD_WR,
- group_snap_add, &h_group_snap_add);
- cls_register_cxx_method(h_class, "group_snap_update",
+ cls_register_cxx_method(h_class, "group_snap_set",
CLS_METHOD_RD | CLS_METHOD_WR,
- group_snap_update, &h_group_snap_update);
+ group_snap_set, &h_group_snap_set);
cls_register_cxx_method(h_class, "group_snap_remove",
CLS_METHOD_RD | CLS_METHOD_WR,
group_snap_remove, &h_group_snap_remove);
ASSERT_EQ(pool_id, spec.pool_id);
}
-TEST_F(TestClsRbd, group_snap_add_empty_name) {
+TEST_F(TestClsRbd, group_snap_set_empty_name) {
librados::IoCtx ioctx;
ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
string snap_id = "snap_id";
cls::rbd::GroupSnapshot snap = {snap_id, "", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(-EINVAL, group_snap_add(&ioctx, group_id, snap));
+ ASSERT_EQ(-EINVAL, group_snap_set(&ioctx, group_id, snap));
}
-TEST_F(TestClsRbd, group_snap_add_empty_id) {
+TEST_F(TestClsRbd, group_snap_set_empty_id) {
librados::IoCtx ioctx;
ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
string snap_id = "snap_id";
cls::rbd::GroupSnapshot snap = {"", "snap_name", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(-EINVAL, group_snap_add(&ioctx, group_id, snap));
+ ASSERT_EQ(-EINVAL, group_snap_set(&ioctx, group_id, snap));
}
-TEST_F(TestClsRbd, group_snap_add_duplicate_id) {
+TEST_F(TestClsRbd, group_snap_set_duplicate_id) {
librados::IoCtx ioctx;
ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
string snap_id = "snap_id";
cls::rbd::GroupSnapshot snap = {snap_id, "snap_name", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(0, group_snap_add(&ioctx, group_id, snap));
+ ASSERT_EQ(0, group_snap_set(&ioctx, group_id, snap));
cls::rbd::GroupSnapshot snap1 = {snap_id, "snap_name1", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(-EEXIST, group_snap_add(&ioctx, group_id, snap1));
+ ASSERT_EQ(-EEXIST, group_snap_set(&ioctx, group_id, snap1));
}
-TEST_F(TestClsRbd, group_snap_add_duplicate_name) {
+TEST_F(TestClsRbd, group_snap_set_duplicate_name) {
librados::IoCtx ioctx;
ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
string snap_id1 = "snap_id1";
cls::rbd::GroupSnapshot snap = {snap_id1, "snap_name", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(0, group_snap_add(&ioctx, group_id, snap));
+ ASSERT_EQ(0, group_snap_set(&ioctx, group_id, snap));
string snap_id2 = "snap_id2";
cls::rbd::GroupSnapshot snap1 = {snap_id2, "snap_name", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(-EEXIST, group_snap_add(&ioctx, group_id, snap1));
+ ASSERT_EQ(-EEXIST, group_snap_set(&ioctx, group_id, snap1));
}
-TEST_F(TestClsRbd, group_snap_add) {
+TEST_F(TestClsRbd, group_snap_set) {
librados::IoCtx ioctx;
ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
string snap_id = "snap_id";
cls::rbd::GroupSnapshot snap = {snap_id, "test_snapshot", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(0, group_snap_add(&ioctx, group_id, snap));
+ ASSERT_EQ(0, group_snap_set(&ioctx, group_id, snap));
set<string> keys;
ASSERT_EQ(0, ioctx.omap_get_keys(group_id, "", 10, &keys));
string snap_id1 = "snap_id1";
cls::rbd::GroupSnapshot snap1 = {snap_id1, "test_snapshot1", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(0, group_snap_add(&ioctx, group_id, snap1));
+ ASSERT_EQ(0, group_snap_set(&ioctx, group_id, snap1));
string snap_id2 = "snap_id2";
cls::rbd::GroupSnapshot snap2 = {snap_id2, "test_snapshot2", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(0, group_snap_add(&ioctx, group_id, snap2));
+ ASSERT_EQ(0, group_snap_set(&ioctx, group_id, snap2));
std::vector<cls::rbd::GroupSnapshot> snapshots;
ASSERT_EQ(0, group_snap_list(&ioctx, group_id, cls::rbd::GroupSnapshot(), 10, &snapshots));
cls::rbd::GroupSnapshot snap = {snap_id,
"test_snapshot" + hexify(i),
cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(0, group_snap_add(&ioctx, group_id, snap));
+ ASSERT_EQ(0, group_snap_set(&ioctx, group_id, snap));
}
std::vector<cls::rbd::GroupSnapshot> snapshots;
}
}
-TEST_F(TestClsRbd, group_snap_update) {
- librados::IoCtx ioctx;
- ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
-
- string image_id = "image_id_snap_update";
-
- string group_id = "group_id_snap_update";
- ASSERT_EQ(0, ioctx.create(group_id, true));
-
- string snap_id = "snap_id";
- cls::rbd::GroupSnapshot snap = {snap_id, "test_snapshot", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(0, group_snap_add(&ioctx, group_id, snap));
-
- snap.state = cls::rbd::GROUP_SNAPSHOT_STATE_COMPLETE;
-
- ASSERT_EQ(0, group_snap_update(&ioctx, group_id, snap));
-
- std::vector<cls::rbd::GroupSnapshot> snapshots;
- ASSERT_EQ(0, group_snap_list(&ioctx, group_id, cls::rbd::GroupSnapshot(), 10, &snapshots));
- ASSERT_EQ(1U, snapshots.size());
- ASSERT_EQ(snap_id, snapshots[0].id);
- ASSERT_EQ(cls::rbd::GROUP_SNAPSHOT_STATE_COMPLETE, snapshots[0].state);
-}
-
-TEST_F(TestClsRbd, group_snap_update_empty_name) {
- librados::IoCtx ioctx;
- ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
-
- string image_id = "image_id_snap_update_empty_name";
-
- string group_id = "group_id_snap_update_empty_name";
- ASSERT_EQ(0, ioctx.create(group_id, true));
-
- string snap_id = "snap_id";
- cls::rbd::GroupSnapshot snap = {snap_id, "test_snapshot", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(0, group_snap_add(&ioctx, group_id, snap));
-
- snap.name = "";
- snap.state = cls::rbd::GROUP_SNAPSHOT_STATE_COMPLETE;
-
- ASSERT_EQ(-EINVAL, group_snap_update(&ioctx, group_id, snap));
-}
-
-TEST_F(TestClsRbd, group_snap_update_empty_id) {
- librados::IoCtx ioctx;
- ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
-
- string image_id = "image_id_snap_update_empty_id";
-
- string group_id = "group_id_snap_update_empty_id";
- ASSERT_EQ(0, ioctx.create(group_id, true));
-
- string snap_id = "snap_id";
- cls::rbd::GroupSnapshot snap = {snap_id, "test_snapshot", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(0, group_snap_add(&ioctx, group_id, snap));
-
- snap.id = "";
- snap.state = cls::rbd::GROUP_SNAPSHOT_STATE_COMPLETE;
-
- ASSERT_EQ(-EINVAL, group_snap_update(&ioctx, group_id, snap));
-}
-
TEST_F(TestClsRbd, group_snap_remove) {
librados::IoCtx ioctx;
string snap_id = "snap_id";
cls::rbd::GroupSnapshot snap = {snap_id, "test_snapshot", cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(0, group_snap_add(&ioctx, group_id, snap));
+ ASSERT_EQ(0, group_snap_set(&ioctx, group_id, snap));
set<string> keys;
ASSERT_EQ(0, ioctx.omap_get_keys(group_id, "", 10, &keys));
cls::rbd::GroupSnapshot snap = {snap_id,
"test_snapshot",
cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
- ASSERT_EQ(0, group_snap_add(&ioctx, group_id, snap));
+ ASSERT_EQ(0, group_snap_set(&ioctx, group_id, snap));
cls::rbd::GroupSnapshot received_snap;
ASSERT_EQ(0, group_snap_get_by_id(&ioctx, group_id, snap_id, &received_snap));