Mutex *timer_lock, librados::IoCtx &ioctx,
const std::string &oid,
const std::string &client_id,
- double commit_interval)
+ const Settings &settings)
: RefCountedObject(NULL, 0), m_cct(NULL), m_oid(oid),
- m_client_id(client_id), m_commit_interval(commit_interval), m_order(0),
+ m_client_id(client_id), m_settings(settings), m_order(0),
m_splay_width(0), m_pool_id(-1), m_initialized(false),
m_work_queue(work_queue), m_timer(timer), m_timer_lock(timer_lock),
m_lock("JournalMetadata::m_lock"), m_commit_tid(0), m_watch_ctx(this),
assert(m_commit_position_ctx != nullptr);
if (m_commit_position_task_ctx == NULL) {
m_commit_position_task_ctx = new C_CommitPositionTask(this);
- m_timer->add_event_after(m_commit_interval, m_commit_position_task_ctx);
+ m_timer->add_event_after(m_settings.commit_interval,
+ m_commit_position_task_ctx);
}
}
<< "active_set=" << jm.m_active_set << ", "
<< "client_id=" << jm.m_client_id << ", "
<< "commit_tid=" << jm.m_commit_tid << ", "
- << "commit_interval=" << jm.m_commit_interval << ", "
+ << "commit_interval=" << jm.m_settings.commit_interval << ", "
<< "commit_position=" << jm.m_commit_position << ", "
<< "registered_clients=" << jm.m_registered_clients << "]";
return os;
#include "cls/journal/cls_journal_types.h"
#include "journal/AsyncOpTracker.h"
#include "journal/JournalMetadataListener.h"
+#include "journal/Settings.h"
#include <boost/intrusive_ptr.hpp>
#include <boost/noncopyable.hpp>
#include <boost/optional.hpp>
JournalMetadata(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock,
librados::IoCtx &ioctx, const std::string &oid,
- const std::string &client_id, double commit_interval);
+ const std::string &client_id, const Settings &settings);
~JournalMetadata();
void init(Context *on_init);
CephContext *m_cct;
std::string m_oid;
std::string m_client_id;
- double m_commit_interval;
+ Settings m_settings;
uint8_t m_order;
uint8_t m_splay_width;
Journaler::Journaler(librados::IoCtx &header_ioctx,
const std::string &journal_id,
- const std::string &client_id, double commit_interval)
+ const std::string &client_id, const Settings &settings)
: m_threads(new Threads(reinterpret_cast<CephContext*>(header_ioctx.cct()))),
m_client_id(client_id) {
set_up(m_threads->work_queue, m_threads->timer, &m_threads->timer_lock,
- header_ioctx, journal_id, commit_interval);
+ header_ioctx, journal_id, settings);
}
Journaler::Journaler(ContextWQ *work_queue, SafeTimer *timer,
Mutex *timer_lock, librados::IoCtx &header_ioctx,
const std::string &journal_id,
- const std::string &client_id, double commit_interval)
+ const std::string &client_id, const Settings &settings)
: m_client_id(client_id) {
set_up(work_queue, timer, timer_lock, header_ioctx, journal_id,
- commit_interval);
+ settings);
}
void Journaler::set_up(ContextWQ *work_queue, SafeTimer *timer,
Mutex *timer_lock, librados::IoCtx &header_ioctx,
- const std::string &journal_id, double commit_interval) {
+ const std::string &journal_id,
+ const Settings &settings) {
m_header_ioctx.dup(header_ioctx);
m_cct = reinterpret_cast<CephContext *>(m_header_ioctx.cct());
m_metadata = new JournalMetadata(work_queue, timer, timer_lock,
m_header_ioctx, m_header_oid, m_client_id,
- commit_interval);
+ settings);
m_metadata->get();
}
class JournalTrimmer;
class ReplayEntry;
class ReplayHandler;
+class Settings;
class Journaler {
public:
const std::string &journal_id);
Journaler(librados::IoCtx &header_ioctx, const std::string &journal_id,
- const std::string &client_id, double commit_interval);
+ const std::string &client_id, const Settings &settings);
Journaler(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock,
librados::IoCtx &header_ioctx, const std::string &journal_id,
- const std::string &client_id, double commit_interval);
+ const std::string &client_id, const Settings &settings);
~Journaler();
int exists(bool *header_exists) const;
void set_up(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock,
librados::IoCtx &header_ioctx, const std::string &journal_id,
- double commit_interval);
+ const Settings &settings);
int init_complete();
void create_player(ReplayHandler *replay_handler);
journal/ObjectRecorder.h \
journal/ReplayEntry.h \
journal/ReplayHandler.h \
+ journal/Settings.h \
journal/Utils.h
DENCODER_DEPS += libjournal.la
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_JOURNAL_SETTINGS_H
+#define CEPH_JOURNAL_SETTINGS_H
+
+#include "include/int_types.h"
+
+namespace journal {
+
+struct Settings {
+ double commit_interval = 5; ///< commit position throttle (in secs)
+};
+
+} // namespace journal
+
+#endif // # CEPH_JOURNAL_SETTINGS_H
#include "cls/journal/cls_journal_types.h"
#include "journal/Journaler.h"
#include "journal/ReplayEntry.h"
+#include "journal/Settings.h"
#include "common/errno.h"
#include "common/Timer.h"
#include "common/WorkQueue.h"
pool_id = data_io_ctx.get_id();
}
- Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID,
- cct->_conf->rbd_journal_commit_age);
+ Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID, {});
int r = journaler.create(order, splay_width, pool_id);
if (r < 0) {
CephContext *cct = reinterpret_cast<CephContext *>(io_ctx.cct());
ldout(cct, 5) << __func__ << ": image=" << image_id << dendl;
- Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID,
- cct->_conf->rbd_journal_commit_age);
+ Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID, {});
bool journal_exists;
int r = journaler.exists(&journal_exists);
CephContext *cct = reinterpret_cast<CephContext *>(io_ctx.cct());
ldout(cct, 5) << __func__ << ": image=" << image_id << dendl;
- Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID,
- cct->_conf->rbd_journal_commit_age);
+ Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID, {});
C_SaferCond cond;
journaler.init(&cond);
CephContext *cct = (CephContext *)io_ctx.cct();
ldout(cct, 20) << __func__ << dendl;
- Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID,
- cct->_conf->rbd_journal_commit_age);
+ Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID, {});
cls::journal::Client client;
journal::ImageClientMeta client_meta;
CephContext *cct = image_ctx->cct;
ldout(cct, 20) << __func__ << dendl;
- Journaler journaler(image_ctx->md_ctx, image_ctx->id, IMAGE_CLIENT_ID,
- image_ctx->cct->_conf->rbd_journal_commit_age);
+ Journaler journaler(image_ctx->md_ctx, image_ctx->id, IMAGE_CLIENT_ID, {});
cls::journal::Client client;
journal::ImageClientMeta client_meta;
CephContext *cct = image_ctx->cct;
ldout(cct, 20) << __func__ << dendl;
- Journaler journaler(image_ctx->md_ctx, image_ctx->id, IMAGE_CLIENT_ID,
- image_ctx->cct->_conf->rbd_journal_commit_age);
+ Journaler journaler(image_ctx->md_ctx, image_ctx->id, IMAGE_CLIENT_ID, {});
cls::journal::Client client;
journal::ImageClientMeta client_meta;
assert(m_journaler == NULL);
transition_state(STATE_INITIALIZING, 0);
+ ::journal::Settings settings;
+ settings.commit_interval = m_image_ctx.journal_commit_age;
+
m_journaler = new Journaler(m_work_queue, m_timer, m_timer_lock,
m_image_ctx.md_ctx, m_image_ctx.id,
- IMAGE_CLIENT_ID, m_image_ctx.journal_commit_age);
+ IMAGE_CLIENT_ID, settings);
m_journaler->init(create_async_context_callback(
m_image_ctx, create_context_callback<
Journal<I>, &Journal<I>::handle_initialized>(this)));
#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) {
journal::JournalMetadataPtr RadosTestFixture::create_metadata(
const std::string &oid, const std::string &client_id,
- double commit_internal) {
+ double commit_interval) {
+ journal::Settings settings;
+ settings.commit_interval = commit_interval;
+
journal::JournalMetadataPtr metadata(new journal::JournalMetadata(
- m_work_queue, m_timer, &m_timer_lock, m_ioctx, oid, client_id,
- commit_internal));
+ m_work_queue, m_timer, &m_timer_lock, m_ioctx, oid, client_id, settings));
m_metadatas.push_back(metadata);
return metadata;
}
namespace journal {
struct ReplayHandler;
+struct Settings;
struct MockFuture {
static MockFuture *s_instance;
struct MockJournalerProxy {
template <typename IoCtxT>
MockJournalerProxy(IoCtxT &header_ioctx, const std::string &,
- const std::string &, double) {
+ const std::string &, const Settings&) {
MockJournaler::get_instance().construct();
}
MockJournalerProxy(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock,
librados::IoCtx &header_ioctx, const std::string &journal_id,
- const std::string &client_id, double commit_interval) {
+ const std::string &client_id, const Settings&) {
MockJournaler::get_instance().construct();
}
// vim: ts=8 sw=2 smarttab
#include "journal/Journaler.h"
+#include "journal/Settings.h"
#include "include/stringify.h"
#include "gtest/gtest.h"
#include "test/librados/test.h"
RadosTestFixture::SetUp();
m_journal_id = get_temp_journal_id();
m_journaler = new journal::Journaler(m_work_queue, m_timer, &m_timer_lock,
- m_ioctx, m_journal_id, CLIENT_ID, 5);
+ m_ioctx, m_journal_id, CLIENT_ID, {});
}
virtual void TearDown() {
int register_client(const std::string &client_id, const std::string &desc) {
journal::Journaler journaler(m_work_queue, m_timer, &m_timer_lock,
- m_ioctx, m_journal_id, client_id, 5);
+ m_ioctx, m_journal_id, client_id, {});
bufferlist data;
data.append(desc);
C_SaferCond cond;
int update_client(const std::string &client_id, const std::string &desc) {
journal::Journaler journaler(m_work_queue, m_timer, &m_timer_lock,
- m_ioctx, m_journal_id, client_id, 5);
+ m_ioctx, m_journal_id, client_id, {});
bufferlist data;
data.append(desc);
C_SaferCond cond;
int unregister_client(const std::string &client_id) {
journal::Journaler journaler(m_work_queue, m_timer, &m_timer_lock,
- m_ioctx, m_journal_id, client_id, 5);
+ m_ioctx, m_journal_id, client_id, {});
C_SaferCond cond;
journaler.unregister_client(&cond);
return cond.wait();
#include "journal/Journaler.h"
#include "journal/ReplayEntry.h"
#include "journal/ReplayHandler.h"
+#include "journal/Settings.h"
#include <boost/scope_exit.hpp>
return r;
}
- journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, 0);
+ journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, {});
r = journaler.register_client(bufferlist());
if (r < 0) {
simple_err("failed to register journal client", r);
return r;
}
- journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, 0);
+ journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, {});
r = journaler.unregister_client();
if (r < 0) {
simple_err("failed to unregister journal client", r);
return r;
}
- journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, 0);
+ journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, {});
C_SaferCond init_ctx;
journaler.init(&init_ctx);
BOOST_SCOPE_EXIT_ALL( (&journaler) ) {
return r;
}
- journal::Journaler replay_journaler(io_ctx, replay_image_id, "", 0);
+ journal::Journaler replay_journaler(io_ctx, replay_image_id, "", {});
C_SaferCond replay_init_ctx;
replay_journaler.init(&replay_init_ctx);
#include "journal/Journaler.h"
#include "journal/ReplayEntry.h"
#include "journal/ReplayHandler.h"
+#include "journal/Settings.h"
#include <list>
#include <boost/variant.hpp>
journal::Journaler *create_journaler(librbd::ImageCtx *ictx) {
journal::Journaler *journaler = new journal::Journaler(
- ictx->md_ctx, ictx->id, "dummy client", 1);
+ ictx->md_ctx, ictx->id, "dummy client", {});
int r = journaler->register_client(bufferlist());
if (r < 0) {
#include "librbd/Operations.h"
#include "librbd/journal/Types.h"
#include "journal/Journaler.h"
+#include "journal/Settings.h"
#include <boost/scope_exit.hpp>
#include <boost/assign/list_of.hpp>
#include <utility>
"remote-image-id", {{"sync-point-snap", boost::none}}, {});
librbd::journal::ClientData client_data(peer_client_meta);
- journal::Journaler journaler(io_ctx, image_id, "peer-client", 5);
+ journal::Journaler journaler(io_ctx, image_id, "peer-client", {});
C_SaferCond init_ctx;
journaler.init(&init_ctx);
ASSERT_EQ(-ENOENT, init_ctx.wait());
#include "include/stringify.h"
#include "include/rbd/librbd.hpp"
#include "journal/Journaler.h"
+#include "journal/Settings.h"
#include "librbd/AioImageRequestWQ.h"
#include "librbd/ExclusiveLock.h"
#include "librbd/ImageCtx.h"
m_remote_journaler = new ::journal::Journaler(
m_threads->work_queue, m_threads->timer, &m_threads->timer_lock,
- m_remote_io_ctx, m_remote_image_ctx->id, "mirror-uuid", 5);
+ m_remote_io_ctx, m_remote_image_ctx->id, "mirror-uuid", {});
m_client_meta = {"image-id"};
#include "journal/Journaler.h"
#include "journal/ReplayEntry.h"
#include "journal/ReplayHandler.h"
+#include "journal/Settings.h"
#include "librbd/journal/Types.h"
namespace rbd {
public:
Journaler(librados::IoCtx& io_ctx, const std::string& journal_id,
const std::string &client_id) :
- ::journal::Journaler(io_ctx, journal_id, client_id, 5) {
+ ::journal::Journaler(io_ctx, journal_id, client_id, {}) {
}
int init() {
#include "global/global_context.h"
#include "journal/Journaler.h"
#include "journal/ReplayHandler.h"
+#include "journal/Settings.h"
#include "librbd/ExclusiveLock.h"
#include "librbd/ImageCtx.h"
#include "librbd/ImageState.h"
}
CephContext *cct = static_cast<CephContext *>(m_local->cct());
- double commit_interval = cct->_conf->rbd_journal_commit_age;
+ journal::Settings settings;
+ settings.commit_interval = cct->_conf->rbd_journal_commit_age;
+
m_remote_journaler = new Journaler(m_threads->work_queue,
m_threads->timer,
&m_threads->timer_lock, m_remote_ioctx,
m_remote_image_id, m_local_mirror_uuid,
- commit_interval);
+ settings);
bootstrap();
}