1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "test/journal/RadosTestFixture.h"
5 #include "cls/journal/cls_journal_client.h"
6 #include "include/stringify.h"
7 #include "common/WorkQueue.h"
8 #include "journal/Settings.h"
10 RadosTestFixture::RadosTestFixture()
11 : m_timer_lock("m_timer_lock"), m_timer(NULL), m_listener(this) {
14 void RadosTestFixture::SetUpTestCase() {
15 _pool_name = get_temp_pool_name();
16 ASSERT_EQ("", create_one_pool_pp(_pool_name, _rados));
18 CephContext* cct = reinterpret_cast<CephContext*>(_rados.cct());
19 _thread_pool = new ThreadPool(cct, "RadosTestFixture::_thread_pool",
21 _thread_pool->start();
24 void RadosTestFixture::TearDownTestCase() {
28 ASSERT_EQ(0, destroy_one_pool_pp(_pool_name, _rados));
31 std::string RadosTestFixture::get_temp_oid() {
33 return "oid" + stringify(_oid_number);
36 void RadosTestFixture::SetUp() {
37 ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), m_ioctx));
39 CephContext* cct = reinterpret_cast<CephContext*>(m_ioctx.cct());
40 m_work_queue = new ContextWQ("RadosTestFixture::m_work_queue", 60,
43 m_timer = new SafeTimer(cct, m_timer_lock, true);
47 void RadosTestFixture::TearDown() {
48 for (auto metadata : m_metadatas) {
50 metadata->shut_down(&ctx);
51 ASSERT_EQ(0, ctx.wait());
55 Mutex::Locker locker(m_timer_lock);
60 m_work_queue->drain();
64 int RadosTestFixture::create(const std::string &oid, uint8_t order,
65 uint8_t splay_width) {
66 return cls::journal::client::create(m_ioctx, oid, order, splay_width, -1);
69 journal::JournalMetadataPtr RadosTestFixture::create_metadata(
70 const std::string &oid, const std::string &client_id,
71 double commit_interval, uint64_t max_fetch_bytes,
72 int max_concurrent_object_sets) {
73 journal::Settings settings;
74 settings.commit_interval = commit_interval;
75 settings.max_fetch_bytes = max_fetch_bytes;
76 settings.max_concurrent_object_sets = max_concurrent_object_sets;
78 journal::JournalMetadataPtr metadata(new journal::JournalMetadata(
79 m_work_queue, m_timer, &m_timer_lock, m_ioctx, oid, client_id, settings));
80 m_metadatas.push_back(metadata);
84 int RadosTestFixture::append(const std::string &oid, const bufferlist &bl) {
85 librados::ObjectWriteOperation op;
87 return m_ioctx.operate(oid, &op);
90 int RadosTestFixture::client_register(const std::string &oid,
91 const std::string &id,
92 const std::string &description) {
94 data.append(description);
95 return cls::journal::client::client_register(m_ioctx, oid, id, data);
98 int RadosTestFixture::client_commit(const std::string &oid,
99 const std::string &id,
100 const cls::journal::ObjectSetPosition &commit_position) {
101 librados::ObjectWriteOperation op;
102 cls::journal::client::client_commit(&op, id, commit_position);
103 return m_ioctx.operate(oid, &op);
106 bufferlist RadosTestFixture::create_payload(const std::string &payload) {
112 int RadosTestFixture::init_metadata(journal::JournalMetadataPtr metadata) {
114 metadata->init(&cond);
118 bool RadosTestFixture::wait_for_update(journal::JournalMetadataPtr metadata) {
119 Mutex::Locker locker(m_listener.mutex);
120 while (m_listener.updates[metadata.get()] == 0) {
121 if (m_listener.cond.WaitInterval(
122 m_listener.mutex, utime_t(10, 0)) != 0) {
126 --m_listener.updates[metadata.get()];
130 std::string RadosTestFixture::_pool_name;
131 librados::Rados RadosTestFixture::_rados;
132 uint64_t RadosTestFixture::_oid_number = 0;
133 ThreadPool *RadosTestFixture::_thread_pool = nullptr;