::decode(*lockers, iter);
::decode(*exclusive_lock, iter);
// get_parent
- ::decode(parent->pool_id, iter);
- ::decode(parent->image_id, iter);
- ::decode(parent->snap_id, iter);
+ ::decode(parent->spec.pool_id, iter);
+ ::decode(parent->spec.image_id, iter);
+ ::decode(parent->spec.snap_id, iter);
::decode(parent->overlap, iter);
} catch (const buffer::error &err) {
return -EBADMSG;
}
int get_parent(librados::IoCtx *ioctx, const std::string &oid,
- snapid_t snap_id, int64_t *parent_pool,
- string *parent_image, snapid_t *parent_snap_id,
+ snapid_t snap_id, parent_spec *pspec,
uint64_t *parent_overlap)
{
bufferlist inbl, outbl;
try {
bufferlist::iterator iter = outbl.begin();
- ::decode(*parent_pool, iter);
- ::decode(*parent_image, iter);
- ::decode(*parent_snap_id, iter);
+ ::decode(pspec->pool_id, iter);
+ ::decode(pspec->image_id, iter);
+ ::decode(pspec->snap_id, iter);
::decode(*parent_overlap, iter);
} catch (const buffer::error &err) {
return -EBADMSG;
}
int set_parent(librados::IoCtx *ioctx, const std::string &oid,
- int64_t parent_pool, const string& parent_image,
- snapid_t parent_snap_id, uint64_t parent_overlap)
+ parent_spec pspec, uint64_t parent_overlap)
{
bufferlist inbl, outbl;
- ::encode(parent_pool, inbl);
- ::encode(parent_image, inbl);
- ::encode(parent_snap_id, inbl);
+ ::encode(pspec.pool_id, inbl);
+ ::encode(pspec.image_id, inbl);
+ ::encode(pspec.snap_id, inbl);
::encode(parent_overlap, inbl);
return ioctx->exec(oid, "rbd", "set_parent", inbl, outbl);
}
int add_child(librados::IoCtx *ioctx, const std::string &oid,
- uint64_t p_poolid, const std::string &p_imageid,
- snapid_t p_snapid, const std::string &c_imageid)
+ parent_spec pspec, const std::string &c_imageid)
{
bufferlist in, out;
- ::encode(p_poolid, in);
- ::encode(p_imageid, in);
- ::encode(p_snapid, in);
+ ::encode(pspec.pool_id, in);
+ ::encode(pspec.image_id, in);
+ ::encode(pspec.snap_id, in);
::encode(c_imageid, in);
return ioctx->exec(oid, "rbd", "add_child", in, out);
}
int remove_child(librados::IoCtx *ioctx, const std::string &oid,
- uint64_t p_poolid, const std::string &p_imageid,
- snapid_t p_snapid, const std::string &c_imageid)
+ parent_spec pspec, const std::string &c_imageid)
{
bufferlist in, out;
- ::encode(p_poolid, in);
- ::encode(p_imageid, in);
- ::encode(p_snapid, in);
+ ::encode(pspec.pool_id, in);
+ ::encode(pspec.image_id, in);
+ ::encode(pspec.snap_id, in);
::encode(c_imageid, in);
return ioctx->exec(oid, "rbd", "remove_child", in, out);
}
int get_children(librados::IoCtx *ioctx, const std::string &oid,
- uint64_t p_poolid, const std::string &p_imageid,
- snapid_t p_snapid, set<string>& children)
+ parent_spec pspec, set<string>& children)
{
bufferlist in, out;
- ::encode(p_poolid, in);
- ::encode(p_imageid, in);
- ::encode(p_snapid, in);
+ ::encode(pspec.pool_id, in);
+ ::encode(pspec.image_id, in);
+ ::encode(pspec.snap_id, in);
int r = ioctx->exec(oid, "rbd", "get_children", in, out);
if (r < 0)
::decode((*features)[i], iter);
::decode(incompat_features, iter);
// get_parent
- ::decode((*parents)[i].pool_id, iter);
- ::decode((*parents)[i].image_id, iter);
- ::decode((*parents)[i].snap_id, iter);
+ ::decode((*parents)[i].spec.pool_id, iter);
+ ::decode((*parents)[i].spec.image_id, iter);
+ ::decode((*parents)[i].spec.snap_id, iter);
::decode((*parents)[i].overlap, iter);
}
} catch (const buffer::error &err) {
using ::librbd::cls_client::dir_remove_image;
using ::librbd::cls_client::dir_rename_image;
using ::librbd::cls_client::parent_info;
+using ::librbd::cls_client::parent_spec;
static char *random_buf(size_t len)
{
string oid = "rbd_children_test";
ASSERT_EQ(0, ioctx.create(oid, true));
- string parent_image = "parent_id";
string snapname = "parent_snap";
snapid_t snapid(10);
+ string parent_image = "parent_id";
string child_image = "child_id";
- uint64_t poolid = ioctx.get_id();
set<string>children;
+ parent_spec pspec(ioctx.get_id(), parent_image, snapid);
// nonexistent children cannot be listed or removed
- ASSERT_EQ(-ENOENT, get_children(&ioctx, oid, poolid, parent_image, snapid,
- children));
- ASSERT_EQ(-ENOENT, remove_child(&ioctx, oid, poolid, parent_image, snapid,
- child_image));
+ ASSERT_EQ(-ENOENT, get_children(&ioctx, oid, pspec, children));
+ ASSERT_EQ(-ENOENT, remove_child(&ioctx, oid, pspec, child_image));
// make a parent with a snapshot
ASSERT_EQ(0, create_image(&ioctx, parent_image, 2<<20, 0,
ASSERT_EQ(0, snapshot_add(&ioctx, parent_image, snapid, snapname));
// add, verify it showed up
- ASSERT_EQ(0, add_child(&ioctx, oid, poolid, parent_image, snapid,
- child_image));
- ASSERT_EQ(0, get_children(&ioctx, oid, poolid, parent_image, snapid,
- children));
+ ASSERT_EQ(0, add_child(&ioctx, oid, pspec, child_image));
+ ASSERT_EQ(0, get_children(&ioctx, oid, pspec, children));
bool found = (children.find(child_image) != children.end());
ASSERT_EQ(found, true);
- ASSERT_EQ(0, remove_child(&ioctx, oid, poolid, parent_image, snapid,
- child_image));
+ ASSERT_EQ(0, remove_child(&ioctx, oid, pspec, child_image));
ioctx.close();
ASSERT_EQ(0, destroy_one_pool_pp(pool_name, rados));
}
ASSERT_EQ("", create_one_pool_pp(pool_name, rados));
ASSERT_EQ(0, rados.ioctx_create(pool_name.c_str(), ioctx));
- int64_t pool;
- string parent;
- snapid_t snapid;
+ parent_spec pspec;
uint64_t size;
- ASSERT_EQ(-ENOENT, get_parent(&ioctx, "doesnotexist", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
+ ASSERT_EQ(-ENOENT, get_parent(&ioctx, "doesnotexist", CEPH_NOSNAP, &pspec, &size));
// old image should fail
ASSERT_EQ(0, create_image(&ioctx, "old", 33<<20, 22, 0, "old_blk."));
- ASSERT_EQ(-ENOEXEC, get_parent(&ioctx, "old", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
- ASSERT_EQ(-ENOEXEC, set_parent(&ioctx, "old", -1, "parent", 3, 10<<20));
+ pspec = parent_spec(-1, "parent", 3);
+ ASSERT_EQ(-ENOEXEC, set_parent(&ioctx, "old", parent_spec(-1, "parent", 3), 10<<20));
ASSERT_EQ(-ENOEXEC, remove_parent(&ioctx, "old"));
// new image will work
ASSERT_EQ(0, create_image(&ioctx, "foo", 33<<20, 22, RBD_FEATURE_LAYERING, "foo."));
- ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
- ASSERT_EQ(-1, pool);
- ASSERT_EQ(0, get_parent(&ioctx, "foo", 123, &pool, &parent, &snapid, &size));
- ASSERT_EQ(-1, pool);
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pspec, &size));
+ ASSERT_EQ(-1, pspec.pool_id);
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 123, &pspec, &size));
+ ASSERT_EQ(-1, pspec.pool_id);
- ASSERT_EQ(-EINVAL, set_parent(&ioctx, "foo", -1, "parent", 3, 10<<20));
- ASSERT_EQ(-EINVAL, set_parent(&ioctx, "foo", 1, "", 3, 10<<20));
- ASSERT_EQ(-EINVAL, set_parent(&ioctx, "foo", 1, "parent", CEPH_NOSNAP, 10<<20));
- ASSERT_EQ(-EINVAL, set_parent(&ioctx, "foo", 1, "parent", 3, 0));
+ ASSERT_EQ(-EINVAL, set_parent(&ioctx, "foo", parent_spec(-1, "parent", 3), 10<<20));
+ ASSERT_EQ(-EINVAL, set_parent(&ioctx, "foo", parent_spec(1, "", 3), 10<<20));
+ ASSERT_EQ(-EINVAL, set_parent(&ioctx, "foo", parent_spec(1, "parent", CEPH_NOSNAP), 10<<20));
+ ASSERT_EQ(-EINVAL, set_parent(&ioctx, "foo", parent_spec(1, "parent", 3), 0));
- ASSERT_EQ(0, set_parent(&ioctx, "foo", 1, "parent", 3, 10<<20));
- ASSERT_EQ(-EEXIST, set_parent(&ioctx, "foo", 1, "parent", 3, 10<<20));
- ASSERT_EQ(-EEXIST, set_parent(&ioctx, "foo", 2, "parent", 34, 10<<20));
+ pspec = parent_spec(1, "parent", 3);
+ ASSERT_EQ(0, set_parent(&ioctx, "foo", pspec, 10<<20));
+ ASSERT_EQ(-EEXIST, set_parent(&ioctx, "foo", pspec, 10<<20));
+ ASSERT_EQ(-EEXIST, set_parent(&ioctx, "foo", parent_spec(2, "parent", 34), 10<<20));
- ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(0, remove_parent(&ioctx, "foo"));
ASSERT_EQ(-ENOENT, remove_parent(&ioctx, "foo"));
- ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
- ASSERT_EQ(-1, pool);
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pspec, &size));
+ ASSERT_EQ(-1, pspec.pool_id);
// snapshots
- ASSERT_EQ(0, set_parent(&ioctx, "foo", 1, "parent", 3, 10<<20));
+ ASSERT_EQ(0, set_parent(&ioctx, "foo", parent_spec(1, "parent", 3), 10<<20));
ASSERT_EQ(0, snapshot_add(&ioctx, "foo", 10, "snap1"));
- ASSERT_EQ(0, get_parent(&ioctx, "foo", 10, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 10, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(size, 10ull<<20);
ASSERT_EQ(0, remove_parent(&ioctx, "foo"));
- ASSERT_EQ(0, set_parent(&ioctx, "foo", 4, "parent2", 6, 5<<20));
+ ASSERT_EQ(0, set_parent(&ioctx, "foo", parent_spec(4, "parent2", 6), 5<<20));
ASSERT_EQ(0, snapshot_add(&ioctx, "foo", 11, "snap2"));
- ASSERT_EQ(0, get_parent(&ioctx, "foo", 10, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 10, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(size, 10ull<<20);
- ASSERT_EQ(0, get_parent(&ioctx, "foo", 11, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 4);
- ASSERT_EQ(parent, "parent2");
- ASSERT_EQ(snapid, snapid_t(6));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 11, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 4);
+ ASSERT_EQ(pspec.image_id, "parent2");
+ ASSERT_EQ(pspec.snap_id, snapid_t(6));
ASSERT_EQ(size, 5ull<<20);
ASSERT_EQ(0, remove_parent(&ioctx, "foo"));
ASSERT_EQ(0, snapshot_add(&ioctx, "foo", 12, "snap3"));
- ASSERT_EQ(0, get_parent(&ioctx, "foo", 10, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 10, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(size, 10ull<<20);
- ASSERT_EQ(0, get_parent(&ioctx, "foo", 11, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 4);
- ASSERT_EQ(parent, "parent2");
- ASSERT_EQ(snapid, snapid_t(6));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 11, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 4);
+ ASSERT_EQ(pspec.image_id, "parent2");
+ ASSERT_EQ(pspec.snap_id, snapid_t(6));
ASSERT_EQ(size, 5ull<<20);
- ASSERT_EQ(0, get_parent(&ioctx, "foo", 12, &pool, &parent, &snapid, &size));
- ASSERT_EQ(-1, pool);
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 12, &pspec, &size));
+ ASSERT_EQ(-1, pspec.pool_id);
// make sure set_parent takes min of our size and parent's size
- ASSERT_EQ(0, set_parent(&ioctx, "foo", 1, "parent", 3, 1<<20));
- ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, set_parent(&ioctx, "foo", parent_spec(1, "parent", 3), 1<<20));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(size, 1ull<<20);
ASSERT_EQ(0, remove_parent(&ioctx, "foo"));
- ASSERT_EQ(0, set_parent(&ioctx, "foo", 1, "parent", 3, 100<<20));
- ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, set_parent(&ioctx, "foo", parent_spec(1, "parent", 3), 100<<20));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(size, 33ull<<20);
ASSERT_EQ(0, remove_parent(&ioctx, "foo"));
// make sure resize adjust parent overlap
- ASSERT_EQ(0, set_parent(&ioctx, "foo", 1, "parent", 3, 10<<20));
+ ASSERT_EQ(0, set_parent(&ioctx, "foo", parent_spec(1, "parent", 3), 10<<20));
ASSERT_EQ(0, snapshot_add(&ioctx, "foo", 14, "snap4"));
ASSERT_EQ(0, set_size(&ioctx, "foo", 3 << 20));
- ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(size, 3ull<<20);
- ASSERT_EQ(0, get_parent(&ioctx, "foo", 14, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 14, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(size, 10ull<<20);
ASSERT_EQ(0, snapshot_add(&ioctx, "foo", 15, "snap5"));
ASSERT_EQ(0, set_size(&ioctx, "foo", 30 << 20));
- ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(size, 3ull<<20);
- ASSERT_EQ(0, get_parent(&ioctx, "foo", 14, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 14, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(size, 10ull<<20);
- ASSERT_EQ(0, get_parent(&ioctx, "foo", 15, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 15, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(size, 3ull<<20);
ASSERT_EQ(0, set_size(&ioctx, "foo", 2 << 20));
- ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(size, 2ull<<20);
ASSERT_EQ(0, snapshot_add(&ioctx, "foo", 16, "snap6"));
- ASSERT_EQ(0, get_parent(&ioctx, "foo", 16, &pool, &parent, &snapid, &size));
- ASSERT_EQ(pool, 1);
- ASSERT_EQ(parent, "parent");
- ASSERT_EQ(snapid, snapid_t(3));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 16, &pspec, &size));
+ ASSERT_EQ(pspec.pool_id, 1);
+ ASSERT_EQ(pspec.image_id, "parent");
+ ASSERT_EQ(pspec.snap_id, snapid_t(3));
ASSERT_EQ(size, 2ull<<20);
ioctx.close();