return error.value_or(0);
}
-int RadosWriter::set_stripe_obj(rgw_raw_obj&& obj)
+int RadosWriter::set_stripe_obj(rgw_raw_obj&& raw_obj)
{
- rgw_rados_ref ref;
- int r = store->get_raw_obj_ref(obj, &ref);
- if (r < 0) {
- return r;
- }
- stripe_obj = std::move(obj);
- stripe_ref = std::move(ref);
- return 0;
+ stripe_raw = std::move(raw_obj);
+ stripe_obj = store->svc.rados->obj(stripe_raw);
+ return stripe_obj.open();
}
int RadosWriter::process(bufferlist&& bl, uint64_t offset)
} else {
op.write(offset, data);
}
- auto c = aio->submit(stripe_ref, stripe_obj, &op, cost);
+ auto c = aio->submit(stripe_obj, stripe_raw, &op, cost);
return process_completed(c, &written);
}
op.create(true); // exclusive create
op.write_full(data);
- auto c = aio->submit(stripe_ref, stripe_obj, &op, cost);
+ auto c = aio->submit(stripe_obj, stripe_raw, &op, cost);
auto d = aio->drain();
c.splice(c.end(), d);
return process_completed(c, &written);
}
}
-ResultList AioThrottle::submit(rgw_rados_ref& ref, const rgw_raw_obj& obj,
+ResultList AioThrottle::submit(RGWSI_RADOS::Obj& obj,
+ const rgw_raw_obj& raw_obj,
librados::ObjectWriteOperation *op,
uint64_t cost)
{
auto p = std::make_unique<Pending>();
- p->obj = obj;
+ p->obj = raw_obj;
p->cost = cost;
if (cost > window) {
completed.push_back(*p);
} else {
get(*p);
- p->result = ref.ioctx.aio_operate(ref.oid, p->completion, op);
+ p->result = obj.aio_operate(p->completion, op);
if (p->result < 0) {
put(*p);
}
return std::move(completed);
}
-ResultList AioThrottle::submit(rgw_rados_ref& ref, const rgw_raw_obj& obj,
+ResultList AioThrottle::submit(RGWSI_RADOS::Obj& obj,
+ const rgw_raw_obj& raw_obj,
librados::ObjectReadOperation *op,
bufferlist *data, uint64_t cost)
{
auto p = std::make_unique<Pending>();
- p->obj = obj;
+ p->obj = raw_obj;
p->cost = cost;
if (cost > window) {
completed.push_back(*p);
} else {
get(*p);
- p->result = ref.ioctx.aio_operate(ref.oid, p->completion, op, data);
+ p->result = obj.aio_operate(p->completion, op, data);
if (p->result < 0) {
put(*p);
}
#include <memory>
#include "common/ceph_mutex.h"
+#include "services/svc_rados.h"
#include "rgw_putobj_aio.h"
namespace librados {
ceph_assert(completed.empty());
}
- ResultList submit(rgw_rados_ref& ref, const rgw_raw_obj& obj,
- librados::ObjectReadOperation *op, bufferlist *data,
- uint64_t cost) override;
+ ResultList submit(RGWSI_RADOS::Obj& obj, const rgw_raw_obj& raw_obj,
+ librados::ObjectReadOperation *op,
+ bufferlist *data, uint64_t cost) override;
- ResultList submit(rgw_rados_ref& ref, const rgw_raw_obj& obj,
- librados::ObjectWriteOperation *op, uint64_t cost) override;
+ ResultList submit(RGWSI_RADOS::Obj& obj, const rgw_raw_obj& raw_obj,
+ librados::ObjectWriteOperation *op,
+ uint64_t cost) override;
ResultList poll() override;
public:
static constexpr auto poolname = "ceph_test_rgw_throttle";
- static librados::Rados rados;
- static librados::IoCtx io;
+ static std::optional<RGWSI_RADOS> rados;
void SetUp() override {
- ASSERT_EQ(0, rados.init_with_context(g_ceph_context));
- ASSERT_EQ(0, rados.connect());
- // open/create test pool
- int r = rados.ioctx_create(poolname, io);
- if (r == -ENOENT) {
- r = rados.pool_create(poolname);
- if (r == -EEXIST) {
- r = 0;
- } else if (r == 0) {
- r = rados.ioctx_create(poolname, io);
- }
- }
+ rados.emplace(g_ceph_context);
+ ASSERT_EQ(0, rados->start());
+ int r = rados->pool({poolname}).create();
+ if (r == -EEXIST)
+ r = 0;
ASSERT_EQ(0, r);
}
void TearDown() {
- rados.shutdown();
+ rados.reset();
}
};
-librados::Rados RadosEnv::rados;
-librados::IoCtx RadosEnv::io;
+std::optional<RGWSI_RADOS> RadosEnv::rados;
auto *const rados_env = ::testing::AddGlobalTestEnvironment(new RadosEnv);
// test fixture for global setup/teardown
class RadosFixture : public ::testing::Test {
protected:
- librados::IoCtx& io;
-
- rgw_raw_obj make_obj(const std::string& oid) {
+ rgw_raw_obj make_raw_obj(const std::string& oid) {
return {{RadosEnv::poolname}, oid};
}
- rgw_rados_ref make_ref(const rgw_raw_obj& obj) {
- return {obj.pool, obj.oid, "", io};
+ RGWSI_RADOS::Obj make_obj(const rgw_raw_obj& raw) {
+ auto obj = RadosEnv::rados->obj(raw);
+ ceph_assert_always(0 == obj.open());
+ return obj;
}
- public:
- RadosFixture() : io(RadosEnv::io) {}
};
using PutObj_Throttle = RadosFixture;
TEST_F(PutObj_Throttle, NoThrottleUpToMax)
{
AioThrottle throttle(4);
- auto obj = make_obj(__PRETTY_FUNCTION__);
- auto ref = make_ref(obj);
+ auto raw = make_raw_obj(__PRETTY_FUNCTION__);
+ auto obj = make_obj(raw);
{
librados::ObjectWriteOperation op1;
- auto c1 = throttle.submit(ref, obj, &op1, 1);
+ auto c1 = throttle.submit(obj, raw, &op1, 1);
EXPECT_TRUE(c1.empty());
librados::ObjectWriteOperation op2;
- auto c2 = throttle.submit(ref, obj, &op2, 1);
+ auto c2 = throttle.submit(obj, raw, &op2, 1);
EXPECT_TRUE(c2.empty());
librados::ObjectWriteOperation op3;
- auto c3 = throttle.submit(ref, obj, &op3, 1);
+ auto c3 = throttle.submit(obj, raw, &op3, 1);
EXPECT_TRUE(c3.empty());
librados::ObjectWriteOperation op4;
- auto c4 = throttle.submit(ref, obj, &op4, 1);
+ auto c4 = throttle.submit(obj, raw, &op4, 1);
EXPECT_TRUE(c4.empty());
// no completions because no ops had to wait
auto c5 = throttle.poll();
auto completions = throttle.drain();
ASSERT_EQ(4u, completions.size());
for (auto& c : completions) {
- EXPECT_EQ(Result({obj, -EINVAL}), c);
+ EXPECT_EQ(Result({raw, -EINVAL}), c);
}
}
TEST_F(PutObj_Throttle, CostOverWindow)
{
AioThrottle throttle(4);
- auto obj = make_obj(__PRETTY_FUNCTION__);
- auto ref = make_ref(obj);
+ auto raw = make_raw_obj(__PRETTY_FUNCTION__);
+ auto obj = make_obj(raw);
librados::ObjectWriteOperation op;
- auto c = throttle.submit(ref, obj, &op, 8);
+ auto c = throttle.submit(obj, raw, &op, 8);
ASSERT_EQ(1u, c.size());
- EXPECT_EQ(Result({obj, -EDEADLK}), c.front());
+ EXPECT_EQ(Result({raw, -EDEADLK}), c.front());
}
TEST_F(PutObj_Throttle, AioThrottleOverMax)
constexpr uint64_t window = 4;
AioThrottle throttle(window);
- auto obj = make_obj(__PRETTY_FUNCTION__);
- auto ref = make_ref(obj);
+ auto raw = make_raw_obj(__PRETTY_FUNCTION__);
+ auto obj = make_obj(raw);
// issue 32 writes, and verify that max_outstanding <= window
constexpr uint64_t total = 32;
for (uint64_t i = 0; i < total; i++) {
librados::ObjectWriteOperation op;
- auto c = throttle.submit(ref, obj, &op, 1);
+ auto c = throttle.submit(obj, raw, &op, 1);
outstanding++;
outstanding -= c.size();
if (max_outstanding < outstanding) {