ctx->send();
}
-void JournalMetadata::add_listener(Listener *listener) {
+void JournalMetadata::add_listener(JournalMetadataListener *listener) {
Mutex::Locker locker(m_lock);
while (m_update_notifications > 0) {
m_update_cond.Wait(m_lock);
m_listeners.push_back(listener);
}
-void JournalMetadata::remove_listener(Listener *listener) {
+void JournalMetadata::remove_listener(JournalMetadataListener *listener) {
Mutex::Locker locker(m_lock);
while (m_update_notifications > 0) {
m_update_cond.Wait(m_lock);
#include "common/WorkQueue.h"
#include "cls/journal/cls_journal_types.h"
#include "journal/AsyncOpTracker.h"
+#include "journal/JournalMetadataListener.h"
#include <boost/intrusive_ptr.hpp>
#include <boost/noncopyable.hpp>
#include <boost/optional.hpp>
typedef std::set<Client> RegisteredClients;
typedef std::list<Tag> Tags;
- struct Listener {
- virtual ~Listener() {};
- virtual void handle_update(JournalMetadata *) = 0;
- };
-
JournalMetadata(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock,
librados::IoCtx &ioctx, const std::string &oid,
const std::string &client_id, double commit_interval);
void get_mutable_metadata(uint64_t *minimum_set, uint64_t *active_set,
RegisteredClients *clients, Context *on_finish);
- void add_listener(Listener *listener);
- void remove_listener(Listener *listener);
+ void add_listener(JournalMetadataListener *listener);
+ void remove_listener(JournalMetadataListener *listener);
void register_client(const bufferlist &data, Context *on_finish);
void update_client(const bufferlist &data, Context *on_finish);
private:
typedef std::map<uint64_t, uint64_t> AllocatedEntryTids;
- typedef std::list<Listener*> Listeners;
+ typedef std::list<JournalMetadataListener*> Listeners;
struct CommitEntry {
uint64_t object_num;
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2016 SUSE LINUX GmbH
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+#ifndef CEPH_JOURNAL_JOURNAL_METADATA_LISTENER_H
+#define CEPH_JOURNAL_JOURNAL_METADATA_LISTENER_H
+
+namespace journal {
+
+class JournalMetadata;
+
+struct JournalMetadataListener {
+ virtual ~JournalMetadataListener() {};
+ virtual void handle_update(JournalMetadata *) = 0;
+};
+
+} // namespace journal
+
+#endif // CEPH_JOURNAL_JOURNAL_METADATA_LISTENER_H
+
private:
typedef std::map<uint8_t, ObjectRecorderPtr> ObjectRecorderPtrs;
- struct Listener : public JournalMetadata::Listener {
+ struct Listener : public JournalMetadataListener {
JournalRecorder *journal_recorder;
Listener(JournalRecorder *_journal_recorder)
private:
typedef std::function<Context*()> CreateContext;
- struct MetadataListener : public JournalMetadata::Listener {
+ struct MetadataListener : public JournalMetadataListener {
JournalTrimmer *journal_trimmmer;
MetadataListener(JournalTrimmer *journal_trimmmer)
m_metadata->flush_commit_position(on_safe);
}
+void Journaler::add_listener(JournalMetadataListener *listener) {
+ m_metadata->add_listener(listener);
+}
+
+void Journaler::remove_listener(JournalMetadataListener *listener) {
+ m_metadata->remove_listener(listener);
+}
+
int Journaler::register_client(const bufferlist &data) {
C_SaferCond cond;
register_client(data, &cond);
#include "include/Context.h"
#include "include/rados/librados.hpp"
#include "journal/Future.h"
+#include "journal/JournalMetadataListener.h"
#include "cls/journal/cls_journal_types.h"
#include <list>
#include <map>
void get_mutable_metadata(uint64_t *minimum_set, uint64_t *active_set,
RegisteredClients *clients, Context *on_finish);
+ void add_listener(JournalMetadataListener *listener);
+ void remove_listener(JournalMetadataListener *listener);
+
int register_client(const bufferlist &data);
void register_client(const bufferlist &data, Context *on_finish);
journal/FutureImpl.h \
journal/Journaler.h \
journal/JournalMetadata.h \
+ journal/JournalMetadataListener.h \
journal/JournalPlayer.h \
journal/JournalRecorder.h \
journal/JournalTrimmer.h \
bufferlist create_payload(const std::string &payload);
- struct Listener : public journal::JournalMetadata::Listener {
+ struct Listener : public journal::JournalMetadataListener {
RadosTestFixture *test_fixture;
Mutex mutex;
Cond cond;
MOCK_METHOD1(committed, void(const MockFutureProxy &future));
MOCK_METHOD1(flush_commit_position, void(Context*));
+ MOCK_METHOD1(add_listener, void(JournalMetadataListener *));
+ MOCK_METHOD1(remove_listener, void(JournalMetadataListener *));
+
};
struct MockJournalerProxy {
int register_client(const bufferlist &data) {
return -EINVAL;
}
+ void unregister_client(Context *ctx) {
+ ctx->complete(-EINVAL);
+ }
+
void allocate_tag(uint64_t, const bufferlist &,
cls::journal::Tag*, Context *on_finish) {
on_finish->complete(-EINVAL);
void flush_commit_position(Context *on_finish) {
MockJournaler::get_instance().flush_commit_position(on_finish);
}
+
+ void add_listener(JournalMetadataListener *listener) {
+ MockJournaler::get_instance().add_listener(listener);
+ }
+
+ void remove_listener(JournalMetadataListener *listener) {
+ MockJournaler::get_instance().remove_listener(listener);
+ }
};
std::ostream &operator<<(std::ostream &os, const MockJournalerProxy &);