X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Ftest%2Fjournal%2FRadosTestFixture.cc;fp=src%2Fceph%2Fsrc%2Ftest%2Fjournal%2FRadosTestFixture.cc;h=1c4ed84075ed1f16d8ec5e8d8918f2d1ed941f39;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/test/journal/RadosTestFixture.cc b/src/ceph/src/test/journal/RadosTestFixture.cc new file mode 100644 index 0000000..1c4ed84 --- /dev/null +++ b/src/ceph/src/test/journal/RadosTestFixture.cc @@ -0,0 +1,133 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "test/journal/RadosTestFixture.h" +#include "cls/journal/cls_journal_client.h" +#include "include/stringify.h" +#include "common/WorkQueue.h" +#include "journal/Settings.h" + +RadosTestFixture::RadosTestFixture() + : m_timer_lock("m_timer_lock"), m_timer(NULL), m_listener(this) { +} + +void RadosTestFixture::SetUpTestCase() { + _pool_name = get_temp_pool_name(); + ASSERT_EQ("", create_one_pool_pp(_pool_name, _rados)); + + CephContext* cct = reinterpret_cast(_rados.cct()); + _thread_pool = new ThreadPool(cct, "RadosTestFixture::_thread_pool", + "tp_test", 1); + _thread_pool->start(); +} + +void RadosTestFixture::TearDownTestCase() { + _thread_pool->stop(); + delete _thread_pool; + + ASSERT_EQ(0, destroy_one_pool_pp(_pool_name, _rados)); +} + +std::string RadosTestFixture::get_temp_oid() { + ++_oid_number; + return "oid" + stringify(_oid_number); +} + +void RadosTestFixture::SetUp() { + ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), m_ioctx)); + + CephContext* cct = reinterpret_cast(m_ioctx.cct()); + m_work_queue = new ContextWQ("RadosTestFixture::m_work_queue", 60, + _thread_pool); + + m_timer = new SafeTimer(cct, m_timer_lock, true); + m_timer->init(); +} + +void RadosTestFixture::TearDown() { + for (auto metadata : m_metadatas) { + C_SaferCond ctx; + metadata->shut_down(&ctx); + ASSERT_EQ(0, ctx.wait()); + } + + { + Mutex::Locker locker(m_timer_lock); + m_timer->shutdown(); + } + delete m_timer; + + m_work_queue->drain(); + delete m_work_queue; +} + +int RadosTestFixture::create(const std::string &oid, uint8_t order, + uint8_t splay_width) { + return cls::journal::client::create(m_ioctx, oid, order, splay_width, -1); +} + +journal::JournalMetadataPtr RadosTestFixture::create_metadata( + const std::string &oid, const std::string &client_id, + double commit_interval, uint64_t max_fetch_bytes, + int max_concurrent_object_sets) { + journal::Settings settings; + settings.commit_interval = commit_interval; + settings.max_fetch_bytes = max_fetch_bytes; + settings.max_concurrent_object_sets = max_concurrent_object_sets; + + journal::JournalMetadataPtr metadata(new journal::JournalMetadata( + m_work_queue, m_timer, &m_timer_lock, m_ioctx, oid, client_id, settings)); + m_metadatas.push_back(metadata); + return metadata; +} + +int RadosTestFixture::append(const std::string &oid, const bufferlist &bl) { + librados::ObjectWriteOperation op; + op.append(bl); + return m_ioctx.operate(oid, &op); +} + +int RadosTestFixture::client_register(const std::string &oid, + const std::string &id, + const std::string &description) { + bufferlist data; + data.append(description); + return cls::journal::client::client_register(m_ioctx, oid, id, data); +} + +int RadosTestFixture::client_commit(const std::string &oid, + const std::string &id, + const cls::journal::ObjectSetPosition &commit_position) { + librados::ObjectWriteOperation op; + cls::journal::client::client_commit(&op, id, commit_position); + return m_ioctx.operate(oid, &op); +} + +bufferlist RadosTestFixture::create_payload(const std::string &payload) { + bufferlist bl; + bl.append(payload); + return bl; +} + +int RadosTestFixture::init_metadata(journal::JournalMetadataPtr metadata) { + C_SaferCond cond; + metadata->init(&cond); + return cond.wait(); +} + +bool RadosTestFixture::wait_for_update(journal::JournalMetadataPtr metadata) { + Mutex::Locker locker(m_listener.mutex); + while (m_listener.updates[metadata.get()] == 0) { + if (m_listener.cond.WaitInterval( + m_listener.mutex, utime_t(10, 0)) != 0) { + return false; + } + } + --m_listener.updates[metadata.get()]; + return true; +} + +std::string RadosTestFixture::_pool_name; +librados::Rados RadosTestFixture::_rados; +uint64_t RadosTestFixture::_oid_number = 0; +ThreadPool *RadosTestFixture::_thread_pool = nullptr;