From: Josh Durgin Date: Fri, 28 Jan 2011 23:11:41 +0000 (-0800) Subject: librbd: update C interface and tests to use image contexts X-Git-Tag: v0.25~143^2~38 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=78fe39346a7b00e56191da9d714fb894e97c2299;p=ceph.git librbd: update C interface and tests to use image contexts --- diff --git a/src/include/librbd.h b/src/include/librbd.h index 71e254357b00..22e564e8eb62 100644 --- a/src/include/librbd.h +++ b/src/include/librbd.h @@ -22,6 +22,7 @@ extern "C" { #include #include #include +#include "librados.h" #define LIBRBD_VER_MAJOR 0 #define LIBRBD_VER_MINOR 1 @@ -35,6 +36,7 @@ extern "C" { typedef void *rbd_snap_t; typedef void *rbd_pool_t; +typedef void *rbd_image_t; typedef struct { uint64_t id; @@ -60,21 +62,26 @@ int rbd_open_pool(const char *pool_name, rbd_pool_t *pool); int rbd_close_pool(rbd_pool_t pool); /* images */ -int rbd_create(rbd_pool_t pool, const char *name, size_t size); -int rbd_remove(rbd_pool_t pool, const char *name); -int rbd_resize(rbd_pool_t pool, const char *name, size_t size); -int rbd_stat(rbd_pool_t pool, const char *name, rbd_image_info_t *info); size_t rbd_list(rbd_pool_t pool, char **names, size_t max_names); +int rbd_create(rbd_pool_t pool, const char *name, size_t size, int *order); +int rbd_remove(rbd_pool_t pool, const char *name); +int rbd_copy(rbd_pool_t src_pool, const char *srcname, rbd_pool_t dest_pool, const char *destname); +int rbd_rename(rbd_pool_t src_pool, const char *srcname, const char *destname); + +int rbd_open_image(rbd_pool_t pool, const char *name, rbd_image_t *image); +int rbd_close_image(rbd_image_t image); +int rbd_resize(rbd_image_t image, size_t size); +int rbd_stat(rbd_image_t image, rbd_image_info_t *info); /* snapshots */ -int rbd_create_snap(rbd_pool_t pool, const char *image, - const char *snapname); -int rbd_remove_snap(rbd_pool_t pool, const char *image, - const char *snapname); -int rbd_rollback_snap(rbd_pool_t pool, const char *image, - const char *snapname); -size_t rbd_list_snaps(rbd_pool_t pool, const char *image, - rbd_snap_info_t *snaps, size_t max_snaps); +size_t rbd_list_snaps(rbd_image_t image, rbd_snap_info_t *snaps, size_t max_snaps); +int rbd_create_snap(rbd_image_t image, const char *snapname); +int rbd_remove_snap(rbd_image_t image, const char *snapname); +int rbd_rollback_snap(rbd_image_t image, const char *snapname); +int set_snap(rbd_image_t image, const char *snapname); + +/* lower level access */ +void get_rados_pools(rbd_pool_t pool, rados_pool_t *md_pool, rados_pool_t *data_pool); #ifdef __cplusplus } diff --git a/src/librbd.cc b/src/librbd.cc index f0a36e3651a8..2c61336e2dbb 100644 --- a/src/librbd.cc +++ b/src/librbd.cc @@ -1176,7 +1176,6 @@ extern "C" void librbd_version(int *major, int *minor, int *extra) *extra = LIBRBD_VER_EXTRA; } -#if 0 /* waiting until C++ interface stabilizes */ static librbd::RBD rbd; extern "C" int rbd_initialize(int argc, const char **argv) @@ -1189,6 +1188,7 @@ extern "C" void rbd_shutdown() rbd.shutdown(); } +/* pools */ extern "C" int rbd_open_pool(const char *pool_name, rbd_pool_t *pool) { librbd::pool_t cpp_pool; @@ -1202,13 +1202,32 @@ extern "C" int rbd_open_pool(const char *pool_name, rbd_pool_t *pool) extern "C" int rbd_close_pool(rbd_pool_t pool) { - return rbd.close_pool((librbd::pool_t) pool); + return rbd.close_pool(pool); } /* images */ -extern "C" int rbd_create(rbd_pool_t pool, const char *name, size_t size) +extern "C" size_t rbd_list(rbd_pool_t pool, char **names, size_t max_names) { - return rbd.create(pool, name, size); + std::vector cpp_names; + int r = rbd.list(pool, cpp_names); + if (r == -ENOENT) + return 0; + if (r < 0) + return r; + if (max_names < cpp_names.size()) + return -ERANGE; + + for (size_t i = 0; i < cpp_names.size(); i++) { + names[i] = strdup(cpp_names[i].c_str()); + if (!names[i]) + return -ENOMEM; + } + return cpp_names.size(); +} + +extern "C" int rbd_create(rbd_pool_t pool, const char *name, size_t size, int *order) +{ + return rbd.create(pool, name, size, order); } extern "C" int rbd_remove(rbd_pool_t pool, const char *name) @@ -1216,15 +1235,31 @@ extern "C" int rbd_remove(rbd_pool_t pool, const char *name) return rbd.remove(pool, name); } -extern "C" int rbd_resize(rbd_pool_t pool, const char *name, size_t size) +extern "C" int rbd_open_image(rbd_pool_t pool, const char *name, rbd_image_t *image) +{ + librbd::image_t cpp_image; + int r = rbd.open_image(pool, name, &cpp_image); + if (r < 0) + return r; + + *image = (rbd_image_t) cpp_image; + return 0; +} + +extern "C" int rbd_close_image(rbd_image_t image) +{ + return rbd.close_image(image); +} + +extern "C" int rbd_resize(rbd_image_t image, size_t size) { - return rbd.resize(pool, name, size); + return rbd.resize(image, size); } -extern "C" int rbd_stat(rbd_pool_t pool, const char *name, rbd_image_info_t *info) +extern "C" int rbd_stat(rbd_image_t image, rbd_image_info_t *info) { librbd::image_info_t cpp_info; - int r = rbd.stat(pool, name, cpp_info); + int r = rbd.stat(image, cpp_info); if (r < 0) return r; @@ -1235,46 +1270,26 @@ extern "C" int rbd_stat(rbd_pool_t pool, const char *name, rbd_image_info_t *inf return 0; } -extern "C" size_t rbd_list(rbd_pool_t pool, char **names, size_t max_names) -{ - std::vector cpp_names; - librbd::pool_t cpp_pool = (librbd::pool_t) pool; - int r = rbd.list(cpp_pool, cpp_names); - if (r == -ENOENT) - return 0; - if (r < 0) - return r; - if (max_names < cpp_names.size()) - return -ERANGE; - - for (size_t i = 0; i < cpp_names.size(); i++) { - names[i] = strdup(cpp_names[i].c_str()); - if (!names[i]) - return -ENOMEM; - } - return cpp_names.size(); -} - /* snapshots */ -extern "C" int rbd_create_snap(rbd_pool_t pool, const char *image, const char *snap_name) +extern "C" int rbd_create_snap(rbd_image_t image, const char *snap_name) { - return rbd.create_snap(pool, image, snap_name); + return rbd.create_snap(image, snap_name); } -extern "C" int rbd_remove_snap(rbd_pool_t pool, const char *image, const char *snap_name) +extern "C" int rbd_remove_snap(rbd_image_t image, const char *snap_name) { - return rbd.remove_snap(pool, image, snap_name); + return rbd.remove_snap(image, snap_name); } -extern "C" int rbd_rollback_snap(rbd_pool_t pool, const char *image, const char *snap_name) +extern "C" int rbd_rollback_snap(rbd_image_t image, const char *snap_name) { - return rbd.rollback_snap(pool, image, snap_name); + return rbd.rollback_snap(image, snap_name); } -extern "C" size_t rbd_list_snaps(rbd_pool_t pool, const char *image, rbd_snap_info_t *snaps, size_t max_snaps) +extern "C" size_t rbd_list_snaps(rbd_image_t image, rbd_snap_info_t *snaps, size_t max_snaps) { std::vector cpp_snaps; - int r = rbd.list_snaps(pool, image, cpp_snaps); + int r = rbd.list_snaps(image, cpp_snaps); if (r == -ENOENT) return 0; if (r < 0) @@ -1291,4 +1306,3 @@ extern "C" size_t rbd_list_snaps(rbd_pool_t pool, const char *image, rbd_snap_in } return cpp_snaps.size(); } -#endif diff --git a/src/testlibrbd.c b/src/testlibrbd.c index 53d7f851b6f7..9949437b8143 100644 --- a/src/testlibrbd.c +++ b/src/testlibrbd.c @@ -32,17 +32,22 @@ void test_create_and_stat(rbd_pool_t pool, const char *name, size_t size) { rbd_image_info_t info; - assert(rbd_create(pool, name, size) == 0); - assert(rbd_stat(pool, name, &info) == 0); + rbd_image_t image; + int order; + assert(rbd_create(pool, name, size, &order) == 0); + assert(rbd_open_image(pool, name, &image) == 0); + assert(rbd_stat(image, &info) == 0); printf("image has size %llu and order %d\n", (unsigned long long) info.size, info.order); assert(info.size == size); + assert(info.order == order); + assert(rbd_close_image(image) == 0); } -void test_resize_and_stat(rbd_pool_t pool, const char *name, size_t size) +void test_resize_and_stat(rbd_image_t image, size_t size) { rbd_image_info_t info; - assert(rbd_resize(pool, name, size) == 0); - assert(rbd_stat(pool, name, &info) == 0); + assert(rbd_resize(image, size) == 0); + assert(rbd_stat(image, &info) == 0); printf("image has size %llu and order %d\n", (unsigned long long) info.size, info.order); assert(info.size == size); } @@ -92,19 +97,19 @@ void test_delete(rbd_pool_t pool, const char *name) assert(rbd_remove(pool, name) == 0); } -void test_create_snap(rbd_pool_t pool, const char *image, const char *name) +void test_create_snap(rbd_image_t image, const char *name) { - assert(rbd_create_snap(pool, image, name) == 0); + assert(rbd_create_snap(image, name) == 0); } -void test_ls_snaps(rbd_pool_t pool, char *image, int num_expected, ...) +void test_ls_snaps(rbd_image_t image, int num_expected, ...) { rbd_snap_info_t *snaps; int num_snaps, i, j, expected_size; char *expected; va_list ap; snaps = (rbd_snap_info_t *) malloc(sizeof(rbd_snap_info_t *) * 10); - num_snaps = rbd_list_snaps(pool, image, snaps, 10); + num_snaps = rbd_list_snaps(image, snaps, 10); printf("num snaps is: %d\nexpected: %d\n", num_snaps, num_expected); assert(num_snaps == num_expected); @@ -138,29 +143,32 @@ void test_ls_snaps(rbd_pool_t pool, char *image, int num_expected, ...) free(snaps); } -void test_delete_snap(rbd_pool_t pool, const char *image, const char *name) +void test_delete_snap(rbd_image_t image, const char *name) { - assert(rbd_remove_snap(pool, image, name) == 0); + assert(rbd_remove_snap(image, name) == 0); } int main(int argc, const char **argv) { rbd_pool_t pool; + rbd_image_t image; assert(rbd_initialize(0, NULL) == 0); assert(rbd_open_pool(TEST_POOL, &pool) == 0); test_ls(pool, 0); test_create_and_stat(pool, TEST_IMAGE, MB_BYTES(1)); + assert(rbd_open_image(pool, TEST_IMAGE, &image) == 0); test_ls(pool, 1, TEST_IMAGE); - test_ls_snaps(pool, TEST_IMAGE, 0); - test_create_snap(pool, TEST_IMAGE, TEST_SNAP); - test_ls_snaps(pool, TEST_IMAGE, 1, TEST_SNAP, MB_BYTES(1)); - test_resize_and_stat(pool, TEST_IMAGE, MB_BYTES(2)); - test_create_snap(pool, TEST_IMAGE, TEST_SNAP "1"); - test_ls_snaps(pool, TEST_IMAGE, 2, TEST_SNAP, MB_BYTES(1), TEST_SNAP "1", MB_BYTES(2)); - test_delete_snap(pool, TEST_IMAGE, TEST_SNAP); - test_ls_snaps(pool, TEST_IMAGE, 1, TEST_SNAP "1", MB_BYTES(2)); - test_delete_snap(pool, TEST_IMAGE, TEST_SNAP "1"); - test_ls_snaps(pool, TEST_IMAGE, 0); + test_ls_snaps(image, 0); + test_create_snap(image, TEST_SNAP); + test_ls_snaps(image, 1, TEST_SNAP, MB_BYTES(1)); + test_resize_and_stat(image, MB_BYTES(2)); + test_create_snap(image, TEST_SNAP "1"); + test_ls_snaps(image, 2, TEST_SNAP, MB_BYTES(1), TEST_SNAP "1", MB_BYTES(2)); + test_delete_snap(image, TEST_SNAP); + test_ls_snaps(image, 1, TEST_SNAP "1", MB_BYTES(2)); + test_delete_snap(image, TEST_SNAP "1"); + test_ls_snaps(image, 0); + assert(rbd_close_image(image) == 0); test_create_and_stat(pool, TEST_IMAGE "1", MB_BYTES(2)); test_ls(pool, 2, TEST_IMAGE, TEST_IMAGE "1"); test_delete(pool, TEST_IMAGE);