move rbd image while freeing old one
commit
04502c29f6
|
@ -0,0 +1,3 @@
|
|||
all: rbd-move
|
||||
rbd-move: rbd-move.c
|
||||
gcc -g -o rbd-move -lrbd -lrados rbd-move.c
|
|
@ -0,0 +1,115 @@
|
|||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#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;
|
||||
}
|
Loading…
Reference in New Issue