]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
journal: Support for registering metadata listeners in the Journaler
authorRicardo Dias <rdias@suse.com>
Thu, 12 May 2016 17:09:09 +0000 (18:09 +0100)
committerRicardo Dias <rdias@suse.com>
Tue, 14 Jun 2016 20:24:07 +0000 (21:24 +0100)
Signed-off-by: Ricardo Dias <rdias@suse.com>
src/journal/JournalMetadata.cc
src/journal/JournalMetadata.h
src/journal/JournalMetadataListener.h [new file with mode: 0644]
src/journal/JournalRecorder.h
src/journal/JournalTrimmer.h
src/journal/Journaler.cc
src/journal/Journaler.h
src/journal/Makefile.am
src/test/journal/RadosTestFixture.h
src/test/journal/mock/MockJournaler.h

index 18bef13b0f998d7e1b44907211b4a5e4247af171..5692f040476f7bf4c457406b5533a07244aba0e4 100644 (file)
@@ -587,7 +587,7 @@ void JournalMetadata::get_tags(const boost::optional<uint64_t> &tag_class,
   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);
@@ -595,7 +595,7 @@ void JournalMetadata::add_listener(Listener *listener) {
   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);
index 1c084a4c5a5dc15b8c733ed99fec971a60696681..c2fa711b9f8e13f719b0d327330db9dcca4e0843 100644 (file)
@@ -13,6 +13,7 @@
 #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>
@@ -41,11 +42,6 @@ public:
   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);
@@ -62,8 +58,8 @@ public:
   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);
@@ -150,7 +146,7 @@ public:
 
 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;
diff --git a/src/journal/JournalMetadataListener.h b/src/journal/JournalMetadataListener.h
new file mode 100644 (file)
index 0000000..121fe68
--- /dev/null
@@ -0,0 +1,30 @@
+// -*- 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
+
index 68a1d8f50e38ea12e72a1b16ae40852dadcb511d..6ed2e6316236d3a439def0735ed6c13bb9c6db6e 100644 (file)
@@ -36,7 +36,7 @@ public:
 private:
   typedef std::map<uint8_t, ObjectRecorderPtr> ObjectRecorderPtrs;
 
-  struct Listener : public JournalMetadata::Listener {
+  struct Listener : public JournalMetadataListener {
     JournalRecorder *journal_recorder;
 
     Listener(JournalRecorder *_journal_recorder)
index 26bfca7ec32b111491263e12042291aa74613e30..ec76d722cac5e5c6b98e24e07a350fa0653efcaa 100644 (file)
@@ -33,7 +33,7 @@ public:
 private:
   typedef std::function<Context*()> CreateContext;
 
-  struct MetadataListener : public JournalMetadata::Listener {
+  struct MetadataListener : public JournalMetadataListener {
     JournalTrimmer *journal_trimmmer;
 
     MetadataListener(JournalTrimmer *journal_trimmmer)
index 1db5247eb770d6b99e6e70cbe67679ceb6eba065..7bfbbe956e4949f368b7d27c84b586e965534251 100644 (file)
@@ -244,6 +244,14 @@ void Journaler::flush_commit_position(Context *on_safe) {
   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);
index f30a3a512b54bb9931c52539959a9a3b77c4efa5..afa3c880754734d961b7036207e32cba5fdc2b8a 100644 (file)
@@ -9,6 +9,7 @@
 #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>
@@ -71,6 +72,9 @@ public:
   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);
 
index 4f0cd18c01466b42ff469a0af8b295df7014be1f..8e222d95d6b7a28638fc5a8163435e53a1793e0e 100644 (file)
@@ -23,6 +23,7 @@ noinst_HEADERS += \
        journal/FutureImpl.h \
        journal/Journaler.h \
        journal/JournalMetadata.h \
+       journal/JournalMetadataListener.h \
        journal/JournalPlayer.h \
        journal/JournalRecorder.h \
        journal/JournalTrimmer.h \
index d7cd1a845d6734f64fca505b8e649c669048f700..bbd6dde608ddf287a7f96d708b97c81ecb5d62b3 100644 (file)
@@ -35,7 +35,7 @@ public:
 
   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;
index 8ca97a4c1b4c7683001dae3afd8d7a5aa165a126..ee8212d8dc2e00bac1b251053127661e1d16cd4d 100644 (file)
@@ -128,6 +128,9 @@ struct MockJournaler {
   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 {
@@ -155,6 +158,10 @@ 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);
@@ -266,6 +273,14 @@ struct MockJournalerProxy {
   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 &);