From 5a435b197b93beef02189468df1178b9430fab14 Mon Sep 17 00:00:00 2001 From: sageweil Date: Wed, 8 Aug 2007 04:37:26 +0000 Subject: [PATCH] logger in mds.server git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1601 29311d96-e01e-0410-9327-a35deaab8ce9 --- branches/sage/mds/TODO | 10 +++- branches/sage/mds/ebofs/Ebofs.cc | 3 + branches/sage/mds/ebofs/FileJournal.cc | 9 +-- branches/sage/mds/ebofs/FileJournal.h | 4 +- branches/sage/mds/mds/CDir.cc | 17 +++--- branches/sage/mds/mds/CDir.h | 6 +- branches/sage/mds/mds/MDLog.cc | 1 + branches/sage/mds/mds/MDS.cc | 81 +++++++++++++------------- branches/sage/mds/mds/Server.cc | 35 +++++++++++ branches/sage/mds/mds/Server.h | 10 +++- 10 files changed, 111 insertions(+), 65 deletions(-) diff --git a/branches/sage/mds/TODO b/branches/sage/mds/TODO index ee687ddb7cc96..b667ad5cd731b 100644 --- a/branches/sage/mds/TODO +++ b/branches/sage/mds/TODO @@ -157,14 +157,18 @@ osd/rados - rollback - rollback logging (to fix slow prepare vs rollback race) - read+floor_lockout for clean STOGITH-like/fencing semantics after failover. -- efficiently replicate clone() objects -- flag missing log entries on crash recovery --> WRNOOP? or WRLOST? + - consider implications of nvram writeahead logs +- clean shutdown? +- pgmonitor should supplement failure detection + +- flag missing log entries on crash recovery --> WRNOOP? or WRLOST? + +- efficiently replicate clone() objects - fix heartbeat wrt new replication - mark residual pgs obsolete ??? - rdlocks - optimize remove wrt recovery pushes -- pg_num changes - report crashed pgs? messenger diff --git a/branches/sage/mds/ebofs/Ebofs.cc b/branches/sage/mds/ebofs/Ebofs.cc index 44d99eedf38b0..4b5ac572410d0 100644 --- a/branches/sage/mds/ebofs/Ebofs.cc +++ b/branches/sage/mds/ebofs/Ebofs.cc @@ -154,6 +154,9 @@ int Ebofs::mount() t._decode(bl, off); _apply_transaction(t); } + + // done reading, make writeable. + journal->make_writeable(); } } diff --git a/branches/sage/mds/ebofs/FileJournal.cc b/branches/sage/mds/ebofs/FileJournal.cc index c822f16acc2e0..b49ee82bb42b4 100644 --- a/branches/sage/mds/ebofs/FileJournal.cc +++ b/branches/sage/mds/ebofs/FileJournal.cc @@ -400,8 +400,7 @@ void FileJournal::make_writeable() bool FileJournal::read_entry(bufferlist& bl, epoch_t& epoch) { if (!read_pos) { - dout(1) << "read_entry -- not readable" << endl; - make_writeable(); + dout(2) << "read_entry -- not readable" << endl; return false; } @@ -423,8 +422,7 @@ bool FileJournal::read_entry(bufferlist& bl, epoch_t& epoch) ::lseek(fd, read_pos, SEEK_SET); ::read(fd, &h, sizeof(h)); if (!h.check_magic(read_pos, header.fsid)) { - dout(1) << "read_entry " << read_pos << " : bad header magic, end of journal" << endl; - make_writeable(); + dout(2) << "read_entry " << read_pos << " : bad header magic, end of journal" << endl; return false; } @@ -438,8 +436,7 @@ bool FileJournal::read_entry(bufferlist& bl, epoch_t& epoch) if (!f.check_magic(read_pos, header.fsid) || h.epoch != f.epoch || h.len != f.len) { - dout(1) << "read_entry " << read_pos << " : bad footer magic, partially entry, end of journal" << endl; - make_writeable(); + dout(2) << "read_entry " << read_pos << " : bad footer magic, partially entry, end of journal" << endl; return false; } diff --git a/branches/sage/mds/ebofs/FileJournal.h b/branches/sage/mds/ebofs/FileJournal.h index a26f75ec97ff6..7c9a67ccbd25f 100644 --- a/branches/sage/mds/ebofs/FileJournal.h +++ b/branches/sage/mds/ebofs/FileJournal.h @@ -106,8 +106,6 @@ private: void stop_writer(); void write_thread_entry(); - void make_writeable(); - class Writer : public Thread { FileJournal *journal; public: @@ -131,6 +129,8 @@ private: int open(); void close(); + void make_writeable(); + // writes bool submit_entry(bufferlist& e, Context *oncommit); // submit an item void commit_epoch_start(); // mark epoch boundary diff --git a/branches/sage/mds/mds/CDir.cc b/branches/sage/mds/mds/CDir.cc index 86893a67271cf..0847e867879d4 100644 --- a/branches/sage/mds/mds/CDir.cc +++ b/branches/sage/mds/mds/CDir.cc @@ -499,7 +499,9 @@ void CDir::init_fragment_pins() void CDir::split(int bits, list& subs, list& waiters) { dout(10) << "split by " << bits << " bits on " << *this << endl; - + + if (cache->mds->logger) cache->mds->logger->inc("dir_sp"); + assert(is_complete() || !is_auth()); list frags; @@ -769,7 +771,7 @@ void CDir::fetch(Context *c, bool ignore_authpinnability) auth_pin(); state_set(CDir::STATE_FETCHING); - if (cache->mds->logger) cache->mds->logger->inc("fdir"); + if (cache->mds->logger) cache->mds->logger->inc("dir_f"); // start by reading the first hunk of it C_Dir_Fetch *fin = new C_Dir_Fetch(this); @@ -1036,6 +1038,7 @@ void CDir::_commit(version_t want) // complete? if (!is_complete()) { dout(7) << "commit not complete, fetching first" << endl; + if (cache->mds->logger) cache->mds->logger->inc("dir_ffc"); fetch(new C_Dir_RetryCommit(this, want)); return; } @@ -1049,7 +1052,7 @@ void CDir::_commit(version_t want) state_set(STATE_COMMITTING); } - if (cache->mds->logger) cache->mds->logger->inc("cdir"); + if (cache->mds->logger) cache->mds->logger->inc("dir_c"); // encode bufferlist bl; @@ -1234,14 +1237,8 @@ bool CDir::is_subtree_root() /** set_dir_auth - * - * always list ourselves first. - * - * accept 'iamauth' param so that i can intelligently adjust freeze auth_pins - * even when the auth bit isn't correct. - * as when calling MDCache::import_subtree(...). */ -void CDir::set_dir_auth(pair a, bool iamauth) +void CDir::set_dir_auth(pair a) { dout(10) << "setting dir_auth=" << a << " from " << dir_auth diff --git a/branches/sage/mds/mds/CDir.h b/branches/sage/mds/mds/CDir.h index bb5d005b4f6cb..1a0dbe2af0d2c 100644 --- a/branches/sage/mds/mds/CDir.h +++ b/branches/sage/mds/mds/CDir.h @@ -281,10 +281,8 @@ private: public: pair authority(); pair get_dir_auth() { return dir_auth; } - void set_dir_auth(pair a, bool iamauth=false); - void set_dir_auth(int a) { - set_dir_auth(pair(a, CDIR_AUTH_UNKNOWN), false); - } + void set_dir_auth(pair a); + void set_dir_auth(int a) { set_dir_auth(pair(a, CDIR_AUTH_UNKNOWN)); } bool is_ambiguous_dir_auth() { return dir_auth.second != CDIR_AUTH_UNKNOWN; } diff --git a/branches/sage/mds/mds/MDLog.cc b/branches/sage/mds/mds/MDLog.cc index f58cad8f9df04..129aa1e9fe2f9 100644 --- a/branches/sage/mds/mds/MDLog.cc +++ b/branches/sage/mds/mds/MDLog.cc @@ -48,6 +48,7 @@ void MDLog::init_journaler() static bool didit = false; if (!didit) { + didit = true; mdlog_logtype.add_inc("add"); mdlog_logtype.add_inc("expire"); mdlog_logtype.add_inc("obs"); diff --git a/branches/sage/mds/mds/MDS.cc b/branches/sage/mds/mds/MDS.cc index 6a03cc4eaedf5..28c1b11402fd7 100644 --- a/branches/sage/mds/mds/MDS.cc +++ b/branches/sage/mds/mds/MDS.cc @@ -59,8 +59,6 @@ #include "messages/MClientRequestForward.h" -LogType mds_logtype, mds_cache_logtype; - #include "config.h" #undef dout #define dout(l) if (l<=g_conf.debug || l <= g_conf.debug_mds) cout << g_clock.now() << " mds" << whoami << " " @@ -97,7 +95,6 @@ MDS::MDS(int whoami, Messenger *m, MonMap *mm) : server = new Server(this); locker = new Locker(this, mdcache); - // clients last_client_mdsmap_bcast = 0; @@ -144,6 +141,46 @@ MDS::~MDS() { void MDS::reopen_logger() { + static LogType mds_logtype, mds_cache_logtype; + static bool didit = false; + if (!didit) { + didit = true; + + mds_logtype.add_inc("req"); + mds_logtype.add_inc("reply"); + mds_logtype.add_inc("fw"); + mds_logtype.add_inc("cfw"); + + mds_logtype.add_set("l"); + mds_logtype.add_set("q"); + mds_logtype.add_set("popanyd"); + mds_logtype.add_set("popnest"); + + mds_logtype.add_inc("lih"); + mds_logtype.add_inc("lif"); + + mds_logtype.add_set("c"); + mds_logtype.add_set("ctop"); + mds_logtype.add_set("cbot"); + mds_logtype.add_set("cptail"); + mds_logtype.add_set("cpin"); + mds_logtype.add_inc("cex"); + mds_logtype.add_inc("dis"); + mds_logtype.add_inc("cmiss"); + + mds_logtype.add_set("buf"); + mds_logtype.add_inc("cdir"); + mds_logtype.add_inc("fdir"); + + mds_logtype.add_inc("iex"); + mds_logtype.add_inc("iim"); + mds_logtype.add_inc("ex"); + mds_logtype.add_inc("im"); + mds_logtype.add_inc("imex"); + mds_logtype.add_set("nex"); + mds_logtype.add_set("nim"); + } + // flush+close old log if (logger) { logger->flush(true); @@ -154,7 +191,6 @@ void MDS::reopen_logger() delete logger2; } - // log string name; name = "mds"; @@ -166,44 +202,11 @@ void MDS::reopen_logger() logger = new Logger(name, (LogType*)&mds_logtype); - mds_logtype.add_inc("req"); - mds_logtype.add_inc("reply"); - mds_logtype.add_inc("fw"); - mds_logtype.add_inc("cfw"); - - mds_logtype.add_set("l"); - mds_logtype.add_set("q"); - mds_logtype.add_set("popanyd"); - mds_logtype.add_set("popnest"); - - mds_logtype.add_inc("lih"); - mds_logtype.add_inc("lif"); - - mds_logtype.add_set("c"); - mds_logtype.add_set("ctop"); - mds_logtype.add_set("cbot"); - mds_logtype.add_set("cptail"); - mds_logtype.add_set("cpin"); - mds_logtype.add_inc("cex"); - mds_logtype.add_inc("dis"); - mds_logtype.add_inc("cmiss"); - - mds_logtype.add_set("buf"); - mds_logtype.add_inc("cdir"); - mds_logtype.add_inc("fdir"); - - mds_logtype.add_inc("iex"); - mds_logtype.add_inc("iim"); - mds_logtype.add_inc("ex"); - mds_logtype.add_inc("im"); - mds_logtype.add_inc("imex"); - mds_logtype.add_set("nex"); - mds_logtype.add_set("nim"); - - char n[80]; sprintf(n, "mds%d.cache", whoami); logger2 = new Logger(n, (LogType*)&mds_cache_logtype); + + server->reopen_logger(); } void MDS::send_message_mds(Message *m, int mds, int port, int fromport) diff --git a/branches/sage/mds/mds/Server.cc b/branches/sage/mds/mds/Server.cc index a551e13f76d16..bd9d7f225bb33 100644 --- a/branches/sage/mds/mds/Server.cc +++ b/branches/sage/mds/mds/Server.cc @@ -60,6 +60,31 @@ using namespace std; #define derr(l) if (l<=g_conf.debug || l <= g_conf.debug_mds) cout << g_clock.now() << " mds" << mds->get_nodeid() << ".server " +void Server::reopen_logger() +{ + static LogType mdserver_logtype; + static bool didit = false; + if (!didit) { + didit = true; + mdserver_logtype.add_inc("hcreq"); // handle client req + mdserver_logtype.add_inc("hsreq"); // slave + mdserver_logtype.add_inc("hcsess"); // client session + mdserver_logtype.add_inc("dcreq"); // dispatch client req + mdserver_logtype.add_inc("dsreq"); // slave + } + + if (logger) { + logger->flush(); + delete logger; + } + + // logger + char name[80]; + sprintf(name, "mds%d.server", mds->get_nodeid()); + logger = new Logger(name, &mdserver_logtype); +} + + void Server::dispatch(Message *m) { switch (m->get_type()) { @@ -152,6 +177,8 @@ void Server::handle_client_session(MClientSession *m) mdlog->submit_entry(new ESession(m->get_source_inst(), open, cmapv), new C_MDS_session_finish(mds, m->get_source_inst(), open, cmapv)); delete m; + + if (logger) logger->inc("hcsess"); } void Server::_session_logged(entity_inst_t client_inst, bool open, version_t cmapv) @@ -391,6 +418,8 @@ void Server::handle_client_request(MClientRequest *req) dout(4) << "handle_client_request " << *req << endl; int client = req->get_client(); + if (logger) logger->inc("hcreq"); + if (!mds->is_active()) { dout(5) << " not active, discarding client request." << endl; delete req; @@ -471,6 +500,8 @@ void Server::dispatch_client_request(MDRequest *mdr) { MClientRequest *req = mdr->client_request; + if (logger) logger->inc("dcreq"); + if (mdr->ref) { dout(7) << "dispatch_client_request " << *req << " ref " << *mdr->ref << endl; } else { @@ -552,6 +583,8 @@ void Server::handle_slave_request(MMDSSlaveRequest *m) dout(4) << "handle_slave_request " << m->get_reqid() << " from " << m->get_source() << endl; int from = m->get_source().num(); + if (logger) logger->inc("hsreq"); + // reply? if (m->is_reply()) { @@ -646,6 +679,8 @@ void Server::dispatch_slave_request(MDRequest *mdr) return; } + if (logger) logger->inc("dsreq"); + switch (mdr->slave_request->get_op()) { case MMDSSlaveRequest::OP_XLOCK: { diff --git a/branches/sage/mds/mds/Server.h b/branches/sage/mds/mds/Server.h index c38e7589bd28d..305e9f88a6872 100644 --- a/branches/sage/mds/mds/Server.h +++ b/branches/sage/mds/mds/Server.h @@ -17,6 +17,7 @@ #include "MDS.h" +class Logger; class LogEvent; class C_MDS_rename_finish; class MDRequest; @@ -29,13 +30,20 @@ class Server { MDCache *mdcache; MDLog *mdlog; Messenger *messenger; + Logger *logger; public: Server(MDS *m) : mds(m), mdcache(mds->mdcache), mdlog(mds->mdlog), - messenger(mds->messenger) { + messenger(mds->messenger), + logger(0) { } + ~Server() { + delete logger; + } + + void reopen_logger(); // message handler void dispatch(Message *m); -- 2.39.5