From 04502c29f6892a39adcacfd844f46667ef8e6e4b Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Tue, 19 Feb 2019 17:01:50 +0300 Subject: [PATCH] move rbd image while freeing old one --- Makefile | 3 ++ rbd-move.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 Makefile create mode 100644 rbd-move.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8bf9623 --- /dev/null +++ b/Makefile @@ -0,0 +1,3 @@ +all: rbd-move +rbd-move: rbd-move.c + gcc -g -o rbd-move -lrbd -lrados rbd-move.c diff --git a/rbd-move.c b/rbd-move.c new file mode 100644 index 0000000..983537e --- /dev/null +++ b/rbd-move.c @@ -0,0 +1,115 @@ +#include +#include +#include +#include "rados/librados.h" +#include "rbd/librbd.h" + +struct rbd_move_data +{ + rbd_image_t src; + rbd_image_t dst; +}; + +int move_extent(uint64_t offset, size_t len, const char *buf, void* data_ptr) +{ + struct rbd_move_data* data = (struct rbd_move_data*)data_ptr; + if (buf != NULL) + { + int err; + err = rbd_write2(data->dst, offset, len, buf, LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL); + if (err < 0) + return err; + err = rbd_discard(data->src, offset, len); + if (err < 0) + return err; + } + return 0; +} + +void rbd_move(rbd_image_t src, rbd_image_t dst, uint64_t size) +{ + struct rbd_move_data data = { + src, + dst, + }; + rbd_read_iterate2(src, 0, size, move_extent, &data); +} + +int main(int argc, char **argv) +{ + char *pool_name = "rpool"; + char *src_img = "one-1-49-1"; + char *dst_img = "one-1-49-1-ec"; + int err; + int st; + rados_t cluster; + rados_ioctx_t io; + rbd_image_t src, dst; + uint64_t size; + err = rados_create(&cluster, NULL); + if (err < 0) + { + fprintf(stderr, "%s: cannot create a cluster handle: %s\n", argv[0], strerror(-err)); + st = 1; + } + else + { + err = rados_conf_read_file(cluster, "/etc/ceph/ceph.conf"); + if (err < 0) + { + fprintf(stderr, "%s: cannot read config file: %s\n", argv[0], strerror(-err)); + st = 1; + } + else + { + err = rados_connect(cluster); + if (err < 0) + { + fprintf(stderr, "%s: cannot connect to cluster: %s\n", argv[0], strerror(-err)); + st = 1; + } + else + { + err = rados_ioctx_create(cluster, pool_name, &io); + if (err < 0) + { + fprintf(stderr, "%s: cannot open rados pool %s: %s\n", argv[0], pool_name, strerror(-err)); + st = 1; + } + else + { + err = rbd_open(io, src_img, &src, NULL); + if (err < 0) + { + fprintf(stderr, "%s: cannot open image %s/%s: %s\n", argv[0], pool_name, src_img, strerror(-err)); + st = 1; + } + else + { + err = rbd_open(io, dst_img, &dst, NULL); + if (err < 0) + { + fprintf(stderr, "%s: cannot open image %s/%s: %s\n", argv[0], pool_name, dst_img, strerror(-err)); + st = 1; + } + else + { + err = rbd_get_size(src, &size); + if (err < 0) + { + fprintf(stderr, "%s: cannot stat %s/%s: %s\n", argv[0], pool_name, src_img, strerror(-err)); + st = 1; + } + rbd_move(src, dst, size); + rbd_close(dst); + } + rbd_close(src); + } + rados_ioctx_destroy(io); + } + rados_shutdown(cluster); + } + } + } + return st; +}