]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
log: use of cascading dispatcher for log messages
authorYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 4 Dec 2008 21:59:34 +0000 (13:59 -0800)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 4 Dec 2008 22:01:12 +0000 (14:01 -0800)
src/common/LogClient.cc
src/common/LogClient.h
src/msg/Dispatcher.h
src/osd/OSD.cc

index 73214f7d13732e4cb65c6f95bfd186076d78046e..8279dc41911e4b9fe23a6fdcdac707cd3b385bfb 100644 (file)
@@ -82,4 +82,16 @@ void LogClient::handle_log(MLog *m)
   delete m;
 }
 
+bool LogClient::dispatch_impl(Message *m) 
+{
+  dout(20) << "dispatch " << m << dendl;
+
+  switch (m->get_type()) {
+  case MSG_LOG:
+    handle_log((MLog*)m);
+    return true;
+  }
+  return false;
+}
+
 
index d5f49147b6b7ec216c542bab81466767baa4c357..fec14908e2f9b1a84a664112755a3abfd12c62ea 100644 (file)
@@ -27,9 +27,11 @@ class MLog;
 class MonMap;
 
 
-class LogClient {
+class LogClient : public Dispatcher {
   Messenger *messenger;
   MonMap *monmap;
+
+  bool dispatch_impl(Message *m);
  public:
 
   // -- log --
@@ -42,8 +44,11 @@ class LogClient {
   void send_log();
   void handle_log(MLog *m);
 
-  LogClient(Messenger *m, MonMap *mm) : messenger(m), monmap(mm), 
-                                        log_lock("LogClient::log_lock"), last_log(0) {}
+  LogClient(Messenger *m, MonMap *mm, Dispatcher *disp) : messenger(m), monmap(mm), 
+                                        log_lock("LogClient::log_lock"), last_log(0) {
+    if (disp)
+      disp->link_dispatcher(this);
+  }
 };
 
 #endif
index 42ce2e7d8ae1bf4bc9809d6efe6b3cc49bf0156b..c8274f30a9c2fb043316540c646c776a7143335e 100644 (file)
@@ -30,20 +30,22 @@ class Dispatcher {
   Dispatcher() : next(NULL) { }
 
   virtual void dispatch(Message *m) { 
-    if (!dispatch_impl(m)) {
-      if (next) {
-        next->dispatch(m);
-      } else {
+    bool ret = false;
+    if (next)
+      ret = next->dispatch_impl(m);
+
+    if (!ret) {
+      if (!dispatch_impl(m)) {
         assert(0);
       }
     }
   }
 
-  virtual void add(Dispatcher *disp) {
+  virtual void link_dispatcher(Dispatcher *disp) {
     if (!next) {
       next = disp; 
     } else {
-      next->add(disp);
+      next->link_dispatcher(disp);
     }
   }
 
index a3acdece834dce8bd4017a96558d898a6d87d23e..c77b8fa72d137adefcc0e132037beb05b16b83d3 100644 (file)
@@ -378,7 +378,7 @@ int OSD::init()
   assert(whoami == superblock.whoami);
     
   // log
-  logclient = new LogClient(messenger, monmap);
+  logclient = new LogClient(messenger, monmap, this);
   char name[80];
   sprintf(name, "osd%d", whoami);
   logger = new Logger(name, (LogType*)&osd_logtype);
@@ -1466,10 +1466,6 @@ bool OSD::dispatch_impl(Message *m)
     delete m;
     break;
 
-  case MSG_LOG:
-    logclient->handle_log((MLog*)m);
-    break;
-
     // -- don't need OSDMap --
 
     // map and replication