From b5c7ba826748d2508cc02cdc974a665c77937a51 Mon Sep 17 00:00:00 2001 From: sage Date: Wed, 7 Jul 2004 00:10:45 +0000 Subject: [PATCH] *** empty log message *** git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@13 29311d96-e01e-0410-9327-a35deaab8ce9 --- ceph/CDir.cc | 9 ++++----- ceph/CInode.cc | 4 ++-- ceph/MDS.cc | 28 ++++++++++++++++++++++------ ceph/MDStore.cc | 6 +++--- ceph/include/CDir.h | 3 ++- ceph/include/CInode.h | 3 ++- ceph/include/MDCache.h | 6 ++++-- ceph/include/MDS.h | 6 +++++- ceph/include/MDStore.h | 9 ++++++--- ceph/messages/MPing.h | 17 +++++++++++++++++ ceph/msg/FakeMessenger.cc | 14 ++++++++------ ceph/msg/FakeMessenger.h | 5 +++-- ceph/msg/Message.h | 12 ++++++++++-- ceph/msg/Messenger.cc | 8 ++++---- ceph/msg/Messenger.h | 6 ++++-- ceph/test/fakemds.cc | 19 +++++++++++++------ 16 files changed, 109 insertions(+), 46 deletions(-) create mode 100644 ceph/messages/MPing.h diff --git a/ceph/CDir.cc b/ceph/CDir.cc index 655ff7082940c..a962a08d3ecf0 100644 --- a/ceph/CDir.cc +++ b/ceph/CDir.cc @@ -61,18 +61,17 @@ void CDir::dump(int depth) { } -void CDir::dump_to_disk() +void CDir::dump_to_disk(MDS *mds) { map::iterator iter = items.begin(); while (iter != items.end()) { CDentry* d = iter->second; char isdir = ' '; if (d->inode->dir != NULL) isdir = '/'; - cout << "dump2disk: " << d->inode->inode.ino << " " << d->name << isdir << endl; - d->inode->dump_to_disk(); + //cout << "dump2disk: " << d->inode->inode.ino << " " << d->name << isdir << endl; + d->inode->dump_to_disk(mds); iter++; } - g_mds->mdstore->commit_dir(inode, NULL); - + mds->mdstore->commit_dir(inode, NULL); } diff --git a/ceph/CInode.cc b/ceph/CInode.cc index 71a0eb70294c1..178b993bc4ba9 100644 --- a/ceph/CInode.cc +++ b/ceph/CInode.cc @@ -29,10 +29,10 @@ void CInode::dump(int dep) dir->dump(dep); } -void CInode::dump_to_disk() +void CInode::dump_to_disk(MDS *mds) { if (dir) - dir->dump_to_disk(); + dir->dump_to_disk(mds); } diff --git a/ceph/MDS.cc b/ceph/MDS.cc index 6998805f1004d..27b35309dc21a 100644 --- a/ceph/MDS.cc +++ b/ceph/MDS.cc @@ -6,11 +6,13 @@ #include "include/MDCache.h" #include "include/MDStore.h" +#include "messages/MPing.h" + #include using namespace std; // extern -MDS *g_mds; +//MDS *g_mds; // cons/des @@ -19,7 +21,7 @@ MDS::MDS(int id, int num, Messenger *m) { num_nodes = num; mdcache = new DentryCache(); - mdstore = new MDStore(); + mdstore = new MDStore(this); messenger = m; } MDS::~MDS() { @@ -31,7 +33,7 @@ MDS::~MDS() { int MDS::init() { - messenger->init(nodeid); + messenger->init(this); } void MDS::shutdown() @@ -41,7 +43,19 @@ void MDS::shutdown() void MDS::proc_message(Message *m) { - cout << "implement MDS::proc_message" << endl; + switch (m->get_type()) { + case MSG_PING: + cout << nodeid << " received ping from " << m->get_from() << " with count " << ((MPing*)m)->num << endl; + if (((MPing*)m)->num > 0) { + cout << nodeid << " responding to " << m->get_from() << endl; + messenger->send_message(new MPing(((MPing*)m)->num-1), m->get_from()); + } + break; + + default: + cout << "implement MDS::proc_message" << endl; + } + } @@ -52,12 +66,14 @@ void MDS::proc_message(Message *m) class OpenRootContext : public Context { protected: Context *c; + MDS *mds; public: - OpenRootContext(Context *c) { + OpenRootContext(MDS *m, Context *c) { + mds = m; this->c = c; } void finish(int result) { - g_mds->open_root_2(result, c); + mds->open_root_2(result, c); } }; diff --git a/ceph/MDStore.cc b/ceph/MDStore.cc index 1f0aa0281b9a6..ff1e2ff1e8b7d 100644 --- a/ceph/MDStore.cc +++ b/ceph/MDStore.cc @@ -82,7 +82,7 @@ bool MDStore::fetch_dir_2( int result, char *buf, size_t buflen, CInode *dir, Co // inode inodeno_t ino = ((struct inode_t*)(buf+p+1))->ino; - if (g_mds->mdcache->have_inode(ino)) + if (mds->mdcache->have_inode(ino)) throw "inode already exists! uh oh\n"; // new inode @@ -91,8 +91,8 @@ bool MDStore::fetch_dir_2( int result, char *buf, size_t buflen, CInode *dir, Co p += sizeof(inode_t); // add and link - g_mds->mdcache->add_inode( in ); - g_mds->mdcache->link_inode( dir, dname, in ); + mds->mdcache->add_inode( in ); + mds->mdcache->link_inode( dir, dname, in ); } } diff --git a/ceph/include/CDir.h b/ceph/include/CDir.h index bd0cd9d0ea560..a6e7296cb85e2 100644 --- a/ceph/include/CDir.h +++ b/ceph/include/CDir.h @@ -15,6 +15,7 @@ using namespace std; class CInode; class CDentry; +class MDS; // CDir typedef map CDir_map_t; @@ -51,7 +52,7 @@ class CDir { CDentry* lookup(string n); void dump(int d = 0); - void dump_to_disk(); + void dump_to_disk(MDS *m); }; diff --git a/ceph/include/CInode.h b/ceph/include/CInode.h index 02d2088bb060c..e4a68688fecfb 100644 --- a/ceph/include/CInode.h +++ b/ceph/include/CInode.h @@ -8,6 +8,7 @@ class CDentry; class CDir; +class MDS; // cached inode wrapper class CInode : LRUObject { @@ -79,7 +80,7 @@ class CInode : LRUObject { // dbg void dump(int d = 0); - void dump_to_disk(); + void dump_to_disk(MDS *m); }; diff --git a/ceph/include/MDCache.h b/ceph/include/MDCache.h index f04ea64905326..2e3649f6e564a 100644 --- a/ceph/include/MDCache.h +++ b/ceph/include/MDCache.h @@ -14,6 +14,8 @@ #include "CDir.h" +class MDS; + // DCache typedef hash_map inode_map_t; @@ -81,8 +83,8 @@ class DentryCache { if (root) root->dump(); } - void dump_to_disk() { - if (root) root->dump_to_disk(); + void dump_to_disk(MDS *m) { + if (root) root->dump_to_disk(m); } }; diff --git a/ceph/include/MDS.h b/ceph/include/MDS.h index c9afb4c8dddc0..173b7a76fc5f9 100644 --- a/ceph/include/MDS.h +++ b/ceph/include/MDS.h @@ -60,6 +60,10 @@ class MDS { MDS(int id, int num, Messenger *m); ~MDS(); + int get_nodeid() { + return nodeid; + } + int init(); void shutdown(); @@ -71,7 +75,7 @@ class MDS { }; -extern MDS *g_mds; +//extern MDS *g_mds; #endif diff --git a/ceph/include/MDStore.h b/ceph/include/MDStore.h index 4392c227bbfbf..bcad53dc98caf 100644 --- a/ceph/include/MDStore.h +++ b/ceph/include/MDStore.h @@ -6,14 +6,17 @@ #include "Context.h" #include "Message.h" +class MDS; + class MDStore { protected: - + MDS *mds; public: - MDStore() { } - ~MDStore() { } + MDStore(MDS *m) { + mds = m; + } // i/o /* diff --git a/ceph/messages/MPing.h b/ceph/messages/MPing.h new file mode 100644 index 0000000000000..365df452af5d9 --- /dev/null +++ b/ceph/messages/MPing.h @@ -0,0 +1,17 @@ + +#ifndef __MPING_H +#define __MPING_H + +#include "../include/Message.h" + +class MPing : public Message { + public: + int num; + MPing(int n) { + num = n; + subsys = MSG_SUBSYS_SERVER; + type = MSG_PING; + } +}; + +#endif diff --git a/ceph/msg/FakeMessenger.cc b/ceph/msg/FakeMessenger.cc index 37e3ed76d4980..51be2863bfbd0 100644 --- a/ceph/msg/FakeMessenger.cc +++ b/ceph/msg/FakeMessenger.cc @@ -1,5 +1,6 @@ #include "include/FakeMessenger.h" +#include "include/mds.h" #include #include @@ -51,9 +52,10 @@ FakeMessenger::FakeMessenger() } -int FakeMessenger::init(int whoami) +int FakeMessenger::init(MDS *mds) { - this->whoami = whoami; + mymds = mds; + whoami = mds->get_nodeid(); directory[ whoami ] = this; } @@ -62,15 +64,15 @@ int FakeMessenger::shutdown() directory.erase(whoami); } -bool FakeMessenger::send_message(Message *m) +bool FakeMessenger::send_message(Message *m, int dest) { - int d = m->destination(); + m->set_from(whoami); try { - FakeMessenger *dm = directory[d]; + FakeMessenger *dm = directory[dest]; dm->queue_incoming(m); } catch (...) { - cout << "no destination " << d << endl; + cout << "no destination " << dest << endl; } } diff --git a/ceph/msg/FakeMessenger.h b/ceph/msg/FakeMessenger.h index 1a205efa99662..03bba7054b763 100644 --- a/ceph/msg/FakeMessenger.h +++ b/ceph/msg/FakeMessenger.h @@ -8,14 +8,15 @@ #include class FakeMessenger : public Messenger { + protected: int whoami; public: FakeMessenger(); - virtual int init(int whoami); + virtual int init(MDS *m); virtual int shutdown(); - virtual bool send_message(Message *m); + virtual bool send_message(Message *m, int dest); virtual int wait_message(time_t seconds); virtual int loop(); diff --git a/ceph/msg/Message.h b/ceph/msg/Message.h index 769bb0c91092c..d5e59d81ff32e 100644 --- a/ceph/msg/Message.h +++ b/ceph/msg/Message.h @@ -23,7 +23,8 @@ class Message { unsigned long serial_len; int type; int subsys; - int dest; + + int from, dest; public: Message() { @@ -44,9 +45,16 @@ class Message { int destination() { return dest; } + int get_from() { + return from; + } + int set_from(int f) { + from = f; + return f; + } // serialization - virtual unsigned long serialize() = 0; + virtual unsigned long serialize() { } // = 0; void *get_serialized() { return serialized; } diff --git a/ceph/msg/Messenger.cc b/ceph/msg/Messenger.cc index c353d944be78e..ace15a3b15094 100644 --- a/ceph/msg/Messenger.cc +++ b/ceph/msg/Messenger.cc @@ -10,21 +10,21 @@ void Messenger::dispatch_message(Message *m) switch (m->get_subsys()) { case MSG_SUBSYS_MDSTORE: - g_mds->mdstore->proc_message(m); + mymds->mdstore->proc_message(m); break; /* case MSG_SUBSYS_MDLOG: - g_mds->logger->proc_message(m); + mymds->logger->proc_message(m); break; case MSG_SUBSYS_BALANCER: - g_mds->balancer->proc_message(m); + mymds->balancer->proc_message(m); break; */ case MSG_SUBSYS_SERVER: - g_mds->proc_message(m); + mymds->proc_message(m); break; } } diff --git a/ceph/msg/Messenger.h b/ceph/msg/Messenger.h index ad0e2a83469c7..2f9941c82ede4 100644 --- a/ceph/msg/Messenger.h +++ b/ceph/msg/Messenger.h @@ -7,19 +7,21 @@ using namespace std; #include "Message.h" +class MDS; class Messenger { protected: list incoming; + MDS *mymds; public: Messenger() {} ~Messenger() {} // ... - virtual int init(int whoami) = 0; + virtual int init(MDS *m) = 0; virtual int shutdown() = 0; - virtual bool send_message(Message *m) = 0; + virtual bool send_message(Message *m, int dest) = 0; virtual int wait_message(time_t seconds) = 0; virtual int loop() { diff --git a/ceph/test/fakemds.cc b/ceph/test/fakemds.cc index d4053de750603..1706fa462ed19 100644 --- a/ceph/test/fakemds.cc +++ b/ceph/test/fakemds.cc @@ -9,6 +9,8 @@ #include "include/MDStore.h" #include "include/FakeMessenger.h" +#include "messages/MPing.h" + using namespace std; __uint64_t ino = 1; @@ -62,23 +64,28 @@ int main(char **argv, int argc) { cout << "hi there" << endl; // init - g_mds = new MDS(0, 1, new FakeMessenger()); - g_mds->open_root(NULL); + MDS *mds1 = new MDS(0, 2, new FakeMessenger()); + mds1->open_root(NULL); + mds1->init(); - g_mds->mdstore->fetch_dir( g_mds->mdcache->get_root(), NULL ); + mds1->mdstore->fetch_dir( mds1->mdcache->get_root(), NULL ); + + MDS *mds2 = new MDS(1,2,new FakeMessenger()); + mds2->init(); // send an initial message...? + mds1->messenger->send_message(new MPing(10), 1); // loop fakemessenger_do_loop(); // cleanup - if (g_mds->mdcache->clear()) { + if (mds1->mdcache->clear()) { cout << "clean shutdown" << endl; - g_mds->mdcache->dump(); - delete g_mds; + mds1->mdcache->dump(); + delete mds1; } else { cout << "can't empty cache"; } -- 2.39.5