ceph学习笔记

发布时间 2023-03-26 21:34:20作者: 玉北

基于hello_world.cc的IO流程

// 创建rados对象
librados::Rados rados;

// 初始化rados对象
ret = rados.init("admin");

// 读取配置文件,-c 或 --config后接配置文件
ret = rados.conf_parse_argv(argc, argv);
ret = rados.conf_read_file(argv[i+1]);

// 连接redos cluster
ret = rados.connect();

// 创建pool
const char *pool_name = "hello_world_pool";

ret = rados.pool_create(pool_name);

// 创建pool的ioCtx
librados::IoCtx io_ctx;

ret = rados.ioctx_create(pool_name, io_ctx);

// 通过ioCtx写入指定对象
librados::bufferlist bl;
std::string hello("hello world!");
std::string object_name("hello_object");

bl.append(hello);
ret = io_ctx.write_full(object_name, bl);

// 通过ioCtx异步读出指定对象
std::string object_name("hello_object");
librados::bufferlist read_buf;
int read_len = 4194304; // this is way more than we need
librados::AioCompletion *read_completion = librados::Rados::aio_create_completion();
std::string read_string; // 保存读取的结果

ret = io_ctx.aio_read(object_name, read_completion, &read_buf, read_len, 0);
read_completion->wait_for_complete(); // 等待读取结束
ret = read_completion->get_return_value(); // 获取读取到的字符长度
read_buf.begin().copy(ret, read_string); // 从缓存转移到读取结果中

// setxattr
librados::ObjectWriteOperation write_op;
librados::bufferlist version_bl;

version_bl.append('2');
write_op.setxattr("version", version_bl); // 设置attr中version的值
ret = io_ctx.operate(object_name, &write_op); // 执行write op