Merge pull request #20343 from trociny/wip-rados-ordersnap

librados: add OPERATION_ORDERSNAP flag and yet another aio_operate method

Reviewed-by: Josh Durgin <jdurgin@redhat.com>
This commit is contained in:
Kefu Chai 2018-04-21 09:28:05 +08:00 committed by GitHub
commit 6b83d99e09
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 90 additions and 3 deletions

View File

@ -131,6 +131,7 @@ enum {
*/
LIBRADOS_OPERATION_FULL_FORCE = 128,
LIBRADOS_OPERATION_IGNORE_REDIRECT = 256,
LIBRADOS_OPERATION_ORDERSNAP = 512,
};
/** @} */

View File

@ -267,6 +267,7 @@ namespace librados
//mainly for delete
OPERATION_FULL_FORCE = LIBRADOS_OPERATION_FULL_FORCE,
OPERATION_IGNORE_REDIRECT = LIBRADOS_OPERATION_IGNORE_REDIRECT,
OPERATION_ORDERSNAP = LIBRADOS_OPERATION_ORDERSNAP,
};
/*
@ -1109,6 +1110,10 @@ namespace librados
ObjectWriteOperation *op, snap_t seq,
std::vector<snap_t>& snaps,
const blkin_trace_info *trace_info);
int aio_operate(const std::string& oid, AioCompletion *c,
ObjectWriteOperation *op, snap_t seq,
std::vector<snap_t>& snaps, int flags,
const blkin_trace_info *trace_info);
int aio_operate(const std::string& oid, AioCompletion *c,
ObjectReadOperation *op, bufferlist *pbl);

View File

@ -1502,6 +1502,8 @@ static int translate_flags(int flags)
op_flags |= CEPH_OSD_FLAG_FULL_FORCE;
if (flags & librados::OPERATION_IGNORE_REDIRECT)
op_flags |= CEPH_OSD_FLAG_IGNORE_REDIRECT;
if (flags & librados::OPERATION_ORDERSNAP)
op_flags |= CEPH_OSD_FLAG_ORDERSNAP;
return op_flags;
}
@ -1563,6 +1565,21 @@ int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
snapc, 0, trace_info);
}
int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
librados::ObjectWriteOperation *o,
snap_t snap_seq, std::vector<snap_t>& snaps, int flags,
const blkin_trace_info *trace_info)
{
object_t obj(oid);
vector<snapid_t> snv;
snv.resize(snaps.size());
for (size_t i = 0; i < snaps.size(); ++i)
snv[i] = snaps[i];
SnapContext snapc(snap_seq, snv);
return io_ctx_impl->aio_operate(obj, &o->impl->o, c->pc, snapc,
translate_flags(flags), trace_info);
}
int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
librados::ObjectReadOperation *o,
bufferlist *pbl)

View File

@ -1,3 +1,4 @@
#include "include/rados.h"
#include "include/rados/librados.hpp"
#include "test/librados/test.h"
#include "test/librados/TestCase.h"
@ -538,6 +539,62 @@ TEST_F(LibRadosSnapshotsSelfManagedPP, Bug11677) {
delete[] buf;
}
TEST_F(LibRadosSnapshotsSelfManagedPP, OrderSnap) {
std::vector<uint64_t> my_snaps;
char buf[bufsize];
memset(buf, 0xcc, sizeof(buf));
bufferlist bl;
bl.append(buf, sizeof(buf));
int flags = librados::OPERATION_ORDERSNAP;
my_snaps.push_back(-2);
ASSERT_EQ(0, ioctx.selfmanaged_snap_create(&my_snaps.back()));
::std::reverse(my_snaps.begin(), my_snaps.end());
ASSERT_EQ(0, ioctx.selfmanaged_snap_set_write_ctx(my_snaps[0], my_snaps));
::std::reverse(my_snaps.begin(), my_snaps.end());
ObjectWriteOperation op1;
op1.write(0, bl);
librados::AioCompletion *comp1 = cluster.aio_create_completion();
ASSERT_EQ(0, ioctx.aio_operate("foo", comp1, &op1, flags));
ASSERT_EQ(0, comp1->wait_for_complete());
ASSERT_EQ(0, comp1->get_return_value());
comp1->release();
my_snaps.push_back(-2);
ASSERT_EQ(0, ioctx.selfmanaged_snap_create(&my_snaps.back()));
::std::reverse(my_snaps.begin(), my_snaps.end());
ASSERT_EQ(0, ioctx.selfmanaged_snap_set_write_ctx(my_snaps[0], my_snaps));
::std::reverse(my_snaps.begin(), my_snaps.end());
ObjectWriteOperation op2;
op2.write(0, bl);
librados::AioCompletion *comp2 = cluster.aio_create_completion();
ASSERT_EQ(0, ioctx.aio_operate("foo", comp2, &op2, flags));
ASSERT_EQ(0, comp2->wait_for_complete());
ASSERT_EQ(0, comp2->get_return_value());
comp2->release();
my_snaps.pop_back();
::std::reverse(my_snaps.begin(), my_snaps.end());
ASSERT_EQ(0, ioctx.selfmanaged_snap_set_write_ctx(my_snaps[0], my_snaps));
::std::reverse(my_snaps.begin(), my_snaps.end());
ObjectWriteOperation op3;
op3.write(0, bl);
librados::AioCompletion *comp3 = cluster.aio_create_completion();
ASSERT_EQ(0, ioctx.aio_operate("foo", comp3, &op3, flags));
ASSERT_EQ(0, comp3->wait_for_complete());
ASSERT_EQ(-EOLDSNAPC, comp3->get_return_value());
comp3->release();
ObjectWriteOperation op4;
op4.write(0, bl);
librados::AioCompletion *comp4 = cluster.aio_create_completion();
ASSERT_EQ(0, ioctx.aio_operate("foo", comp4, &op4, 0));
ASSERT_EQ(0, comp4->wait_for_complete());
ASSERT_EQ(0, comp4->get_return_value());
comp4->release();
}
// EC testing
TEST_F(LibRadosSnapshotsEC, SnapList) {
char buf[bufsize];

View File

@ -421,7 +421,8 @@ int IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
int IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
ObjectWriteOperation *op, snap_t seq,
std::vector<snap_t>& snaps) {
std::vector<snap_t>& snaps, int flags,
const blkin_trace_info *trace_info) {
TestIoCtxImpl *ctx = reinterpret_cast<TestIoCtxImpl*>(io_ctx_impl);
TestObjectOperationImpl *ops = reinterpret_cast<TestObjectOperationImpl*>(op->impl);
@ -431,14 +432,20 @@ int IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
snv[i] = snaps[i];
SnapContext snapc(seq, snv);
return ctx->aio_operate(oid, *ops, c->pc, &snapc, 0);
return ctx->aio_operate(oid, *ops, c->pc, &snapc, flags);
}
int IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
ObjectWriteOperation *op, snap_t seq,
std::vector<snap_t>& snaps) {
return aio_operate(oid, c, op, seq, snaps, 0, nullptr);
}
int IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
ObjectWriteOperation *op, snap_t seq,
std::vector<snap_t>& snaps,
const blkin_trace_info *trace_info) {
return aio_operate(oid, c, op, seq, snaps);
return aio_operate(oid, c, op, seq, snaps, 0, trace_info);
}
int IoCtx::aio_remove(const std::string& oid, AioCompletion *c) {