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;
+}
+
class MonMap;
-class LogClient {
+class LogClient : public Dispatcher {
Messenger *messenger;
MonMap *monmap;
+
+ bool dispatch_impl(Message *m);
public:
// -- log --
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
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);
}
}
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);
delete m;
break;
- case MSG_LOG:
- logclient->handle_log((MLog*)m);
- break;
-
// -- don't need OSDMap --
// map and replication