From 3b782a488e6f9b5018488615eca64a54d9e126c5 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 2 Dec 2008 14:25:54 -0800 Subject: [PATCH] osd: log scrub errors to system log --- src/osd/OSD.cc | 54 ++++++++++++++++++++++++++++++++++++++--- src/osd/OSD.h | 10 ++++++++ src/osd/ReplicatedPG.cc | 25 ++++++++++++++++++- 3 files changed, 84 insertions(+), 5 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 636799e5533f3..af1c0b50f0a25 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -36,6 +36,8 @@ #include "msg/Messenger.h" #include "msg/Message.h" +#include "messages/MLog.h" + #include "messages/MGenericMessage.h" #include "messages/MPing.h" #include "messages/MOSDPing.h" @@ -271,8 +273,12 @@ OSD::OSD(int id, Messenger *m, Messenger *hbm, MonMap *mm, const char *dev) : osdmap(NULL), map_lock("OSD::map_lock"), map_cache_lock("OSD::map_cache_lock"), + log_lock("OSD::log_lock"), last_log(0), + up_thru_wanted(0), up_thru_pending(0), pg_stat_queue_lock("OSD::pg_stat_queue_lock"), + last_tid(0), tid_lock("OSD::tid_lock"), + num_pulling(0), recovery_ops_active(0), recovery_wq(this), remove_list_lock("OSD::remove_list_lock"), @@ -281,12 +287,8 @@ OSD::OSD(int id, Messenger *m, Messenger *hbm, MonMap *mm, const char *dev) : { osdmap = 0; - last_tid = 0; - num_pulling = 0; - memset(&my_stat, 0, sizeof(my_stat)); - up_thru_wanted = up_thru_pending = 0; osd_stat_updated = osd_stat_pending = false; stat_ops = 0; @@ -1213,6 +1215,7 @@ void OSD::do_mon_report() } // do any pending reports + send_log(); if (is_booting()) send_boot(); send_alive(); @@ -1220,6 +1223,45 @@ void OSD::do_mon_report() send_pg_stats(); } + +void OSD::log(__u8 level, string s) +{ + Mutex::Locker l(log_lock); + dout(10) << "log " << (int)level << " : " << s << dendl; + LogEntry e; + e.who = messenger->get_myinst(); + e.stamp = g_clock.now(); + e.seq = ++last_log; + e.level = level; + e.msg = s; + log_queue.push_back(e); +} + +void OSD::send_log() +{ + Mutex::Locker l(log_lock); + if (log_queue.empty()) + return; + MLog *log = new MLog(osdmap->get_fsid()); + log->entries = log_queue; + int mon = monmap->pick_mon(); + dout(10) << "send_log to mon" << mon << dendl; + messenger->send_message(log, monmap->get_inst(mon)); +} + +void OSD::handle_log(MLog *m) +{ + Mutex::Locker l(log_lock); + dout(10) << "handle_log " << *m << dendl; + + version_t last = m->entries.rbegin()->seq; + while (log_queue.size() && log_queue.begin()->seq <= last) { + dout(10) << " logged " << log_queue.front() << dendl; + log_queue.pop_front(); + } + delete m; +} + void OSD::send_boot() { int mon = monmap->pick_mon(true); @@ -1453,6 +1495,10 @@ void OSD::dispatch(Message *m) delete m; break; + case MSG_LOG: + handle_log((MLog*)m); + break; + // -- don't need OSDMap -- // map and replication diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 80c98fc895ed2..8bd47429c47ca 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -30,6 +30,7 @@ #include "common/DecayCounter.h" +#include "include/LogEntry.h" #include using namespace std; @@ -44,6 +45,7 @@ class Message; class Logger; class ObjectStore; class OSDMap; +class MLog; class OSD : public Dispatcher { @@ -366,6 +368,14 @@ private: void do_mon_report(); + // -- log -- + Mutex log_lock; + deque log_queue; + version_t last_log; + + void log(__u8 level, string s); + void send_log(); + void handle_log(MLog *m); // -- boot -- void send_boot(); diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index cb5783465897f..50aaba1304f27 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -39,9 +39,9 @@ static ostream& _prefix(PG *pg, int whoami, OSDMap *osdmap) { } +#include #include -#include static const int LOAD_LATENCY = 1; static const int LOAD_QUEUE_SIZE = 2; @@ -2942,6 +2942,29 @@ void ReplicatedPG::scrub() << stat.num_kb << "/" << info.stats.num_kb << " kb." << dendl; + if (stat.num_objects != info.stats.num_objects || + stat.num_object_clones != info.stats.num_object_clones || + stat.num_bytes != info.stats.num_bytes || + stat.num_kb != info.stats.num_kb) { + stringstream ss; + ss << info.pgid << " scrub got " + << stat.num_objects << "/" << info.stats.num_objects << " objects, " + << stat.num_object_clones << "/" << info.stats.num_object_clones << " clones, " + << stat.num_bytes << "/" << info.stats.num_bytes << " bytes, " + << stat.num_kb << "/" << info.stats.num_kb << " kb."; + string s; + getline(ss, s); + osd->log(10, s); + /* + } else { + stringstream ss; + ss << info.pgid << " scrub ok"; + string s; + getline(ss, s); + osd->log(0, s); + */ + } + dout(10) << "scrub finish" << dendl; unlock(); } -- 2.39.5