mirror of
https://github.com/ceph/ceph
synced 2025-02-23 02:57:21 +00:00
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:
commit
6b83d99e09
@ -131,6 +131,7 @@ enum {
|
||||
*/
|
||||
LIBRADOS_OPERATION_FULL_FORCE = 128,
|
||||
LIBRADOS_OPERATION_IGNORE_REDIRECT = 256,
|
||||
LIBRADOS_OPERATION_ORDERSNAP = 512,
|
||||
};
|
||||
/** @} */
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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];
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user