return get_children_finish(&it, &children);
}
+ void snapshot_info_get_start(librados::ObjectReadOperation *op,
+ snapid_t snap_id)
+ {
+ bufferlist bl;
+ encode(snap_id, bl);
+ op->exec("rbd", "snapshot_get", bl);
+ }
+
+ int snapshot_info_get_finish(bufferlist::const_iterator* it,
+ cls::rbd::SnapshotInfo* snap_info)
+ {
+ try {
+ decode(*snap_info, *it);
+ } catch (const buffer::error &err) {
+ return -EBADMSG;
+ }
+ return 0;
+ }
+
void snapshot_get_start(librados::ObjectReadOperation *op,
const std::vector<snapid_t> &ids)
{
for (auto snap_id : ids) {
- bufferlist bl;
- encode(snap_id, bl);
- op->exec("rbd", "snapshot_get", bl);
-
+ snapshot_info_get_start(op, snap_id);
get_parent_start(op, snap_id);
get_protection_status_start(op, snap_id);
}
protection_statuses->resize(ids.size());
try {
for (size_t i = 0; i < snaps->size(); ++i) {
- decode((*snaps)[i], *it);
+ // snapshot_get
+ int r = snapshot_info_get_finish(it, &(*snaps)[i]);
+ if (r < 0) {
+ return r;
+ }
- // get_parent
- int r = get_parent_finish(it, &(*parents)[i].spec,
- &(*parents)[i].overlap);
+ // get_parent
+ r = get_parent_finish(it, &(*parents)[i].spec,
+ &(*parents)[i].overlap);
if (r < 0) {
return r;
}
int get_children(librados::IoCtx *ioctx, const std::string &oid,
const ParentSpec &pspec, set<string>& children);
+ void snapshot_info_get_start(librados::ObjectReadOperation* op,
+ snapid_t snap_id);
+ int snapshot_info_get_finish(bufferlist::const_iterator* it,
+ cls::rbd::SnapshotInfo* snap_info);
+
void snapshot_get_start(librados::ObjectReadOperation *op,
const std::vector<snapid_t> &ids);
int snapshot_get_finish(bufferlist::const_iterator *it,
ldout(cct, 5) << dendl;
librados::ObjectReadOperation op;
- cls_client::snapshot_get_start(&op, {m_snap_id});
+ cls_client::snapshot_info_get_start(&op, m_snap_id);
auto aio_comp = create_rados_callback<
SnapshotRemoveRequest<I>,
ldout(cct, 5) << "r=" << r << dendl;
if (r == 0) {
- std::vector<cls::rbd::SnapshotInfo> snap_infos;
- std::vector<ParentInfo> parents;
- std::vector<uint8_t> protections;
+ cls::rbd::SnapshotInfo snap_info;
+
auto it = m_out_bl.cbegin();
- r = cls_client::snapshot_get_finish(&it, {m_snap_id}, &snap_infos,
- &parents, &protections);
+ r = cls_client::snapshot_info_get_finish(&it, &snap_info);
if (r == 0) {
- m_child_attached = (snap_infos[0].child_count > 0);
+ m_child_attached = (snap_info.child_count > 0);
}
}
encode(snap_info, *bl);
return r;
})));
- if (r >= 0) {
- EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx),
- exec(mock_image_ctx.header_oid, _, StrEq("rbd"),
- StrEq("get_parent"), _, _, _))
- .WillOnce(DoDefault());
- EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx),
- exec(mock_image_ctx.header_oid, _, StrEq("rbd"),
- StrEq("get_protection_status"), _, _, _))
- .WillOnce(DoDefault());
- }
}
void expect_object_map_snap_remove(MockImageCtx &mock_image_ctx, int r) {