librbd: move group and diff API functions

The group and diff_iterate API functions are already in separate
units, so it's trivial to move them to the new 'api' namespace.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
This commit is contained in:
Jason Dillaman 2017-02-02 13:54:13 -05:00
parent 4aea48ec5f
commit c701e06897
10 changed files with 224 additions and 168 deletions

View File

@ -7,9 +7,7 @@ set(librbd_internal_srcs
AsyncObjectThrottle.cc
AsyncOperation.cc
AsyncRequest.cc
DiffIterate.cc
ExclusiveLock.cc
Group.cc
ImageCtx.cc
ImageState.cc
ImageWatcher.cc
@ -23,6 +21,8 @@ set(librbd_internal_srcs
Operations.cc
Utils.cc
Watcher.cc
api/DiffIterate.cc
api/Group.cc
api/Image.cc
api/Mirror.cc
cache/ImageWriteback.cc

View File

@ -1,30 +0,0 @@
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
#ifndef CEPH_LIBRBD_GROUP_H
#define CEPH_LIBRBD_GROUP_H
#include "include/rados/librados.hpp"
#include "include/rbd/librbd.hpp"
#include <string>
#include <vector>
namespace librbd {
struct ImageCtx;
// Consistency groups functions
int group_create(librados::IoCtx& io_ctx, const char *imgname);
int group_remove(librados::IoCtx& io_ctx, const char *group_name);
int group_list(librados::IoCtx& io_ctx, std::vector<std::string> *names);
int group_image_add(librados::IoCtx& group_ioctx, const char *group_name,
librados::IoCtx& image_ioctx, const char *image_name);
int group_image_remove(librados::IoCtx& group_ioctx, const char *group_name,
librados::IoCtx& image_ioctx, const char *image_name);
int group_image_list(librados::IoCtx& group_ioctx, const char *group_name,
std::vector<group_image_status_t> *images);
int image_get_group(ImageCtx *ictx, group_spec_t *group_spec);
} // namespace librbd
#endif // CEPH_LIBRBD_GROUP_H

View File

@ -1,10 +1,12 @@
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
#include "librbd/DiffIterate.h"
#include "librbd/api/DiffIterate.h"
#include "librbd/ImageCtx.h"
#include "librbd/ImageState.h"
#include "librbd/ObjectMap.h"
#include "librbd/Utils.h"
#include "librbd/internal.h"
#include "include/rados/librados.hpp"
#include "include/interval_set.h"
#include "common/errno.h"
@ -20,6 +22,7 @@
#define dout_prefix *_dout << "librbd::DiffIterate: "
namespace librbd {
namespace api {
namespace {
@ -30,7 +33,7 @@ enum ObjectDiffState {
};
struct DiffContext {
DiffIterate::Callback callback;
DiffIterate<>::Callback callback;
void *callback_arg;
bool whole_object;
uint64_t from_snap_id;
@ -38,7 +41,8 @@ struct DiffContext {
interval_set<uint64_t> parent_diff;
OrderedThrottle throttle;
DiffContext(ImageCtx &image_ctx, DiffIterate::Callback callback,
template <typename I>
DiffContext(I &image_ctx, DiffIterate<>::Callback callback,
void *callback_arg, bool _whole_object, uint64_t _from_snap_id,
uint64_t _end_snap_id)
: callback(callback), callback_arg(callback_arg),
@ -50,10 +54,11 @@ struct DiffContext {
class C_DiffObject : public Context {
public:
C_DiffObject(ImageCtx &image_ctx, librados::IoCtx &head_ctx,
template <typename I>
C_DiffObject(I &image_ctx, librados::IoCtx &head_ctx,
DiffContext &diff_context, const std::string &oid,
uint64_t offset, const std::vector<ObjectExtent> &object_extents)
: m_image_ctx(image_ctx), m_head_ctx(head_ctx),
: m_cct(image_ctx.cct), m_head_ctx(head_ctx),
m_diff_context(diff_context), m_oid(oid), m_offset(offset),
m_object_extents(object_extents), m_snap_ret(0) {
}
@ -76,7 +81,7 @@ protected:
typedef std::list<Diff> Diffs;
void finish(int r) override {
CephContext *cct = m_image_ctx.cct;
CephContext *cct = m_cct;
if (r == 0 && m_snap_ret < 0) {
r = m_snap_ret;
}
@ -108,7 +113,7 @@ protected:
}
private:
ImageCtx &m_image_ctx;
CephContext *m_cct;
librados::IoCtx &m_head_ctx;
DiffContext &m_diff_context;
std::string m_oid;
@ -119,7 +124,7 @@ private:
int m_snap_ret;
void compute_diffs(Diffs *diffs) {
CephContext *cct = m_image_ctx.cct;
CephContext *cct = m_cct;
// calc diff from from_snap_id -> to_snap_id
interval_set<uint64_t> diff;
@ -158,9 +163,9 @@ private:
interval_set<uint64_t> overlap; // object extents
overlap.insert(opos, r->second);
overlap.intersection_of(diff);
ldout(m_image_ctx.cct, 20) << " opos " << opos
<< " buf " << r->first << "~" << r->second
<< " overlap " << overlap << dendl;
ldout(cct, 20) << " opos " << opos
<< " buf " << r->first << "~" << r->second
<< " overlap " << overlap << dendl;
for (interval_set<uint64_t>::iterator s = overlap.begin();
s != overlap.end(); ++s) {
uint64_t su_off = s.get_start() - opos;
@ -189,8 +194,7 @@ private:
interval_set<uint64_t> o;
o.insert(m_offset + r->first, r->second);
o.intersection_of(m_diff_context.parent_diff);
ldout(m_image_ctx.cct, 20) << " reporting parent overlap " << o
<< dendl;
ldout(m_cct, 20) << " reporting parent overlap " << o << dendl;
for (interval_set<uint64_t>::iterator s = o.begin(); s != o.end();
++s) {
diffs->push_back(boost::make_tuple(s.get_start(), s.get_len(),
@ -202,9 +206,53 @@ private:
}
};
int simple_diff_cb(uint64_t off, size_t len, int exists, void *arg) {
// it's possible for a discard to create a hole in the parent image -- ignore
if (exists) {
interval_set<uint64_t> *diff = static_cast<interval_set<uint64_t> *>(arg);
diff->insert(off, len);
}
return 0;
}
} // anonymous namespace
int DiffIterate::execute() {
template <typename I>
int DiffIterate<I>::diff_iterate(I *ictx, const char *fromsnapname,
uint64_t off, uint64_t len,
bool include_parent, bool whole_object,
int (*cb)(uint64_t, size_t, int, void *),
void *arg)
{
ldout(ictx->cct, 20) << "diff_iterate " << ictx << " off = " << off
<< " len = " << len << dendl;
// ensure previous writes are visible to listsnaps
{
RWLock::RLocker owner_locker(ictx->owner_lock);
ictx->flush();
}
int r = ictx->state->refresh_if_required();
if (r < 0) {
return r;
}
ictx->snap_lock.get_read();
r = clip_io(ictx, off, &len);
ictx->snap_lock.put_read();
if (r < 0) {
return r;
}
DiffIterate command(*ictx, fromsnapname, off, len, include_parent,
whole_object, cb, arg);
r = command.execute();
return r;
}
template <typename I>
int DiffIterate<I>::execute() {
CephContext* cct = m_image_ctx.cct;
librados::IoCtx head_ctx;
@ -271,7 +319,7 @@ int DiffIterate::execute() {
ldout(cct, 10) << " first getting parent diff" << dendl;
DiffIterate diff_parent(*m_image_ctx.parent, NULL, 0, overlap,
m_include_parent, m_whole_object,
&DiffIterate::simple_diff_cb,
&simple_diff_cb,
&diff_context.parent_diff);
r = diff_parent.execute();
}
@ -338,8 +386,9 @@ int DiffIterate::execute() {
return 0;
}
int DiffIterate::diff_object_map(uint64_t from_snap_id, uint64_t to_snap_id,
BitVector<2>* object_diff_state) {
template <typename I>
int DiffIterate<I>::diff_object_map(uint64_t from_snap_id, uint64_t to_snap_id,
BitVector<2>* object_diff_state) {
assert(m_image_ctx.snap_lock.is_locked());
CephContext* cct = m_image_ctx.cct;
@ -448,14 +497,7 @@ int DiffIterate::diff_object_map(uint64_t from_snap_id, uint64_t to_snap_id,
return 0;
}
int DiffIterate::simple_diff_cb(uint64_t off, size_t len, int exists,
void *arg) {
// it's possible for a discard to create a hole in the parent image -- ignore
if (exists) {
interval_set<uint64_t> *diff = static_cast<interval_set<uint64_t> *>(arg);
diff->insert(off, len);
}
return 0;
}
} // namespace api
} // namespace librbd
template class librbd::api::DiffIterate<librbd::ImageCtx>;

View File

@ -1,7 +1,8 @@
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
#ifndef CEPH_LIBRBD_DIFF_ITERATE_H
#define CEPH_LIBRBD_DIFF_ITERATE_H
#ifndef CEPH_LIBRBD_API_DIFF_ITERATE_H
#define CEPH_LIBRBD_API_DIFF_ITERATE_H
#include "include/int_types.h"
#include "common/bit_vector.hpp"
@ -10,11 +11,30 @@ namespace librbd {
class ImageCtx;
namespace api {
template <typename ImageCtxT = librbd::ImageCtx>
class DiffIterate {
public:
typedef int (*Callback)(uint64_t, size_t, int, void *);
DiffIterate(ImageCtx &image_ctx, const char *from_snap_name, uint64_t off,
static int diff_iterate(ImageCtxT *ictx, const char *fromsnapname,
uint64_t off, uint64_t len, bool include_parent,
bool whole_object,
int (*cb)(uint64_t, size_t, int, void *),
void *arg);
private:
ImageCtxT &m_image_ctx;
const char* m_from_snap_name;
uint64_t m_offset;
uint64_t m_length;
bool m_include_parent;
bool m_whole_object;
Callback m_callback;
void *m_callback_arg;
DiffIterate(ImageCtxT &image_ctx, const char *from_snap_name, uint64_t off,
uint64_t len, bool include_parent, bool whole_object,
Callback callback, void *callback_arg)
: m_image_ctx(image_ctx), m_from_snap_name(from_snap_name), m_offset(off),
@ -26,22 +46,14 @@ public:
int execute();
private:
ImageCtx &m_image_ctx;
const char* m_from_snap_name;
uint64_t m_offset;
uint64_t m_length;
bool m_include_parent;
bool m_whole_object;
Callback m_callback;
void *m_callback_arg;
int diff_object_map(uint64_t from_snap_id, uint64_t to_snap_id,
BitVector<2>* object_diff_state);
static int simple_diff_cb(uint64_t off, size_t len, int exists, void *arg);
};
} // namespace api
} // namespace librbd
#endif // CEPH_LIBRBD_DIFF_ITERATE_H
extern template class librbd::api::DiffIterate<librbd::ImageCtx>;
#endif // CEPH_LIBRBD_API_DIFF_ITERATE_H

View File

@ -1,16 +1,15 @@
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
#include "librbd/api/Group.h"
#include "common/errno.h"
#include "librbd/Group.h"
#include "librbd/ImageState.h"
#include "librbd/Utils.h"
#include "librbd/io/AioCompletion.h"
#define dout_subsys ceph_subsys_rbd
#undef dout_prefix
#define dout_prefix *_dout << "librbd::Group: "
#define dout_prefix *_dout << "librbd::api::Group: " << __func__ << ": "
using std::map;
using std::pair;
@ -25,10 +24,12 @@ using librados::IoCtx;
using librados::Rados;
namespace librbd {
namespace api {
// Consistency groups functions
int group_create(librados::IoCtx& io_ctx, const char *group_name)
template <typename I>
int Group<I>::create(librados::IoCtx& io_ctx, const char *group_name)
{
CephContext *cct = (CephContext *)io_ctx.cct();
@ -42,7 +43,8 @@ int group_create(librados::IoCtx& io_ctx, const char *group_name)
ldout(cct, 2) << "adding consistency group to directory..." << dendl;
int r = cls_client::group_dir_add(&io_ctx, RBD_GROUP_DIRECTORY, group_name, id);
int r = cls_client::group_dir_add(&io_ctx, RBD_GROUP_DIRECTORY, group_name,
id);
if (r < 0) {
lderr(cct) << "error adding consistency group to directory: "
<< cpp_strerror(r)
@ -71,13 +73,14 @@ err_remove_from_dir:
return r;
}
int group_remove(librados::IoCtx& io_ctx, const char *group_name)
template <typename I>
int Group<I>::remove(librados::IoCtx& io_ctx, const char *group_name)
{
CephContext *cct((CephContext *)io_ctx.cct());
ldout(cct, 20) << "group_remove " << &io_ctx << " " << group_name << dendl;
ldout(cct, 20) << "io_ctx=" << &io_ctx << " " << group_name << dendl;
std::vector<group_image_status_t> images;
int r = group_image_list(io_ctx, group_name, &images);
int r = image_list(io_ctx, group_name, &images);
if (r < 0 && r != -ENOENT) {
lderr(cct) << "error listing group images" << dendl;
return r;
@ -87,7 +90,7 @@ int group_remove(librados::IoCtx& io_ctx, const char *group_name)
librados::Rados rados(io_ctx);
IoCtx image_ioctx;
rados.ioctx_create2(i.pool, image_ioctx);
r = group_image_remove(io_ctx, group_name, image_ioctx, i.name.c_str());
r = image_remove(io_ctx, group_name, image_ioctx, i.name.c_str());
if (r < 0 && r != -ENOENT) {
lderr(cct) << "error removing image from a group" << dendl;
return r;
@ -110,8 +113,8 @@ int group_remove(librados::IoCtx& io_ctx, const char *group_name)
return r;
}
r = cls_client::group_dir_remove(&io_ctx, RBD_GROUP_DIRECTORY,
group_name, group_id);
r = cls_client::group_dir_remove(&io_ctx, RBD_GROUP_DIRECTORY, group_name,
group_id);
if (r < 0 && r != -ENOENT) {
lderr(cct) << "error removing group from directory" << dendl;
return r;
@ -120,10 +123,11 @@ int group_remove(librados::IoCtx& io_ctx, const char *group_name)
return 0;
}
int group_list(IoCtx& io_ctx, vector<string> *names)
template <typename I>
int Group<I>::list(IoCtx& io_ctx, vector<string> *names)
{
CephContext *cct = (CephContext *)io_ctx.cct();
ldout(cct, 20) << "group_list " << &io_ctx << dendl;
ldout(cct, 20) << "io_ctx=" << &io_ctx << dendl;
int max_read = 1024;
string last_read = "";
@ -149,17 +153,19 @@ int group_list(IoCtx& io_ctx, vector<string> *names)
return 0;
}
int group_image_add(librados::IoCtx& group_ioctx, const char *group_name,
template <typename I>
int Group<I>::image_add(librados::IoCtx& group_ioctx, const char *group_name,
librados::IoCtx& image_ioctx, const char *image_name)
{
CephContext *cct = (CephContext *)group_ioctx.cct();
ldout(cct, 20) << "group_image_add " << &group_ioctx
ldout(cct, 20) << "io_ctx=" << &group_ioctx
<< " group name " << group_name << " image "
<< &image_ioctx << " name " << image_name << dendl;
string group_id;
int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY, group_name, &group_id);
int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY, group_name,
&group_id);
if (r < 0) {
lderr(cct) << "error reading consistency group id object: "
<< cpp_strerror(r)
@ -174,7 +180,8 @@ int group_image_add(librados::IoCtx& group_ioctx, const char *group_name,
string image_id;
r = cls_client::dir_get_id(&image_ioctx, RBD_DIRECTORY, image_name, &image_id);
r = cls_client::dir_get_id(&image_ioctx, RBD_DIRECTORY, image_name,
&image_id);
if (r < 0) {
lderr(cct) << "error reading image id object: "
<< cpp_strerror(-r) << dendl;
@ -186,10 +193,11 @@ int group_image_add(librados::IoCtx& group_ioctx, const char *group_name,
ldout(cct, 20) << "adding image " << image_name
<< " image id " << image_header_oid << dendl;
cls::rbd::GroupImageStatus incomplete_st(image_id, image_ioctx.get_id(),
cls::rbd::GROUP_IMAGE_LINK_STATE_INCOMPLETE);
cls::rbd::GroupImageStatus attached_st(image_id, image_ioctx.get_id(),
cls::rbd::GROUP_IMAGE_LINK_STATE_ATTACHED);
cls::rbd::GroupImageStatus incomplete_st(
image_id, image_ioctx.get_id(),
cls::rbd::GROUP_IMAGE_LINK_STATE_INCOMPLETE);
cls::rbd::GroupImageStatus attached_st(
image_id, image_ioctx.get_id(), cls::rbd::GROUP_IMAGE_LINK_STATE_ATTACHED);
r = cls_client::group_image_set(&group_ioctx, group_header_oid,
incomplete_st);
@ -202,8 +210,7 @@ int group_image_add(librados::IoCtx& group_ioctx, const char *group_name,
return r;
}
r = cls_client::image_add_group(&image_ioctx, image_header_oid,
group_spec);
r = cls_client::image_add_group(&image_ioctx, image_header_oid, group_spec);
if (r < 0) {
lderr(cct) << "error adding group reference to image: "
<< cpp_strerror(-r) << dendl;
@ -219,17 +226,19 @@ int group_image_add(librados::IoCtx& group_ioctx, const char *group_name,
return r;
}
int group_image_remove(librados::IoCtx& group_ioctx, const char *group_name,
librados::IoCtx& image_ioctx, const char *image_name)
template <typename I>
int Group<I>::image_remove(librados::IoCtx& group_ioctx, const char *group_name,
librados::IoCtx& image_ioctx, const char *image_name)
{
CephContext *cct = (CephContext *)group_ioctx.cct();
ldout(cct, 20) << "group_remove_image " << &group_ioctx
ldout(cct, 20) << "io_ctx=" << &group_ioctx
<< " group name " << group_name << " image "
<< &image_ioctx << " name " << image_name << dendl;
string group_id;
int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY, group_name, &group_id);
int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY, group_name,
&group_id);
if (r < 0) {
lderr(cct) << "error reading consistency group id object: "
<< cpp_strerror(r)
@ -242,7 +251,8 @@ int group_image_remove(librados::IoCtx& group_ioctx, const char *group_name,
<< " group id " << group_header_oid << dendl;
string image_id;
r = cls_client::dir_get_id(&image_ioctx, RBD_DIRECTORY, image_name, &image_id);
r = cls_client::dir_get_id(&image_ioctx, RBD_DIRECTORY, image_name,
&image_id);
if (r < 0) {
lderr(cct) << "error reading image id object: "
<< cpp_strerror(-r) << dendl;
@ -256,8 +266,9 @@ int group_image_remove(librados::IoCtx& group_ioctx, const char *group_name,
cls::rbd::GroupSpec group_spec(group_id, group_ioctx.get_id());
cls::rbd::GroupImageStatus incomplete_st(image_id, image_ioctx.get_id(),
cls::rbd::GROUP_IMAGE_LINK_STATE_INCOMPLETE);
cls::rbd::GroupImageStatus incomplete_st(
image_id, image_ioctx.get_id(),
cls::rbd::GROUP_IMAGE_LINK_STATE_INCOMPLETE);
cls::rbd::GroupImageSpec spec(image_id, image_ioctx.get_id());
@ -288,12 +299,13 @@ int group_image_remove(librados::IoCtx& group_ioctx, const char *group_name,
return 0;
}
int group_image_list(librados::IoCtx& group_ioctx,
template <typename I>
int Group<I>::image_list(librados::IoCtx& group_ioctx,
const char *group_name,
std::vector<group_image_status_t> *images)
{
CephContext *cct = (CephContext *)group_ioctx.cct();
ldout(cct, 20) << "group_image_list " << &group_ioctx
ldout(cct, 20) << "io_ctx=" << &group_ioctx
<< " group name " << group_name << dendl;
string group_id;
@ -319,7 +331,7 @@ int group_image_list(librados::IoCtx& group_ioctx,
cls::rbd::GroupImageSpec start_last;
r = cls_client::group_image_list(&group_ioctx, group_header_oid,
start_last, max_read, &image_ids_page);
start_last, max_read, &image_ids_page);
if (r < 0) {
lderr(cct) << "error reading image list from consistency group: "
@ -356,7 +368,8 @@ int group_image_list(librados::IoCtx& group_ioctx,
return 0;
}
int image_get_group(ImageCtx *ictx, group_spec_t *group_spec)
template <typename I>
int Group<I>::image_get_group(I *ictx, group_spec_t *group_spec)
{
int r = ictx->state->refresh_if_required();
if (r < 0)
@ -382,4 +395,7 @@ int image_get_group(ImageCtx *ictx, group_spec_t *group_spec)
return 0;
}
} // namespace api
} // namespace librbd
template class librbd::api::Group<librbd::ImageCtx>;

42
src/librbd/api/Group.h Normal file
View File

@ -0,0 +1,42 @@
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
#ifndef CEPH_LIBRBD_API_GROUP_H
#define CEPH_LIBRBD_API_GROUP_H
#include "include/rbd/librbd.hpp"
#include <string>
#include <vector>
namespace librados { struct IoCtx; }
namespace librbd {
struct ImageCtx;
namespace api {
template <typename ImageCtxT = librbd::ImageCtx>
struct Group {
static int create(librados::IoCtx& io_ctx, const char *imgname);
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 image_add(librados::IoCtx& group_ioctx, const char *group_name,
librados::IoCtx& image_ioctx, const char *image_name);
static int image_remove(librados::IoCtx& group_ioctx, const char *group_name,
librados::IoCtx& image_ioctx, const char *image_name);
static int image_list(librados::IoCtx& group_ioctx, const char *group_name,
std::vector<group_image_status_t> *images);
static int image_get_group(ImageCtxT *ictx, group_spec_t *group_spec);
};
} // namespace api
} // namespace librbd
extern template class librbd::api::Group<librbd::ImageCtx>;
#endif // CEPH_LIBRBD_API_GROUP_H

View File

@ -21,7 +21,6 @@
#include "cls/journal/cls_journal_types.h"
#include "cls/journal/cls_journal_client.h"
#include "librbd/DiffIterate.h"
#include "librbd/ExclusiveLock.h"
#include "librbd/ImageCtx.h"
#include "librbd/ImageState.h"
@ -2015,37 +2014,6 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) {
return total_read;
}
int diff_iterate(ImageCtx *ictx, const char *fromsnapname, uint64_t off,
uint64_t len, bool include_parent, bool whole_object,
int (*cb)(uint64_t, size_t, int, void *), void *arg)
{
ldout(ictx->cct, 20) << "diff_iterate " << ictx << " off = " << off
<< " len = " << len << dendl;
// ensure previous writes are visible to listsnaps
{
RWLock::RLocker owner_locker(ictx->owner_lock);
ictx->flush();
}
int r = ictx->state->refresh_if_required();
if (r < 0) {
return r;
}
ictx->snap_lock.get_read();
r = clip_io(ictx, off, &len);
ictx->snap_lock.put_read();
if (r < 0) {
return r;
}
DiffIterate command(*ictx, fromsnapname, off, len, include_parent,
whole_object, cb, arg);
r = command.execute();
return r;
}
// validate extent against image size; clip to image size if necessary
int clip_io(ImageCtx *ictx, uint64_t off, uint64_t *len)
{

View File

@ -185,10 +185,6 @@ namespace librbd {
int64_t read_iterate(ImageCtx *ictx, uint64_t off, uint64_t len,
int (*cb)(uint64_t, size_t, const char *, void *),
void *arg);
int diff_iterate(ImageCtx *ictx, const char *fromsnapname, uint64_t off,
uint64_t len, bool include_parent, bool whole_object,
int (*cb)(uint64_t, size_t, int, void *),
void *arg);
void readahead(ImageCtx *ictx,
const vector<pair<uint64_t,uint64_t> >& image_extents);

View File

@ -23,11 +23,12 @@
#include "cls/rbd/cls_rbd_client.h"
#include "cls/rbd/cls_rbd_types.h"
#include "librbd/Group.h"
#include "librbd/ImageCtx.h"
#include "librbd/ImageState.h"
#include "librbd/internal.h"
#include "librbd/Operations.h"
#include "librbd/api/DiffIterate.h"
#include "librbd/api/Group.h"
#include "librbd/api/Mirror.h"
#include "librbd/io/AioCompletion.h"
#include "librbd/io/ImageRequestWQ.h"
@ -477,7 +478,7 @@ namespace librbd {
TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
tracepoint(librbd, group_create_enter, io_ctx.get_pool_name().c_str(),
io_ctx.get_id(), group_name);
int r = librbd::group_create(io_ctx, group_name);
int r = librbd::api::Group<>::create(io_ctx, group_name);
tracepoint(librbd, group_create_exit, r);
return r;
}
@ -487,7 +488,7 @@ namespace librbd {
TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
tracepoint(librbd, group_remove_enter, io_ctx.get_pool_name().c_str(),
io_ctx.get_id(), group_name);
int r = librbd::group_remove(io_ctx, group_name);
int r = librbd::api::Group<>::remove(io_ctx, group_name);
tracepoint(librbd, group_remove_exit, r);
return r;
}
@ -498,7 +499,7 @@ namespace librbd {
tracepoint(librbd, group_list_enter, io_ctx.get_pool_name().c_str(),
io_ctx.get_id());
int r = librbd::group_list(io_ctx, names);
int r = librbd::api::Group<>::list(io_ctx, names);
if (r >= 0) {
for (auto itr : *names) {
tracepoint(librbd, group_list_entry, itr.c_str());
@ -515,7 +516,8 @@ namespace librbd {
tracepoint(librbd, group_image_add_enter, group_ioctx.get_pool_name().c_str(),
group_ioctx.get_id(), group_name, image_ioctx.get_pool_name().c_str(),
image_ioctx.get_id(), image_name);
int r = librbd::group_image_add(group_ioctx, group_name, image_ioctx, image_name);
int r = librbd::api::Group<>::image_add(group_ioctx, group_name,
image_ioctx, image_name);
tracepoint(librbd, group_image_add_exit, r);
return r;
}
@ -527,7 +529,8 @@ namespace librbd {
tracepoint(librbd, group_image_remove_enter, group_ioctx.get_pool_name().c_str(),
group_ioctx.get_id(), group_name, image_ioctx.get_pool_name().c_str(),
image_ioctx.get_id(), image_name);
int r = librbd::group_image_remove(group_ioctx, group_name, image_ioctx, image_name);
int r = librbd::api::Group<>::image_remove(group_ioctx, group_name,
image_ioctx, image_name);
tracepoint(librbd, group_image_remove_exit, r);
return r;
}
@ -538,7 +541,7 @@ namespace librbd {
TracepointProvider::initialize<tracepoint_traits>(get_cct(group_ioctx));
tracepoint(librbd, group_image_list_enter, group_ioctx.get_pool_name().c_str(),
group_ioctx.get_id(), group_name);
int r = librbd::group_image_list(group_ioctx, group_name, images);
int r = librbd::api::Group<>::image_list(group_ioctx, group_name, images);
tracepoint(librbd, group_image_list_exit, r);
return r;
}
@ -743,7 +746,7 @@ namespace librbd {
{
ImageCtx *ictx = (ImageCtx *)ctx;
tracepoint(librbd, image_get_group_enter, ictx->name.c_str());
int r = librbd::image_get_group(ictx, group_spec);
int r = librbd::api::Group<>::image_get_group(ictx, group_spec);
tracepoint(librbd, image_get_group_exit, r);
return r;
}
@ -1277,8 +1280,8 @@ namespace librbd {
tracepoint(librbd, diff_iterate_enter, ictx, ictx->name.c_str(),
ictx->snap_name.c_str(), ictx->read_only, fromsnapname, ofs, len,
true, false);
int r = librbd::diff_iterate(ictx, fromsnapname, ofs, len, true, false, cb,
arg);
int r = librbd::api::DiffIterate<>::diff_iterate(ictx, fromsnapname, ofs,
len, true, false, cb, arg);
tracepoint(librbd, diff_iterate_exit, r);
return r;
}
@ -1291,8 +1294,9 @@ namespace librbd {
tracepoint(librbd, diff_iterate_enter, ictx, ictx->name.c_str(),
ictx->snap_name.c_str(), ictx->read_only, fromsnapname, ofs, len,
include_parent, whole_object);
int r = librbd::diff_iterate(ictx, fromsnapname, ofs, len, include_parent,
whole_object, cb, arg);
int r = librbd::api::DiffIterate<>::diff_iterate(ictx, fromsnapname, ofs,
len, include_parent,
whole_object, cb, arg);
tracepoint(librbd, diff_iterate_exit, r);
return r;
}
@ -2890,8 +2894,8 @@ extern "C" int rbd_diff_iterate(rbd_image_t image,
tracepoint(librbd, diff_iterate_enter, ictx, ictx->name.c_str(),
ictx->snap_name.c_str(), ictx->read_only, fromsnapname, ofs, len,
true, false);
int r = librbd::diff_iterate(ictx, fromsnapname, ofs, len, true, false, cb,
arg);
int r = librbd::api::DiffIterate<>::diff_iterate(ictx, fromsnapname, ofs, len,
true, false, cb, arg);
tracepoint(librbd, diff_iterate_exit, r);
return r;
}
@ -2906,8 +2910,9 @@ extern "C" int rbd_diff_iterate2(rbd_image_t image, const char *fromsnapname,
tracepoint(librbd, diff_iterate_enter, ictx, ictx->name.c_str(),
ictx->snap_name.c_str(), ictx->read_only, fromsnapname, ofs, len,
include_parent != 0, whole_object != 0);
int r = librbd::diff_iterate(ictx, fromsnapname, ofs, len, include_parent,
whole_object, cb, arg);
int r = librbd::api::DiffIterate<>::diff_iterate(ictx, fromsnapname, ofs, len,
include_parent, whole_object,
cb, arg);
tracepoint(librbd, diff_iterate_exit, r);
return r;
}
@ -3395,7 +3400,7 @@ extern "C" int rbd_group_create(rados_ioctx_t p, const char *name)
TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
tracepoint(librbd, group_create_enter, io_ctx.get_pool_name().c_str(),
io_ctx.get_id(), name);
int r = librbd::group_create(io_ctx, name);
int r = librbd::api::Group<>::create(io_ctx, name);
tracepoint(librbd, group_create_exit, r);
return r;
}
@ -3407,7 +3412,7 @@ extern "C" int rbd_group_remove(rados_ioctx_t p, const char *name)
TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
tracepoint(librbd, group_remove_enter, io_ctx.get_pool_name().c_str(),
io_ctx.get_id(), name);
int r = librbd::group_remove(io_ctx, name);
int r = librbd::api::Group<>::remove(io_ctx, name);
tracepoint(librbd, group_remove_exit, r);
return r;
}
@ -3475,7 +3480,8 @@ extern "C" int rbd_group_image_add(
group_ioctx.get_id(), group_name, image_ioctx.get_pool_name().c_str(),
image_ioctx.get_id(), image_name);
int r = librbd::group_image_add(group_ioctx, group_name, image_ioctx, image_name);
int r = librbd::api::Group<>::image_add(group_ioctx, group_name, image_ioctx,
image_name);
tracepoint(librbd, group_image_add_exit, r);
return r;
@ -3496,7 +3502,8 @@ extern "C" int rbd_group_image_remove(
group_ioctx.get_id(), group_name, image_ioctx.get_pool_name().c_str(),
image_ioctx.get_id(), image_name);
int r = librbd::group_image_remove(group_ioctx, group_name, image_ioctx, image_name);
int r = librbd::api::Group<>::image_remove(group_ioctx, group_name,
image_ioctx, image_name);
tracepoint(librbd, group_image_remove_exit, r);
return r;
@ -3515,7 +3522,8 @@ extern "C" int rbd_group_image_list(rados_ioctx_t group_p,
group_ioctx.get_id(), group_name);
std::vector<librbd::group_image_status_t> cpp_images;
int r = librbd::group_image_list(group_ioctx, group_name, &cpp_images);
int r = librbd::api::Group<>::image_list(group_ioctx, group_name,
&cpp_images);
if (r == -ENOENT) {
tracepoint(librbd, group_image_list_exit, 0);
@ -3556,7 +3564,7 @@ extern "C" int rbd_image_get_group(rados_ioctx_t image_p,
tracepoint(librbd, image_get_group_enter, ictx->name.c_str());
librbd::group_spec_t group_spec;
r = librbd::image_get_group(ictx, &group_spec);
r = librbd::api::Group<>::image_get_group(ictx, &group_spec);
group_spec_cpp_to_c(group_spec, c_group_spec);
tracepoint(librbd, image_get_group_exit, r);
ictx->state->close();

View File

@ -1,5 +1,6 @@
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
#include "cls/rbd/cls_rbd_types.h"
#include "test/librbd/test_fixture.h"
#include "test/librbd/test_support.h"
@ -10,6 +11,7 @@
#include "librbd/internal.h"
#include "librbd/ObjectMap.h"
#include "librbd/Operations.h"
#include "librbd/api/DiffIterate.h"
#include "librbd/io/AioCompletion.h"
#include "librbd/io/ImageRequest.h"
#include "librbd/io/ImageRequestWQ.h"
@ -966,8 +968,8 @@ TEST_F(TestInternal, DiffIterateCloneOverwrite) {
interval_set<uint64_t> diff;
ASSERT_EQ(0, librbd::snap_set(ictx, "one"));
ASSERT_EQ(0, librbd::diff_iterate(ictx, nullptr, 0, size, true, false,
iterate_cb, (void *)&diff));
ASSERT_EQ(0, librbd::api::DiffIterate<>::diff_iterate(
ictx, nullptr, 0, size, true, false, iterate_cb, (void *)&diff));
ASSERT_EQ(one, diff);
}