// vim: ts=8 sw=2 smarttab
#include "journal/JournalMetadata.h"
+#include "journal/Utils.h"
#include "common/errno.h"
#include "common/Timer.h"
#include "cls/journal/cls_journal_client.h"
using namespace cls::journal;
-namespace {
-
-struct C_NotifyUpdate : public Context {
- JournalMetadataPtr journal_metadata;
-
- C_NotifyUpdate(JournalMetadata *_journal_metadata)
- : journal_metadata(_journal_metadata) {}
-
- virtual void finish(int r) {
- if (r == 0) {
- journal_metadata->notify_update();
- }
- }
-};
-
-void rados_ctx_callback(rados_completion_t c, void *arg) {
- Context *comp = reinterpret_cast<Context *>(arg);
- comp->complete(rados_aio_get_return_value(c));
-}
-
-} // anonymous namespace
-
JournalMetadata::JournalMetadata(librados::IoCtx &ioctx,
const std::string &oid,
const std::string &client_id)
C_NotifyUpdate *ctx = new C_NotifyUpdate(this);
librados::AioCompletion *comp =
- librados::Rados::aio_create_completion(ctx, NULL, rados_ctx_callback);
+ librados::Rados::aio_create_completion(ctx, NULL,
+ utils::rados_ctx_callback);
int r = m_ioctx.aio_operate(m_oid, comp, &op);
assert(r == 0);
comp->release();
C_NotifyUpdate *ctx = new C_NotifyUpdate(this);
librados::AioCompletion *comp =
- librados::Rados::aio_create_completion(ctx, NULL, rados_ctx_callback);
+ librados::Rados::aio_create_completion(ctx, NULL,
+ utils::rados_ctx_callback);
int r = m_ioctx.aio_operate(m_oid, comp, &op);
assert(r == 0);
comp->release();
}
void JournalMetadata::set_commit_position(
- const ObjectSetPosition &commit_position) {
+ const ObjectSetPosition &commit_position, Context *on_safe) {
Mutex::Locker locker(m_lock);
librados::ObjectWriteOperation op;
client::client_commit(&op, m_client_id, commit_position);
- C_NotifyUpdate *ctx = new C_NotifyUpdate(this);
+ C_NotifyUpdate *ctx = new C_NotifyUpdate(this, on_safe);
librados::AioCompletion *comp =
- librados::Rados::aio_create_completion(ctx, NULL, rados_ctx_callback);
+ librados::Rados::aio_create_completion(ctx, NULL,
+ utils::rados_ctx_callback);
int r = m_ioctx.aio_operate(m_oid, comp, &op);
assert(r == 0);
comp->release();
return m_active_set;
}
- void set_commit_position(const ObjectSetPosition &commit_position);
+ void set_commit_position(const ObjectSetPosition &commit_position,
+ Context *on_safe);
void get_commit_position(ObjectSetPosition *commit_position) const {
Mutex::Locker locker(m_lock);
*commit_position = m_client.commit_position;
journal_metadata->handle_watch_error(err);
}
};
+
struct C_WatchReset : public Context {
JournalMetadataPtr journal_metadata;
}
};
+ struct C_NotifyUpdate : public Context {
+ JournalMetadataPtr journal_metadata;
+ Context *on_safe;
+
+ C_NotifyUpdate(JournalMetadata *_journal_metadata, Context *_on_safe = NULL)
+ : journal_metadata(_journal_metadata), on_safe(_on_safe) {}
+
+ virtual void finish(int r) {
+ if (r == 0) {
+ journal_metadata->notify_update();
+ }
+ if (on_safe != NULL) {
+ on_safe->complete(r);
+ }
+ }
+ };
+
struct C_Refresh : public Context {
JournalMetadataPtr journal_metadata;
uint64_t minimum_set;
namespace journal {
-namespace {
-
-void rados_ctx_callback(rados_completion_t c, void *arg) {
- Context *ctx = reinterpret_cast<Context *>(arg);
- ctx->complete(rados_aio_get_return_value(c));
-}
-
-} // anonymous namespace
-
ObjectPlayer::ObjectPlayer(librados::IoCtx &ioctx,
const std::string &object_oid_prefix,
uint64_t object_num, SafeTimer &timer,
op.read(m_read_off, 2 << m_order, &context->read_bl, NULL);
librados::AioCompletion *rados_completion =
- librados::Rados::aio_create_completion(context, rados_ctx_callback, NULL);
+ librados::Rados::aio_create_completion(context, utils::rados_ctx_callback,
+ NULL);
int r = m_ioctx.aio_operate(m_oid, rados_completion, &op, 0, NULL);
assert(r == 0);
rados_completion->release();
namespace journal {
-namespace {
-
-void rados_ctx_callback(rados_completion_t c, void *arg) {
- Context *ctx = reinterpret_cast<Context *>(arg);
- ctx->complete(rados_aio_get_return_value(c));
-}
-
-} // anonymous
-
ObjectRecorder::ObjectRecorder(librados::IoCtx &ioctx, const std::string &oid,
uint64_t object_number,
SafeTimer &timer, Mutex &timer_lock,
librados::AioCompletion *rados_completion =
librados::Rados::aio_create_completion(append_flush, NULL,
- rados_ctx_callback);
+ utils::rados_ctx_callback);
int r = m_ioctx.aio_operate(m_oid, rados_completion, &op);
assert(r == 0);
rados_completion->release();
// vim: ts=8 sw=2 smarttab
#include "journal/Utils.h"
+#include "include/Context.h"
#include "include/stringify.h"
namespace journal {
return name + " (" + stringify(address) + ")";
}
+void rados_ctx_callback(rados_completion_t c, void *arg) {
+ Context *comp = reinterpret_cast<Context *>(arg);
+ comp->complete(rados_aio_get_return_value(c));
+}
+
} // namespace utils
} // namespace journal
#define CEPH_JOURNAL_UTILS_H
#include "include/int_types.h"
+#include "include/rados/librados.hpp"
#include <string>
namespace journal {
std::string unique_lock_name(const std::string &name, void *address);
+void rados_ctx_callback(rados_completion_t c, void *arg);
+
} // namespace utils
} // namespace journal