-
- IO操作
- 4.1 创建IO Context
io操作需要先创建ioctx,并指定要针对哪个pool进行IO操作。一个rados可以创建多个ioctx
ret = rados.ioctx_create(pool_name, io_ctx);
- 4.2 写对象
所有数据在写之前需要先将数据序列化为bufferlist,然后调用ioctx的write函数,写入对象时会指定对象的名称oid。
librados::bufferlist bl;
std::string hello("hello world!");
bl.append(hello);
ret = io_ctx.write_full(“hello”, bl);
同时还支持,在某个位置写入特定长度,以及附加写
int write(const std::string& oid, bufferlist& bl, size_t len, uint64_t off);
int append(const std::string& oid, bufferlist& bl, size_t len);
- 4.3 读对象
这个例子中采用异步读,首先准备一个读缓存区,创建一个读完成处理的对象,执行异步读。
等待读完成,获取返回值。从缓存区可以取出读取的内容。
librados::bufferlist read_buf;
int read_len = 4194304;
librados::AioCompletion *read_completion = librados::Rados::aio_create_completion();
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();
std::string read_string;
read_buf.copy(0, ret, read_string);
rados也支持同步读
int read(const std::string& oid, bufferlist& bl, size_t len, uint64_t off);
- 4.4 xattr 读写
可以对对象的xattr进行读写
librados::bufferlist version_bl;
version_bl.append('1');
ret = io_ctx.setxattr(object_name, "version", version_bl);
- 4.5 可以将多个内容作为一个原子操作一起提交
同时将对象data和xattr内容一起提交
librados::bufferlist bl;
bl.append(hello);
bl.append("v2");
librados::ObjectWriteOperation write_op;
write_op.write_full(bl);
librados::bufferlist version_bl;
version_bl.append('2');
write_op.setxattr("version", version_bl);
ret = io_ctx.operate(object_name, &write_op);
可以在写入前检查对象的版本,从而实现CAS的功能。即写入对象前判断对象是否已经被更新。
librados::ObjectWriteOperation failed_write_op;
librados::bufferlist bl;
bl.append(hello);
bl.append("v2");
librados::ObjectWriteOperation write_op;
write_op.write_full(bl);
librados::bufferlist version_bl;
version_bl.append('2');
librados::bufferlist old_version_bl;
old_version_bl.append('1');
failed_write_op.cmpxattr("version", LIBRADOS_CMPXATTR_OP_EQ, old_version_bl);
failed_write_op.write_full(bl);
failed_write_op.setxattr("version", version_bl);
ret = io_ctx.operate(object_name, &failed_write_op);
- 条带化操作