From 6f15219d0c5f04d46809a02e801faa1c1fd52d3d Mon Sep 17 00:00:00 2001 From: huzhiguang Date: Fri, 28 Jul 2017 20:34:23 +0800 Subject: [PATCH] add hhbc repo exception monitor and print log --- hphp/runtime/server/admin-request-handler.cpp | 39 ++++++++++++++++++- hphp/runtime/vm/repo-helpers.h | 6 +++ hphp/runtime/vm/repo.cpp | 30 ++++++++++++++ hphp/runtime/vm/repo.h | 1 + 4 files changed, 75 insertions(+), 1 deletion(-) diff --git a/hphp/runtime/server/admin-request-handler.cpp b/hphp/runtime/server/admin-request-handler.cpp index aec75b7901b90f..34bb23a6c37352 100644 --- a/hphp/runtime/server/admin-request-handler.cpp +++ b/hphp/runtime/server/admin-request-handler.cpp @@ -252,8 +252,9 @@ void AdminRequestHandler::handleRequest(Transport *transport) { "\n" "/instance-id: instance id that's passed in from command line\n" "/compiler-id: returns the compiler id that built this app\n" - "/repo-schema: return the repo schema id used by this app\n" + "/repo-schema: return the repo schema id used by this app\n" "/ini-get-all: dump all settings as JSON\n" + "/check-repo: check tables of hhbc to judge whether error or not\n" "/check-load: how many threads are actively handling requests\n" "/check-queued: how many http requests are queued waiting to be\n" " handled\n" @@ -970,6 +971,42 @@ static bool send_status(Transport *transport, Writer::Format format, bool AdminRequestHandler::handleCheckRequest(const std::string &cmd, Transport *transport) { + if(cmd == "check-repo"){ + string fileMd5Msg, funcMsg, litstrMsg, preClassMsg, unitArrayMsg, + unitLitstrMsg, unitMergeablesMsg, unitSourceLocMsg, unitMsg, magicMsg, writableMsg; + string sendMsg; + bool fileMd5Sel = Repo::get().getMessageFromTable("FileMd5", fileMd5Msg); + bool funcSel = Repo::get().getMessageFromTable("Func", funcMsg); + bool litstrSel = Repo::get().getMessageFromTable("Litstr", litstrMsg); + bool preClassSel = Repo::get().getMessageFromTable("PreClass", preClassMsg); + bool unitArraySel = Repo::get().getMessageFromTable("UnitArray", unitArrayMsg); + bool unitLitstrSel = Repo::get().getMessageFromTable("UnitLitstr", unitLitstrMsg); + bool unitMergeablesSel = Repo::get().getMessageFromTable("UnitMergeables", unitMergeablesMsg); + bool unitSourceLocSel = Repo::get().getMessageFromTable("UnitSourceLoc", unitSourceLocMsg); + bool unitSel = Repo::get().getMessageFromTable("Unit", unitMsg); + bool magicSel = Repo::get().getMessageFromTable("magic", magicMsg); + bool writableSel = Repo::get().getMessageFromTable("writable", writableMsg); + if(fileMd5Sel && funcSel && litstrSel && preClassSel && unitArraySel && unitLitstrSel && unitMergeablesSel + && unitSourceLocSel && unitSel && magicSel && writableSel){ + sendMsg = "hhbc is ok!"; + }else{ + std::stringstream out; + out << fileMd5Msg << endl; + out << funcMsg << endl; + out << litstrMsg << endl; + out << preClassMsg << endl; + out << unitArrayMsg << endl; + out << unitLitstrMsg << endl; + out << unitMergeablesMsg << endl; + out << unitSourceLocMsg << endl; + out << unitMsg << endl; + out << magicMsg << endl; + out << writableMsg << endl; + sendMsg = out.str(); + } + transport->sendString(sendMsg); + return true; + } if (cmd == "check-load") { int count = HttpServer::Server->getPageServer()->getActiveWorker(); transport->sendString(folly::to(count)); diff --git a/hphp/runtime/vm/repo-helpers.h b/hphp/runtime/vm/repo-helpers.h index 487fede5af73e0..5f765290a2e465 100644 --- a/hphp/runtime/vm/repo-helpers.h +++ b/hphp/runtime/vm/repo-helpers.h @@ -26,6 +26,7 @@ #include #include +#include "hphp/util/logger.h" namespace HPHP { @@ -56,6 +57,11 @@ struct RepoExc : std::exception { m_msg = msg; free(msg); } + std::string log_error = "Error: throw RepoExc ==>" + m_msg; + std::string databaseErrorStr = "no such table"; + if(m_msg.find(databaseErrorStr) == std::string::npos){ + Logger::Error(log_error); + } va_end(ap); } const std::string& msg() const { return m_msg; } diff --git a/hphp/runtime/vm/repo.cpp b/hphp/runtime/vm/repo.cpp index 4acb369fbe867b..91a5a89a663de1 100644 --- a/hphp/runtime/vm/repo.cpp +++ b/hphp/runtime/vm/repo.cpp @@ -1094,6 +1094,36 @@ void batchCommit(std::vector> ues) { } } +bool Repo::getMessageFromTable(const std::string & tableName, std::string & message) +{ + std::string messageLogStr; + try{ + RepoTxn txn(*this); + std::stringstream ssSelect; + ssSelect << "SELECT count(*) FROM " + << table(RepoIdCentral, tableName.c_str()) + << " ;"; + RepoStmt stmt(*this); + txn.prepare(stmt, ssSelect.str()); + + RepoTxnQuery query(txn, stmt); + query.step(); + if (!query.row()) { + return false; + } + int countNum = 0; + query.getInt(0, countNum); + std::stringstream ssmessage; + ssmessage << tableName << " :" << countNum; + message = ssmessage.str(); + return true; + }catch(RepoExc& re) { + message = tableName + " :" + re.msg(); + return false; + } + return false; +} + ////////////////////////////////////////////////////////////////////// } diff --git a/hphp/runtime/vm/repo.h b/hphp/runtime/vm/repo.h index 46fb6a25ee92b0..d101003880475f 100644 --- a/hphp/runtime/vm/repo.h +++ b/hphp/runtime/vm/repo.h @@ -159,6 +159,7 @@ struct Repo : RepoProxy { public: std::string table(int repoId, const char* tablePrefix); + bool getMessageFromTable(const std::string & tableName, std::string & message); void exec(const std::string& sQuery); // throws(RepoExc) void begin(); // throws(RepoExc)