... synchronously.
Signed-off-by: Ramana Raja <rraja@redhat.com>
CEPH_RBD_API int rbd_mirror_group_create_snapshot(rados_ioctx_t p,
const char *name,
uint32_t flags,
- char **snap_id);
+ char *snap_id,
+ size_t *max_snap_id_len);
CEPH_RBD_API int rbd_mirror_group_get_info(
rados_ioctx_t p, const char *name,
rbd_mirror_group_info_t *mirror_group_info, size_t info_size);
extern "C" int rbd_mirror_group_create_snapshot(rados_ioctx_t group_p,
const char *group_name,
uint32_t flags,
- char **snap_id)
+ char *snap_id,
+ size_t *max_snap_id_len)
{
+ if (*max_snap_id_len < RBD_MAX_IMAGE_ID_LENGTH + 1) {
+ *max_snap_id_len = RBD_MAX_IMAGE_ID_LENGTH + 1;
+ return -ERANGE;
+ }
+
+ *max_snap_id_len = RBD_MAX_IMAGE_ID_LENGTH + 1;
+
librados::IoCtx group_ioctx;
librados::IoCtx::from_rados_ioctx_t(group_p, group_ioctx);
return r;
}
- if (snap_id != NULL) {
- *snap_id = strdup(cpp_snap_id.c_str());
- }
+ strcpy(snap_id, cpp_snap_id.c_str());
return 0;
}
void rbd_mirror_image_info_list_cleanup(char **image_ids,
rbd_mirror_image_info_t *info_entries,
size_t num_entries)
+ int rbd_mirror_group_create_snapshot(rados_ioctx_t gp_ioctx,
+ const char *gp_name, uint32_t flags,
+ char *snap_id,
+ size_t *max_snap_id_len)
int rbd_mirror_group_get_info(rados_ioctx_t gp_ioctx, const char *gp_name,
rbd_mirror_group_info_t *mirror_gp_info,
size_t info_size)
RBD_WRITE_ZEROES_FLAG_THICK_PROVISION = _RBD_WRITE_ZEROES_FLAG_THICK_PROVISION
+RBD_MAX_SNAP_ID_SIZE = 15
+
+
class Error(Exception):
pass
if ret != 0:
raise make_ex(ret, 'error rolling back group to snapshot', group_errno_to_exception)
+ def mirror_group_create_snapshot(self, flags=0):
+ """
+ Create mirror group snapshot.
+
+ :param flags: create snapshot flags
+ :type flags: int
+ :returns: str - group snapshot ID
+ """
+ cdef:
+ uint32_t _flags = flags
+ char *snap_id = NULL
+ size_t max_snap_id_size = RBD_MAX_SNAP_ID_SIZE
+ int ret = -errno.ERANGE
+ try:
+ while ret == -errno.ERANGE:
+ snap_id = <char *>realloc_chk(snap_id, max_snap_id_size)
+ with nogil:
+ ret = rbd_mirror_group_create_snapshot(self._ioctx,
+ self._name,
+ _flags, snap_id,
+ &max_snap_id_size)
+ if ret != 0:
+ raise make_ex(ret,
+ 'error creating snapshot of group %s' % self._name,
+ group_errno_to_exception)
+
+ return decode_cstr(snap_id)
+ finally:
+ free(snap_id)
+
def mirror_group_get_info(self):
"""
Get mirror info of the group.