diff options
author | unknown <joreland@mysql.com> | 2004-09-16 18:02:41 +0200 |
---|---|---|
committer | unknown <joreland@mysql.com> | 2004-09-16 18:02:41 +0200 |
commit | 2468e5ba46dd94ffbf75298d01141b56e7783589 (patch) | |
tree | 577103ea480f01ddd421ebd50012b8e98596be5a /ndb | |
parent | 3e78c89ed4e4e7d7e9809fad7f08de425850618c (diff) | |
download | mariadb-git-2468e5ba46dd94ffbf75298d01141b56e7783589.tar.gz |
wl1668 -
Add support for getting events via mgmapi
removed all traces of stat port
BitKeeper/deleted/.del-NodeLogLevel.cpp~324045b93af7123b:
Delete: ndb/src/mgmsrv/NodeLogLevel.cpp
BitKeeper/deleted/.del-NodeLogLevel.hpp~4f4ab0fe52fb497c:
Delete: ndb/src/mgmsrv/NodeLogLevel.hpp
BitKeeper/deleted/.del-NodeLogLevelList.cpp~97dc9c909e3e92bf:
Delete: ndb/src/mgmsrv/NodeLogLevelList.cpp
BitKeeper/deleted/.del-NodeLogLevelList.hpp~ef567dd850abddc7:
Delete: ndb/src/mgmsrv/NodeLogLevelList.hpp
ndb/include/debugger/EventLogger.hpp:
Split EventLogger into two classes
ndb/include/kernel/LogLevel.hpp:
Add some nice to have methods + use uint8 for storage
ndb/include/kernel/signaldata/EventSubscribeReq.hpp:
operator=
ndb/include/kernel/signaldata/SetLogLevelOrd.hpp:
operator=
ndb/include/mgmapi/mgmapi.h:
remove deprecated vars
ndb/src/common/debugger/EventLogger.cpp:
Split into 2
ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp:
Remove hardcoded mgm stuff
ndb/src/mgmsrv/CommandInterpreter.cpp:
#if 0
some deprecated code
ndb/src/mgmsrv/Makefile.am:
remove NodeLogLevel*
ndb/src/mgmsrv/MgmtSrvr.cpp:
Remove dead code
Handle multiple event listeners in mgmapi
ndb/src/mgmsrv/MgmtSrvr.hpp:
Remove dead code
Handle multiple event listeners in mgmapi
ndb/src/mgmsrv/Services.cpp:
listen event method in mgmapi
ndb/src/mgmsrv/Services.hpp:
listen event method in mgmapi
ndb/src/mgmsrv/main.cpp:
remove stat port
Diffstat (limited to 'ndb')
-rw-r--r-- | ndb/include/debugger/EventLogger.hpp | 167 | ||||
-rw-r--r-- | ndb/include/kernel/LogLevel.hpp | 24 | ||||
-rw-r--r-- | ndb/include/kernel/signaldata/EventSubscribeReq.hpp | 14 | ||||
-rw-r--r-- | ndb/include/kernel/signaldata/SetLogLevelOrd.hpp | 19 | ||||
-rw-r--r-- | ndb/include/mgmapi/mgmapi.h | 18 | ||||
-rw-r--r-- | ndb/src/common/debugger/EventLogger.cpp | 423 | ||||
-rw-r--r-- | ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp | 33 | ||||
-rw-r--r-- | ndb/src/mgmsrv/CommandInterpreter.cpp | 22 | ||||
-rw-r--r-- | ndb/src/mgmsrv/Makefile.am | 2 | ||||
-rw-r--r-- | ndb/src/mgmsrv/MgmtSrvr.cpp | 439 | ||||
-rw-r--r-- | ndb/src/mgmsrv/MgmtSrvr.hpp | 118 | ||||
-rw-r--r-- | ndb/src/mgmsrv/NodeLogLevel.cpp | 70 | ||||
-rw-r--r-- | ndb/src/mgmsrv/NodeLogLevel.hpp | 54 | ||||
-rw-r--r-- | ndb/src/mgmsrv/NodeLogLevelList.cpp | 182 | ||||
-rw-r--r-- | ndb/src/mgmsrv/NodeLogLevelList.hpp | 93 | ||||
-rw-r--r-- | ndb/src/mgmsrv/Services.cpp | 199 | ||||
-rw-r--r-- | ndb/src/mgmsrv/Services.hpp | 27 | ||||
-rw-r--r-- | ndb/src/mgmsrv/main.cpp | 18 |
18 files changed, 651 insertions, 1271 deletions
diff --git a/ndb/include/debugger/EventLogger.hpp b/ndb/include/debugger/EventLogger.hpp index 6cd6a83e68d..36cece6f22a 100644 --- a/ndb/include/debugger/EventLogger.hpp +++ b/ndb/include/debugger/EventLogger.hpp @@ -24,6 +24,65 @@ #include <kernel/LogLevel.hpp> #include <signaldata/EventReport.hpp> +class EventLoggerBase { +public: + virtual ~EventLoggerBase(); + + /** + * LogLevel settings + */ + LogLevel m_logLevel; + + /** + * Find a category matching the string + * + * @param str string to match. + * @param cat the event category. + * @param exactMatch only do exact matching. + * + * @return TRUE if match is found, then cat is modified + * FALSE if match is not found + */ + static bool matchEventCategory(const char * str, + LogLevel::EventCategory * cat, + bool exactMatch = false); + + /** + * Returns category name or NULL if not found. + * + * @param cat the event category. + * @return category name. + */ + static const char * getEventCategoryName(LogLevel::EventCategory cat); + + /** + * Specifies allowed event categories/log levels. + */ + struct EventCategoryName { + LogLevel::EventCategory category; + const char * name; + }; + + static const EventCategoryName eventCategoryNames[]; + static const Uint32 noOfEventCategoryNames; + + /** + * This matrix defines which event should be printed when + * + * threshold - is in range [0-15] + * severity - DEBUG to ALERT (Type of log message) + */ + struct EventRepLogLevelMatrix { + EventReport::EventType eventType; + LogLevel::EventCategory eventCategory; + Uint32 threshold; + Logger::LoggerLevel severity; + }; + + static const EventRepLogLevelMatrix matrix[]; + static const Uint32 matrixSize; +}; + /** * The EventLogger is primarily used for logging NDB events * in the Management Server. It inherits all logging functionality of Logger. @@ -58,7 +117,7 @@ * @see Logger * @version #@ $Id: EventLogger.hpp,v 1.3 2003/09/01 10:15:52 innpeno Exp $ */ -class EventLogger : public Logger +class EventLogger : public EventLoggerBase, public Logger { public: /** @@ -70,7 +129,7 @@ public: /** * Destructor. */ - ~EventLogger(); + virtual ~EventLogger(); /** * Opens/creates the eventlog with the specified filename. @@ -95,30 +154,23 @@ public: /** * Logs the NDB event. * - * @param nodeId the node id of event origin. - * @param eventType the type of event. - * @param theData the event data. - * @deprecated use log(int eventType, const Uint32* theData, NodeId nodeId) - */ - void log(NodeId nodeId, int eventType, const Uint32* theData); - - /** - * Logs the NDB event. - * * @param eventType the type of event. * @param theData the event data. * @param nodeId the node id of event origin. */ - void log(int eventType, const Uint32* theData, NodeId nodeId = 0); + virtual void log(int eventType, const Uint32* theData, NodeId nodeId = 0); /** - * Returns the current log levels. - * Enable, disable log levels to filter the events that are sent to the - * eventlog. + * Returns the event text for the specified event report type. * - * @return the log level. + * @param type the event type. + * @param theData the event data. + * @param nodeId a node id. + * @return the event report text. */ - LogLevel& getLoglevel(); + static const char* getText(char * dst, size_t dst_len, + int type, + const Uint32* theData, NodeId nodeId = 0); /** * Returns the log level that is used to filter an event. The event will not @@ -127,6 +179,7 @@ public: * @return the log level filter that is used for all event categories. */ int getFilterLevel() const; + /** * Sets log level filter. The event will be logged if * the event category's log level is <= 'filterLevel'. @@ -135,92 +188,16 @@ public: */ void setFilterLevel(int filterLevel); - /** - * Returns the event text for the specified event report type. - * - * @param type the event type. - * @param theData the event data. - * @param nodeId a node id. - * @return the event report text. - */ - static const char* getText(int type, - const Uint32* theData, NodeId nodeId = 0); - - /** - * Find a category matching the string - * - * @param str string to match. - * @param cat the event category. - * @param exactMatch only do exact matching. - * - * @return TRUE if match is found, then cat is modified - * FALSE if match is not found - */ - static bool matchEventCategory(const char * str, - LogLevel::EventCategory * cat, - bool exactMatch = false); - - /** - * Returns category name or NULL if not found. - * - * @param cat the event category. - * @return category name. - */ - static const char * getEventCategoryName(LogLevel::EventCategory cat); - - /** - * Specifies allowed event categories/log levels. - */ - struct EventCategoryName { - LogLevel::EventCategory category; - const char * name; - }; - - static const EventCategoryName eventCategoryNames[]; - static const Uint32 noOfEventCategoryNames; - - /** - * This matrix defines which event should be printed when - * - * threshold - is in range [0-15] - * severity - DEBUG to ALERT (Type of log message) - */ - struct EventRepLogLevelMatrix { - EventReport::EventType eventType; - LogLevel::EventCategory eventCategory; - Uint32 threshold; - Logger::LoggerLevel severity; - }; - - static const EventRepLogLevelMatrix matrix[]; - - /** - * Default log levels for management nodes. - * - * threshold - is in range [0-15] - */ - struct EventLogMatrix { - LogLevel::EventCategory eventCategory; - Uint32 threshold; - }; - - static const EventLogMatrix defEventLogMatrix[]; - - - static const Uint32 matrixSize; - static const Uint32 defEventLogMatrixSize; - private: /** Prohibit */ EventLogger(const EventLogger&); EventLogger operator = (const EventLogger&); bool operator == (const EventLogger&); - LogLevel m_logLevel; Uint32 m_filterLevel; STATIC_CONST(MAX_TEXT_LENGTH = 256); - static char m_text[MAX_TEXT_LENGTH]; + char m_text[MAX_TEXT_LENGTH]; }; diff --git a/ndb/include/kernel/LogLevel.hpp b/ndb/include/kernel/LogLevel.hpp index 10cd0d43bee..e3a81263dcb 100644 --- a/ndb/include/kernel/LogLevel.hpp +++ b/ndb/include/kernel/LogLevel.hpp @@ -130,18 +130,25 @@ public: */ Uint32 getLogLevel(EventCategory ec) const; + /** + * Set this= max(this, ll) per category + */ + LogLevel& set_max(const LogLevel& ll); + + bool operator==(const LogLevel& l) const { + return memcmp(this, &l, sizeof(* this)) == 0; + } + private: /** * The actual data */ - Uint32 logLevelData[LOGLEVEL_CATEGORIES]; - - LogLevel(const LogLevel &); + Uint8 logLevelData[LOGLEVEL_CATEGORIES]; }; inline LogLevel::LogLevel(){ - clear(); + clear(); } inline @@ -176,5 +183,14 @@ LogLevel::getLogLevel(EventCategory ec) const{ return logLevelData[ec]; } +inline +LogLevel & +LogLevel::set_max(const LogLevel & org){ + for(Uint32 i = 0; i<LOGLEVEL_CATEGORIES; i++){ + if(logLevelData[i] < org.logLevelData[i]) + logLevelData[i] = org.logLevelData[i]; + } + return * this; +} #endif diff --git a/ndb/include/kernel/signaldata/EventSubscribeReq.hpp b/ndb/include/kernel/signaldata/EventSubscribeReq.hpp index fd2821ea31d..522f8d9b8d3 100644 --- a/ndb/include/kernel/signaldata/EventSubscribeReq.hpp +++ b/ndb/include/kernel/signaldata/EventSubscribeReq.hpp @@ -27,7 +27,7 @@ * RECIVER: SimBlockCMCtrBlck */ -class EventSubscribeReq { +struct EventSubscribeReq { /** * Receiver(s) */ @@ -38,9 +38,8 @@ class EventSubscribeReq { */ friend class MgmtSrvr; -public: STATIC_CONST( SignalLength = 22 ); -private: + /** * Note: If you use the same blockRef as you have used earlier, * you update your ongoing subscription @@ -55,6 +54,15 @@ private: Uint32 theCategories[10]; Uint32 theLevels[10]; + + EventSubscribeReq& operator= (const LogLevel& ll){ + noOfEntries = _LOGLEVEL_CATEGORIES; + for(size_t i = 0; i<noOfEntries; i++){ + theCategories[i] = i; + theLevels[i] = ll.getLogLevel((LogLevel::EventCategory)i); + } + return * this; + } }; #endif diff --git a/ndb/include/kernel/signaldata/SetLogLevelOrd.hpp b/ndb/include/kernel/signaldata/SetLogLevelOrd.hpp index c3be808cc41..8e1a8add966 100644 --- a/ndb/include/kernel/signaldata/SetLogLevelOrd.hpp +++ b/ndb/include/kernel/signaldata/SetLogLevelOrd.hpp @@ -18,6 +18,7 @@ #define SET_LOGLEVEL_ORD_HPP #include <LogLevel.hpp> +#include "EventSubscribeReq.hpp" #include "SignalData.hpp" /** @@ -51,6 +52,24 @@ private: * Note level is valid as 0-15 */ void setLogLevel(LogLevel::EventCategory ec, int level = 7); + + SetLogLevelOrd& operator= (const LogLevel& ll){ + noOfEntries = _LOGLEVEL_CATEGORIES; + for(size_t i = 0; i<noOfEntries; i++){ + theCategories[i] = i; + theLevels[i] = ll.getLogLevel((LogLevel::EventCategory)i); + } + return * this; + } + + SetLogLevelOrd& operator= (const EventSubscribeReq& ll){ + noOfEntries = ll.noOfEntries; + for(size_t i = 0; i<noOfEntries; i++){ + theCategories[i] = ll.theCategories[i]; + theLevels[i] = ll.theLevels[i]; + } + return * this; + } }; inline diff --git a/ndb/include/mgmapi/mgmapi.h b/ndb/include/mgmapi/mgmapi.h index 929f4b0833b..9caf1c86c4d 100644 --- a/ndb/include/mgmapi/mgmapi.h +++ b/ndb/include/mgmapi/mgmapi.h @@ -56,24 +56,6 @@ extern "C" { #endif /** - * Format of statistical information from the NDB Cluster. - * STATISTIC_LINE is sent on the statistical port from the Management server, - * each line is timestamped with STATISTIC_DATE. - */ -#define STATISTIC_LINE "date=%s epochsecs=%d nodeid=%u trans=%u commit=%u " \ - "read=%u insert=%u attrinfo=%u cops=%u abort=%u" - /** - * Format of statistical information from the NDB Cluster. - * STATISTIC_LINE is sent on the statistical port from the Management server, - * each line is timestamped with STATISTIC_DATE. - */ -#define STATISTIC_DATE "%d-%.2d-%.2d/%.2d:%.2d:%.2d" - /** - * Format of statistical information from the NDB Cluster. - */ -#define OP_STATISTIC_LINE "date=%s epochsecs=%d nodeid=%d operations=%u" - - /** * The NdbMgmHandle. */ typedef struct ndb_mgm_handle * NdbMgmHandle; diff --git a/ndb/src/common/debugger/EventLogger.cpp b/ndb/src/common/debugger/EventLogger.cpp index 69874ab7ecc..2e818c04e02 100644 --- a/ndb/src/common/debugger/EventLogger.cpp +++ b/ndb/src/common/debugger/EventLogger.cpp @@ -28,6 +28,10 @@ // // PUBLIC // +EventLoggerBase::~EventLoggerBase() +{ + +} /** * This matrix defines which event should be printed when @@ -35,105 +39,86 @@ * threshold - is in range [0-15] * severity - DEBUG to ALERT (Type of log message) */ -const EventLogger::EventRepLogLevelMatrix EventLogger::matrix[] = { +const EventLoggerBase::EventRepLogLevelMatrix EventLoggerBase::matrix[] = { // CONNECTION - { EventReport::Connected, LogLevel::llConnection, 8, LL_INFO }, - { EventReport::Disconnected, LogLevel::llConnection, 8, LL_ALERT }, - { EventReport::CommunicationClosed, LogLevel::llConnection, 8, LL_INFO }, - { EventReport::CommunicationOpened, LogLevel::llConnection, 8, LL_INFO }, - { EventReport::ConnectedApiVersion, LogLevel::llConnection, 8, LL_INFO }, + { EventReport::Connected, LogLevel::llConnection, 8, Logger::LL_INFO }, + { EventReport::Disconnected, LogLevel::llConnection, 8, Logger::LL_ALERT }, + { EventReport::CommunicationClosed, LogLevel::llConnection, 8, Logger::LL_INFO }, + { EventReport::CommunicationOpened, LogLevel::llConnection, 8, Logger::LL_INFO }, + { EventReport::ConnectedApiVersion, LogLevel::llConnection, 8, Logger::LL_INFO }, // CHECKPOINT - { EventReport::GlobalCheckpointStarted, LogLevel::llCheckpoint, 9, LL_INFO }, - { EventReport::GlobalCheckpointCompleted,LogLevel::llCheckpoint,10, LL_INFO }, - { EventReport::LocalCheckpointStarted, LogLevel::llCheckpoint, 7, LL_INFO }, - { EventReport::LocalCheckpointCompleted,LogLevel::llCheckpoint, 8, LL_INFO }, - { EventReport::LCPStoppedInCalcKeepGci, LogLevel::llCheckpoint, 0, LL_ALERT }, - { EventReport::LCPFragmentCompleted, LogLevel::llCheckpoint, 11, LL_INFO }, - { EventReport::UndoLogBlocked, LogLevel::llCheckpoint, 7, LL_INFO }, + { EventReport::GlobalCheckpointStarted, LogLevel::llCheckpoint, 9, Logger::LL_INFO }, + { EventReport::GlobalCheckpointCompleted,LogLevel::llCheckpoint,10, Logger::LL_INFO }, + { EventReport::LocalCheckpointStarted, LogLevel::llCheckpoint, 7, Logger::LL_INFO }, + { EventReport::LocalCheckpointCompleted,LogLevel::llCheckpoint, 8, Logger::LL_INFO }, + { EventReport::LCPStoppedInCalcKeepGci, LogLevel::llCheckpoint, 0, Logger::LL_ALERT }, + { EventReport::LCPFragmentCompleted, LogLevel::llCheckpoint, 11, Logger::LL_INFO }, + { EventReport::UndoLogBlocked, LogLevel::llCheckpoint, 7, Logger::LL_INFO }, // STARTUP - { EventReport::NDBStartStarted, LogLevel::llStartUp, 1, LL_INFO }, - { EventReport::NDBStartCompleted, LogLevel::llStartUp, 1, LL_INFO }, - { EventReport::STTORRYRecieved, LogLevel::llStartUp,15, LL_INFO }, - { EventReport::StartPhaseCompleted, LogLevel::llStartUp, 4, LL_INFO }, - { EventReport::CM_REGCONF, LogLevel::llStartUp, 3, LL_INFO }, - { EventReport::CM_REGREF, LogLevel::llStartUp, 8, LL_INFO }, - { EventReport::FIND_NEIGHBOURS, LogLevel::llStartUp, 8, LL_INFO }, - { EventReport::NDBStopStarted, LogLevel::llStartUp, 1, LL_INFO }, - { EventReport::NDBStopAborted, LogLevel::llStartUp, 1, LL_INFO }, - { EventReport::StartREDOLog, LogLevel::llStartUp, 10, LL_INFO }, - { EventReport::StartLog, LogLevel::llStartUp, 10, LL_INFO }, - { EventReport::UNDORecordsExecuted, LogLevel::llStartUp, 15, LL_INFO }, + { EventReport::NDBStartStarted, LogLevel::llStartUp, 1, Logger::LL_INFO }, + { EventReport::NDBStartCompleted, LogLevel::llStartUp, 1, Logger::LL_INFO }, + { EventReport::STTORRYRecieved, LogLevel::llStartUp,15, Logger::LL_INFO }, + { EventReport::StartPhaseCompleted, LogLevel::llStartUp, 4, Logger::LL_INFO }, + { EventReport::CM_REGCONF, LogLevel::llStartUp, 3, Logger::LL_INFO }, + { EventReport::CM_REGREF, LogLevel::llStartUp, 8, Logger::LL_INFO }, + { EventReport::FIND_NEIGHBOURS, LogLevel::llStartUp, 8, Logger::LL_INFO }, + { EventReport::NDBStopStarted, LogLevel::llStartUp, 1, Logger::LL_INFO }, + { EventReport::NDBStopAborted, LogLevel::llStartUp, 1, Logger::LL_INFO }, + { EventReport::StartREDOLog, LogLevel::llStartUp, 10, Logger::LL_INFO }, + { EventReport::StartLog, LogLevel::llStartUp, 10, Logger::LL_INFO }, + { EventReport::UNDORecordsExecuted, LogLevel::llStartUp, 15, Logger::LL_INFO }, // NODERESTART - { EventReport::NR_CopyDict, LogLevel::llNodeRestart, 8, LL_INFO }, - { EventReport::NR_CopyDistr, LogLevel::llNodeRestart, 8, LL_INFO }, - { EventReport::NR_CopyFragsStarted, LogLevel::llNodeRestart, 8, LL_INFO }, - { EventReport::NR_CopyFragDone, LogLevel::llNodeRestart, 10, LL_INFO }, - { EventReport::NR_CopyFragsCompleted, LogLevel::llNodeRestart, 8, LL_INFO }, + { EventReport::NR_CopyDict, LogLevel::llNodeRestart, 8, Logger::LL_INFO }, + { EventReport::NR_CopyDistr, LogLevel::llNodeRestart, 8, Logger::LL_INFO }, + { EventReport::NR_CopyFragsStarted, LogLevel::llNodeRestart, 8, Logger::LL_INFO }, + { EventReport::NR_CopyFragDone, LogLevel::llNodeRestart, 10, Logger::LL_INFO }, + { EventReport::NR_CopyFragsCompleted, LogLevel::llNodeRestart, 8, Logger::LL_INFO }, - { EventReport::NodeFailCompleted, LogLevel::llNodeRestart, 8, LL_ALERT}, - { EventReport::NODE_FAILREP, LogLevel::llNodeRestart, 8, LL_ALERT}, - { EventReport::ArbitState, LogLevel::llNodeRestart, 6, LL_INFO }, - { EventReport::ArbitResult, LogLevel::llNodeRestart, 2, LL_ALERT}, - { EventReport::GCP_TakeoverStarted, LogLevel::llNodeRestart, 7, LL_INFO }, - { EventReport::GCP_TakeoverCompleted, LogLevel::llNodeRestart, 7, LL_INFO }, - { EventReport::LCP_TakeoverStarted, LogLevel::llNodeRestart, 7, LL_INFO }, - { EventReport::LCP_TakeoverCompleted, LogLevel::llNodeRestart, 7, LL_INFO }, + { EventReport::NodeFailCompleted, LogLevel::llNodeRestart, 8, Logger::LL_ALERT}, + { EventReport::NODE_FAILREP, LogLevel::llNodeRestart, 8, Logger::LL_ALERT}, + { EventReport::ArbitState, LogLevel::llNodeRestart, 6, Logger::LL_INFO }, + { EventReport::ArbitResult, LogLevel::llNodeRestart, 2, Logger::LL_ALERT}, + { EventReport::GCP_TakeoverStarted, LogLevel::llNodeRestart, 7, Logger::LL_INFO }, + { EventReport::GCP_TakeoverCompleted, LogLevel::llNodeRestart, 7, Logger::LL_INFO }, + { EventReport::LCP_TakeoverStarted, LogLevel::llNodeRestart, 7, Logger::LL_INFO }, + { EventReport::LCP_TakeoverCompleted, LogLevel::llNodeRestart, 7, Logger::LL_INFO }, // STATISTIC - { EventReport::TransReportCounters, LogLevel::llStatistic, 8, LL_INFO }, - { EventReport::OperationReportCounters, LogLevel::llStatistic, 8, LL_INFO }, - { EventReport::TableCreated, LogLevel::llStatistic, 7, LL_INFO }, - { EventReport::JobStatistic, LogLevel::llStatistic, 9, LL_INFO }, - { EventReport::SendBytesStatistic, LogLevel::llStatistic, 9, LL_INFO }, - { EventReport::ReceiveBytesStatistic, LogLevel::llStatistic, 9, LL_INFO }, - { EventReport::MemoryUsage, LogLevel::llStatistic, 5, LL_INFO }, + { EventReport::TransReportCounters, LogLevel::llStatistic, 8, Logger::LL_INFO }, + { EventReport::OperationReportCounters, LogLevel::llStatistic, 8, Logger::LL_INFO }, + { EventReport::TableCreated, LogLevel::llStatistic, 7, Logger::LL_INFO }, + { EventReport::JobStatistic, LogLevel::llStatistic, 9, Logger::LL_INFO }, + { EventReport::SendBytesStatistic, LogLevel::llStatistic, 9, Logger::LL_INFO }, + { EventReport::ReceiveBytesStatistic, LogLevel::llStatistic, 9, Logger::LL_INFO }, + { EventReport::MemoryUsage, LogLevel::llStatistic, 5, Logger::LL_INFO }, // ERROR - { EventReport::TransporterError, LogLevel::llError, 2, LL_ERROR }, - { EventReport::TransporterWarning, LogLevel::llError, 8, LL_WARNING }, - { EventReport::MissedHeartbeat, LogLevel::llError, 8, LL_WARNING }, - { EventReport::DeadDueToHeartbeat, LogLevel::llError, 8, LL_ALERT }, - { EventReport::WarningEvent, LogLevel::llError, 2, LL_WARNING }, + { EventReport::TransporterError, LogLevel::llError, 2, Logger::LL_ERROR }, + { EventReport::TransporterWarning, LogLevel::llError, 8, Logger::LL_WARNING }, + { EventReport::MissedHeartbeat, LogLevel::llError, 8, Logger::LL_WARNING }, + { EventReport::DeadDueToHeartbeat, LogLevel::llError, 8, Logger::LL_ALERT }, + { EventReport::WarningEvent, LogLevel::llError, 2, Logger::LL_WARNING }, // INFO - { EventReport::SentHeartbeat, LogLevel::llInfo, 12, LL_INFO }, - { EventReport::CreateLogBytes, LogLevel::llInfo, 11, LL_INFO }, - { EventReport::InfoEvent, LogLevel::llInfo, 2, LL_INFO }, + { EventReport::SentHeartbeat, LogLevel::llInfo, 12, Logger::LL_INFO }, + { EventReport::CreateLogBytes, LogLevel::llInfo, 11, Logger::LL_INFO }, + { EventReport::InfoEvent, LogLevel::llInfo, 2, Logger::LL_INFO }, //Global replication - { EventReport::GrepSubscriptionInfo, LogLevel::llGrep, 7, LL_INFO}, - { EventReport::GrepSubscriptionAlert, LogLevel::llGrep, 7, LL_ALERT} + { EventReport::GrepSubscriptionInfo, LogLevel::llGrep, 7, Logger::LL_INFO}, + { EventReport::GrepSubscriptionAlert, LogLevel::llGrep, 7, Logger::LL_ALERT} }; -const Uint32 EventLogger::matrixSize = sizeof(EventLogger::matrix)/ +const Uint32 EventLoggerBase::matrixSize = sizeof(EventLoggerBase::matrix)/ sizeof(EventRepLogLevelMatrix); /** - * Default log levels for management nodes. - * - * threshold - is in range [0-15] - */ -const EventLogger::EventLogMatrix EventLogger::defEventLogMatrix[] = { - { LogLevel::llStartUp, 7 }, - { LogLevel::llShutdown, 7 }, - { LogLevel::llStatistic, 7 }, - { LogLevel::llCheckpoint, 7 }, - { LogLevel::llNodeRestart, 7 }, - { LogLevel::llConnection, 7 }, - { LogLevel::llError, 15 }, - { LogLevel::llInfo, 7 }, - { LogLevel::llGrep, 7 } -}; - -const Uint32 -EventLogger::defEventLogMatrixSize = sizeof(EventLogger::defEventLogMatrix)/ - sizeof(EventLogMatrix); -/** * Specifies allowed event categories/log levels that can be set from * the Management API/interactive shell. */ -const EventLogger::EventCategoryName EventLogger::eventCategoryNames[] = { +const EventLoggerBase::EventCategoryName +EventLoggerBase::eventCategoryNames[] = { { LogLevel::llStartUp, "STARTUP" }, { LogLevel::llStatistic, "STATISTICS" }, { LogLevel::llCheckpoint, "CHECKPOINT" }, @@ -144,13 +129,13 @@ const EventLogger::EventCategoryName EventLogger::eventCategoryNames[] = { }; const Uint32 -EventLogger::noOfEventCategoryNames = sizeof(EventLogger::eventCategoryNames)/ - sizeof(EventLogger::EventCategoryName); - -char EventLogger::m_text[MAX_TEXT_LENGTH]; +EventLoggerBase::noOfEventCategoryNames = + sizeof(EventLoggerBase::eventCategoryNames)/ + sizeof(EventLoggerBase::EventCategoryName); const char* -EventLogger::getText(int type, +EventLogger::getText(char * m_text, size_t m_text_len, + int type, const Uint32* theData, NodeId nodeId) { // TODO: Change the switch implementation... @@ -164,13 +149,13 @@ EventLogger::getText(int type, EventReport::EventType eventType = (EventReport::EventType)type; switch (eventType){ case EventReport::Connected: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sNode %u Connected", theNodeId, theData[1]); break; case EventReport::ConnectedApiVersion: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sNode %u: API version %d.%d.%d", theNodeId, theData[1], @@ -179,7 +164,7 @@ EventLogger::getText(int type, getBuild(theData[2])); break; case EventReport::Disconnected: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sNode %u Disconnected", theNodeId, theData[1]); @@ -188,7 +173,7 @@ EventLogger::getText(int type, //----------------------------------------------------------------------- // REPORT communication to node closed. //----------------------------------------------------------------------- - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sCommunication to Node %u closed", theNodeId, theData[1]); @@ -197,7 +182,7 @@ EventLogger::getText(int type, //----------------------------------------------------------------------- // REPORT communication to node opened. //----------------------------------------------------------------------- - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sCommunication to Node %u opened", theNodeId, theData[1]); @@ -206,7 +191,7 @@ EventLogger::getText(int type, //----------------------------------------------------------------------- // Start of NDB has been initiated. //----------------------------------------------------------------------- - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sStart initiated (version %d.%d.%d)", theNodeId , getMajor(theData[1]), @@ -214,13 +199,13 @@ EventLogger::getText(int type, getBuild(theData[1])); break; case EventReport::NDBStopStarted: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%s%s shutdown initiated", theNodeId, (theData[1] == 1 ? "Cluster" : "Node")); break; case EventReport::NDBStopAborted: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sNode shutdown aborted", theNodeId); break; @@ -228,7 +213,7 @@ EventLogger::getText(int type, //----------------------------------------------------------------------- // Start of NDB has been completed. //----------------------------------------------------------------------- - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sStarted (version %d.%d.%d)", theNodeId , getMajor(theData[1]), @@ -240,7 +225,7 @@ EventLogger::getText(int type, //----------------------------------------------------------------------- // STTORRY recevied after restart finished. //----------------------------------------------------------------------- - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sSTTORRY received after restart finished", theNodeId); break; @@ -266,7 +251,7 @@ EventLogger::getText(int type, type = ""; break; default:{ - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sStart phase %u completed (unknown = %d)", theNodeId, theData[1], @@ -274,7 +259,7 @@ EventLogger::getText(int type, return m_text; } } - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sStart phase %u completed %s", theNodeId, theData[1], @@ -283,7 +268,7 @@ EventLogger::getText(int type, break; } case EventReport::CM_REGCONF: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sCM_REGCONF president = %u, own Node = %u, our dynamic id = %u" , theNodeId, @@ -315,7 +300,7 @@ EventLogger::getText(int type, break; }//switch - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sCM_REGREF from Node %u to our Node %u. Cause = %s", theNodeId, theData[2], @@ -328,7 +313,7 @@ EventLogger::getText(int type, // REPORT Node Restart copied a fragment. //----------------------------------------------------------------------- ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sWe are Node %u with dynamic ID %u, our left neighbour " "is Node %u, our right is Node %u", theNodeId, @@ -344,13 +329,13 @@ EventLogger::getText(int type, if (theData[1] == 0) { if (theData[3] != 0) { - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sNode %u completed failure of Node %u", theNodeId, theData[3], theData[2]); } else { - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sAll nodes completed failure of Node %u", theNodeId, theData[2]); @@ -367,7 +352,7 @@ EventLogger::getText(int type, line = "DBLQH"; } - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sNode failure of %u %s completed", theNodeId, theData[2], @@ -376,7 +361,7 @@ EventLogger::getText(int type, break; case EventReport::NODE_FAILREP: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sNode %u has failed. The Node state at failure " "was %u", theNodeId, @@ -395,41 +380,41 @@ EventLogger::getText(int type, const unsigned state = sd->code >> 16; switch (code) { case ArbitCode::ThreadStart: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sPresident restarts arbitration thread [state=%u]", theNodeId, state); break; case ArbitCode::PrepPart2: sd->ticket.getText(ticketText, sizeof(ticketText)); - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sPrepare arbitrator node %u [ticket=%s]", theNodeId, sd->node, ticketText); break; case ArbitCode::PrepAtrun: sd->ticket.getText(ticketText, sizeof(ticketText)); - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sReceive arbitrator node %u [ticket=%s]", theNodeId, sd->node, ticketText); break; case ArbitCode::ApiStart: sd->ticket.getText(ticketText, sizeof(ticketText)); - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sStarted arbitrator node %u [ticket=%s]", theNodeId, sd->node, ticketText); break; case ArbitCode::ApiFail: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sLost arbitrator node %u - process failure [state=%u]", theNodeId, sd->node, state); break; case ArbitCode::ApiExit: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sLost arbitrator node %u - process exit [state=%u]", theNodeId, sd->node, state); break; default: ArbitCode::getErrText(code, errText, sizeof(errText)); - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sLost arbitrator node %u - %s [state=%u]", theNodeId, sd->node, errText, state); break; @@ -446,48 +431,48 @@ EventLogger::getText(int type, const unsigned state = sd->code >> 16; switch (code) { case ArbitCode::LoseNodes: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sArbitration check lost - less than 1/2 nodes left", theNodeId); break; case ArbitCode::WinGroups: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sArbitration check won - node group majority", theNodeId); break; case ArbitCode::LoseGroups: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sArbitration check lost - missing node group", theNodeId); break; case ArbitCode::Partitioning: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sNetwork partitioning - arbitration required", theNodeId); break; case ArbitCode::WinChoose: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sArbitration won - positive reply from node %u", theNodeId, sd->node); break; case ArbitCode::LoseChoose: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sArbitration lost - negative reply from node %u", theNodeId, sd->node); break; case ArbitCode::LoseNorun: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sNetwork partitioning - no arbitrator available", theNodeId); break; case ArbitCode::LoseNocfg: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sNetwork partitioning - no arbitrator configured", theNodeId); break; default: ArbitCode::getErrText(code, errText, sizeof(errText)); - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sArbitration failure - %s [state=%u]", theNodeId, errText, state); break; @@ -500,7 +485,7 @@ EventLogger::getText(int type, // node is the master of this global checkpoint. //----------------------------------------------------------------------- ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sGlobal checkpoint %u started", theNodeId, theData[1]); @@ -510,7 +495,7 @@ EventLogger::getText(int type, // This event reports that a global checkpoint has been completed on this // node and the node is the master of this global checkpoint. //----------------------------------------------------------------------- - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sGlobal checkpoint %u completed", theNodeId, theData[1]); @@ -521,7 +506,7 @@ EventLogger::getText(int type, // node is the master of this local checkpoint. //----------------------------------------------------------------------- ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sLocal checkpoint %u started. " "Keep GCI = %u oldest restorable GCI = %u", theNodeId, @@ -535,7 +520,7 @@ EventLogger::getText(int type, // node and the node is the master of this local checkpoint. //----------------------------------------------------------------------- ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sLocal checkpoint %u completed", theNodeId, theData[1]); @@ -544,14 +529,14 @@ EventLogger::getText(int type, //----------------------------------------------------------------------- // This event reports that a table has been created. //----------------------------------------------------------------------- - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sTable with ID = %u created", theNodeId, theData[1]); break; case EventReport::LCPStoppedInCalcKeepGci: if (theData[1] == 0) - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sLocal Checkpoint stopped in CALCULATED_KEEP_GCI", theNodeId); break; @@ -560,7 +545,7 @@ EventLogger::getText(int type, // REPORT Node Restart completed copy of dictionary information. //----------------------------------------------------------------------- ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sNode restart completed copy of dictionary information", theNodeId); break; @@ -569,7 +554,7 @@ EventLogger::getText(int type, // REPORT Node Restart completed copy of distribution information. //----------------------------------------------------------------------- ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sNode restart completed copy of distribution information", theNodeId); break; @@ -578,7 +563,7 @@ EventLogger::getText(int type, // REPORT Node Restart is starting to copy the fragments. //----------------------------------------------------------------------- ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sNode restart starting to copy the fragments " "to Node %u", theNodeId, @@ -589,7 +574,7 @@ EventLogger::getText(int type, // REPORT Node Restart copied a fragment. //----------------------------------------------------------------------- ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sTable ID = %u, fragment ID = %u have been copied " "to Node %u", theNodeId, @@ -599,7 +584,7 @@ EventLogger::getText(int type, break; case EventReport::NR_CopyFragsCompleted: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sNode restart completed copying the fragments " "to Node %u", theNodeId, @@ -607,7 +592,7 @@ EventLogger::getText(int type, break; case EventReport::LCPFragmentCompleted: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sTable ID = %u, fragment ID = %u has completed LCP " "on Node %u", theNodeId, @@ -620,7 +605,7 @@ EventLogger::getText(int type, // Report information about transaction activity once per 10 seconds. // ------------------------------------------------------------------- ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sTrans. Count = %u, Commit Count = %u, " "Read Count = %u, Simple Read Count = %u,\n" "Write Count = %u, AttrInfo Count = %u, " @@ -639,7 +624,7 @@ EventLogger::getText(int type, theData[10]); break; case EventReport::OperationReportCounters: - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%sOperations=%u", theNodeId, theData[1]); @@ -649,7 +634,7 @@ EventLogger::getText(int type, // REPORT Undo Logging blocked due to buffer near to overflow. //----------------------------------------------------------------------- ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sACC Blocked %u and TUP Blocked %u times last second", theNodeId, theData[1], @@ -658,7 +643,7 @@ EventLogger::getText(int type, case EventReport::TransporterError: case EventReport::TransporterWarning: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sTransporter to node %d reported error 0x%x", theNodeId, theData[1], @@ -669,7 +654,7 @@ EventLogger::getText(int type, // REPORT Undo Logging blocked due to buffer near to overflow. //----------------------------------------------------------------------- ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sNode %d missed heartbeat %d", theNodeId, theData[1], @@ -680,21 +665,21 @@ EventLogger::getText(int type, // REPORT Undo Logging blocked due to buffer near to overflow. //----------------------------------------------------------------------- ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sNode %d declared dead due to missed heartbeat", theNodeId, theData[1]); break; case EventReport::JobStatistic: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sMean loop Counter in doJob last 8192 times = %u", theNodeId, theData[1]); break; case EventReport::SendBytesStatistic: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sMean send size to Node = %d last 4096 sends = %u bytes", theNodeId, theData[1], @@ -702,7 +687,7 @@ EventLogger::getText(int type, break; case EventReport::ReceiveBytesStatistic: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sMean receive size to Node = %d last 4096 sends = %u bytes", theNodeId, theData[1], @@ -710,14 +695,14 @@ EventLogger::getText(int type, break; case EventReport::SentHeartbeat: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sNode Sent Heartbeat to node = %d", theNodeId, theData[1]); break; case EventReport::CreateLogBytes: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sLog part %u, log file %u, MB %u", theNodeId, theData[1], @@ -726,7 +711,7 @@ EventLogger::getText(int type, break; case EventReport::StartLog: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sLog part %u, start MB %u, stop MB %u, last GCI, log exec %u", theNodeId, theData[1], @@ -736,7 +721,7 @@ EventLogger::getText(int type, break; case EventReport::StartREDOLog: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sNode: %d StartLog: [GCI Keep: %d LastCompleted: %d NewestRestorable: %d]", theNodeId, theData[1], @@ -753,7 +738,7 @@ EventLogger::getText(int type, } ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%s UNDO %s %d [%d %d %d %d %d %d %d %d %d]", theNodeId, line, @@ -771,36 +756,36 @@ EventLogger::getText(int type, break; case EventReport::InfoEvent: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%s%s", theNodeId, (char *)&theData[1]); break; case EventReport::WarningEvent: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%s%s", theNodeId, (char *)&theData[1]); break; case EventReport::GCP_TakeoverStarted: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sGCP Take over started", theNodeId); break; case EventReport::GCP_TakeoverCompleted: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sGCP Take over completed", theNodeId); break; case EventReport::LCP_TakeoverStarted: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sLCP Take over started", theNodeId); break; case EventReport::LCP_TakeoverCompleted: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sLCP Take over completed (state = %d)", theNodeId, theData[1]); break; @@ -812,7 +797,7 @@ EventLogger::getText(int type, const int block = theData[5]; const int percent = (used*100)/total; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "%s%s usage %s %d%s(%d %dK pages of total %d)", theNodeId, (block==DBACC ? "Index" : (block == DBTUP ?"Data":"<unknown>")), @@ -833,7 +818,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: Created subscription id" " (subId=%d,SubKey=%d)" " Return code: %d.", @@ -847,7 +832,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: Created subscription id" " (subId=%d,SubKey=%d)" " Return code: %d.", @@ -862,7 +847,7 @@ EventLogger::getText(int type, const int subKey = theData[3]; const int err = theData[4]; const int nodegrp = theData[5]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: Created subscription using" " (subId=%d,SubKey=%d)" " in primary system. Primary system has %d nodegroup(s)." @@ -878,7 +863,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: All participants have created " "subscriptions" " using (subId=%d,SubKey=%d)." @@ -893,7 +878,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: Logging started on meta data changes." " using (subId=%d,SubKey=%d)" " Return code: %d", @@ -907,7 +892,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: All participants have started " "logging meta data" " changes on the subscription subId=%d,SubKey=%d) " @@ -922,7 +907,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: Logging started on table data changes " " using (subId=%d,SubKey=%d)" " Return code: %d", @@ -936,7 +921,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: All participants have started logging " "table data changes on the subscription " "subId=%d,SubKey=%d)." @@ -951,7 +936,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: All participants have started " " synchronization on meta data (META SCAN) using " "(subId=%d,SubKey=%d)." @@ -966,7 +951,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: Synchronization started (META SCAN) on " " meta data using (subId=%d,SubKey=%d)" " Return code: %d", @@ -980,7 +965,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: All participants have started " "synchronization " " on table data (DATA SCAN) using (subId=%d,SubKey=%d)." @@ -996,7 +981,7 @@ EventLogger::getText(int type, const int subKey = theData[3]; const int err = theData[4]; const int gci = theData[5]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: Synchronization started (DATA SCAN) on " "table data using (subId=%d,SubKey=%d). GCI = %d" " Return code: %d", @@ -1011,7 +996,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: All participants have removed " "subscription (subId=%d,SubKey=%d). I have cleaned " "up resources I've used." @@ -1026,7 +1011,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: Removed subscription " "(subId=%d,SubKey=%d)" " Return code: %d", @@ -1037,7 +1022,7 @@ EventLogger::getText(int type, } default: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sUnknown GrepSubscriptonInfo event: %d", theNodeId, theData[1]); @@ -1055,7 +1040,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord:Error code: %d Error message: %s" " (subId=%d,SubKey=%d)", err, @@ -1069,7 +1054,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: FAILED to Created subscription using" " (subId=%d,SubKey=%d)in primary system." " Error code: %d Error Message: %s", @@ -1084,7 +1069,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: Logging failed to start on meta " "data changes." " using (subId=%d,SubKey=%d)" @@ -1100,7 +1085,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: Logging FAILED to start on table data " " changes using (subId=%d,SubKey=%d)" " Error code: %d Error Message: %s", @@ -1115,7 +1100,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: Synchronization FAILED (META SCAN) on " " meta data using (subId=%d,SubKey=%d)" " Error code: %d Error Message: %s", @@ -1131,7 +1116,7 @@ EventLogger::getText(int type, const int subKey = theData[3]; const int err = theData[4]; const int gci = theData[5]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: Synchronization FAILED (DATA SCAN) on " "table data using (subId=%d,SubKey=%d). GCI = %d" " Error code: %d Error Message: %s", @@ -1147,7 +1132,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::SSCoord: Failed to remove subscription " "(subId=%d,SubKey=%d). " " Error code: %d Error Message: %s", @@ -1164,7 +1149,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: Error code: %d Error Message: %s" " (subId=%d,SubKey=%d)", err, @@ -1178,7 +1163,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: FAILED to Created subscription using" " (subId=%d,SubKey=%d)in primary system." " Error code: %d Error Message: %s", @@ -1193,7 +1178,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: Logging failed to start on meta " "data changes." " using (subId=%d,SubKey=%d)" @@ -1209,7 +1194,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: Logging FAILED to start on table data " " changes using (subId=%d,SubKey=%d)" " Error code: %d Error Message: %s", @@ -1224,7 +1209,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: Synchronization FAILED (META SCAN) on " " meta data using (subId=%d,SubKey=%d)" " Error code: %d Error Message: %s", @@ -1240,7 +1225,7 @@ EventLogger::getText(int type, const int subKey = theData[3]; const int err = theData[4]; const int gci = theData[5]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: Synchronization FAILED (DATA SCAN) on " "table data using (subId=%d,SubKey=%d). GCI = %d. " " Error code: %d Error Message: %s", @@ -1256,7 +1241,7 @@ EventLogger::getText(int type, const int subId = theData[2]; const int subKey = theData[3]; const int err = theData[4]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Grep::PSCoord: Failed to remove subscription " "(subId=%d,SubKey=%d)." " Error code: %d Error Message: %s", @@ -1270,7 +1255,7 @@ EventLogger::getText(int type, { const int err = theData[4]; const int nodeId = theData[5]; - ::snprintf(m_text, sizeof(m_text), + ::snprintf(m_text, m_text_len, "Rep: Node %d." " Error code: %d Error Message: %s", nodeId, @@ -1282,7 +1267,7 @@ EventLogger::getText(int type, default: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sUnknown GrepSubscriptionAlert event: %d", theNodeId, theData[1]); @@ -1293,7 +1278,7 @@ EventLogger::getText(int type, default: ::snprintf(m_text, - sizeof(m_text), + m_text_len, "%sUnknown event: %d", theNodeId, theData[0]); @@ -1303,9 +1288,9 @@ EventLogger::getText(int type, } bool -EventLogger::matchEventCategory(const char * str, - LogLevel::EventCategory * cat, - bool exactMatch){ +EventLoggerBase::matchEventCategory(const char * str, + LogLevel::EventCategory * cat, + bool exactMatch){ unsigned i; if(cat == 0 || str == 0) return false; @@ -1326,7 +1311,7 @@ EventLogger::matchEventCategory(const char * str, } const char * -EventLogger::getEventCategoryName(LogLevel::EventCategory cat){ +EventLoggerBase::getEventCategoryName(LogLevel::EventCategory cat){ for(unsigned i = 0; i<noOfEventCategoryNames; i++){ if(cat == eventCategoryNames[i].category){ @@ -1337,19 +1322,19 @@ EventLogger::getEventCategoryName(LogLevel::EventCategory cat){ } -EventLogger::EventLogger() : Logger(), m_logLevel(), m_filterLevel(15) +EventLogger::EventLogger() : m_filterLevel(15) { setCategory("EventLogger"); m_logLevel.setLogLevel(LogLevel::llStartUp, m_filterLevel); m_logLevel.setLogLevel(LogLevel::llShutdown, m_filterLevel); - // m_logLevel.setLogLevel(LogLevel::llStatistic, m_filterLevel); - // m_logLevel.setLogLevel(LogLevel::llCheckpoint, m_filterLevel); + m_logLevel.setLogLevel(LogLevel::llStatistic, m_filterLevel); + m_logLevel.setLogLevel(LogLevel::llCheckpoint, m_filterLevel); m_logLevel.setLogLevel(LogLevel::llNodeRestart, m_filterLevel); m_logLevel.setLogLevel(LogLevel::llConnection, m_filterLevel); m_logLevel.setLogLevel(LogLevel::llError, m_filterLevel); m_logLevel.setLogLevel(LogLevel::llInfo, m_filterLevel); - enable(Logger::LL_INFO, Logger::LL_ALERT); // Log INFO to ALERT - + enable(Logger::Logger::LL_INFO, Logger::Logger::LL_ALERT); // Log INFO to ALERT + } EventLogger::~EventLogger() @@ -1371,65 +1356,61 @@ EventLogger::close() } void -EventLogger::log(NodeId nodeId, int eventType, const Uint32* theData) -{ - log(eventType, theData, nodeId); -} - -void EventLogger::log(int eventType, const Uint32* theData, NodeId nodeId) { Uint32 threshold = 0; - Logger::LoggerLevel severity = LL_WARNING; + Logger::LoggerLevel severity = Logger::LL_WARNING; + LogLevel::EventCategory cat; for(unsigned i = 0; i<EventLogger::matrixSize; i++){ if(EventLogger::matrix[i].eventType == eventType){ - const LogLevel::EventCategory cat = EventLogger::matrix[i].eventCategory; - threshold = m_logLevel.getLogLevel(cat); + cat = EventLogger::matrix[i].eventCategory; + threshold = EventLogger::matrix[i].threshold; severity = EventLogger::matrix[i].severity; break; } } - - if (threshold <= m_filterLevel){ + + if (threshold <= m_logLevel.getLogLevel(cat)){ switch (severity){ - case LL_ALERT: - alert(EventLogger::getText(eventType, theData, nodeId)); + case Logger::LL_ALERT: + alert(EventLogger::getText(m_text, sizeof(m_text), + eventType, theData, nodeId)); break; - case LL_CRITICAL: - critical(EventLogger::getText(eventType, theData, nodeId)); + case Logger::LL_CRITICAL: + critical(EventLogger::getText(m_text, sizeof(m_text), + eventType, theData, nodeId)); break; - case LL_WARNING: - warning(EventLogger::getText(eventType, theData, nodeId)); + case Logger::LL_WARNING: + warning(EventLogger::getText(m_text, sizeof(m_text), + eventType, theData, nodeId)); break; - case LL_ERROR: - error(EventLogger::getText(eventType, theData, nodeId)); + case Logger::LL_ERROR: + error(EventLogger::getText(m_text, sizeof(m_text), + eventType, theData, nodeId)); break; - case LL_INFO: - info(EventLogger::getText(eventType, theData, nodeId)); + case Logger::LL_INFO: + info(EventLogger::getText(m_text, sizeof(m_text), + eventType, theData, nodeId)); break; - case LL_DEBUG: - debug(EventLogger::getText(eventType, theData, nodeId)); + case Logger::LL_DEBUG: + debug(EventLogger::getText(m_text, sizeof(m_text), + eventType, theData, nodeId)); break; default: - info(EventLogger::getText(eventType, theData, nodeId)); + info(EventLogger::getText(m_text, sizeof(m_text), + eventType, theData, nodeId)); break; } } // if (.. } -LogLevel& -EventLogger::getLoglevel() -{ - return m_logLevel; -} - int EventLogger::getFilterLevel() const { diff --git a/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp b/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp index e2085eb612c..fff6c734bd3 100644 --- a/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp +++ b/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp @@ -250,17 +250,7 @@ Cmvmi::execEVENT_SUBSCRIBE_REQ(Signal * signal){ sendSignal(subReq->blockRef, GSN_EVENT_SUBSCRIBE_REF, signal, 1, JBB); return; } - /** - * If it's a new subscription, clear the loglevel - * - * Clear only if noOfEntries is 0, this is needed beacuse we set - * the default loglevels for the MGMT nodes during the inital connect phase. - * See reportConnected(). - */ - if (subReq->noOfEntries == 0){ - ptr.p->logLevel.clear(); - } - + ptr.p->logLevel.clear(); ptr.p->blockRef = subReq->blockRef; } @@ -384,11 +374,6 @@ void Cmvmi::execCLOSE_COMREQ(Signal* signal) globalTransporterRegistry.setIOState(i, HaltIO); globalTransporterRegistry.do_disconnect(i); - - /** - * Cancel possible event subscription - */ - cancelSubscription(i); } } if (failNo != 0) { @@ -494,6 +479,8 @@ void Cmvmi::execDISCONNECT_REP(Signal *signal) globalTransporterRegistry.do_connect(hostId); } + cancelSubscription(hostId); + signal->theData[0] = EventReport::Disconnected; signal->theData[1] = hostId; sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB); @@ -539,20 +526,6 @@ void Cmvmi::execCONNECT_REP(Signal *signal){ if(type == NodeInfo::MGM){ jam(); globalTransporterRegistry.setIOState(hostId, NoHalt); - - EventSubscribeReq* dst = (EventSubscribeReq *)&signal->theData[0]; - - for (Uint32 i = 0; i < EventLogger::defEventLogMatrixSize; i++) { - dst->theCategories[i] = EventLogger::defEventLogMatrix[i].eventCategory; - dst->theLevels[i] = EventLogger::defEventLogMatrix[i].threshold; - } - - dst->noOfEntries = EventLogger::defEventLogMatrixSize; - /* The BlockNumber is hardcoded as 1 in MgmtSrvr */ - dst->blockRef = numberToRef(MIN_API_BLOCK_NO, hostId); - - execEVENT_SUBSCRIBE_REQ(signal); - } //------------------------------------------ diff --git a/ndb/src/mgmsrv/CommandInterpreter.cpp b/ndb/src/mgmsrv/CommandInterpreter.cpp index 316b6d5795e..8388c012e55 100644 --- a/ndb/src/mgmsrv/CommandInterpreter.cpp +++ b/ndb/src/mgmsrv/CommandInterpreter.cpp @@ -389,9 +389,9 @@ void CommandInterpreter::executeHelp(char* parameters) { << endl; ndbout << "<category> = "; - for(i = 0; i<EventLogger::noOfEventCategoryNames; i++){ - ndbout << EventLogger::eventCategoryNames[i].name; - if (i < EventLogger::noOfEventCategoryNames - 1) { + for(i = 0; i<EventLoggerBase::noOfEventCategoryNames; i++){ + ndbout << EventLoggerBase::eventCategoryNames[i].name; + if (i < EventLoggerBase::noOfEventCategoryNames - 1) { ndbout << " | "; } } @@ -831,12 +831,13 @@ void CommandInterpreter::executeStatus(int processId, //***************************************************************************** void CommandInterpreter::executeLogLevel(int processId, const char* parameters, bool all) { +#if 0 (void)all; // Don't want compiler warning SetLogLevelOrd logLevel; logLevel.clear(); if (emptyString(parameters) || (strcmp(parameters, "ALL") == 0)) { - for(Uint32 i = 0; i<EventLogger::noOfEventCategoryNames; i++) - logLevel.setLogLevel(EventLogger::eventCategoryNames[i].category, 7); + for(Uint32 i = 0; i<EventLoggerBase::noOfEventCategoryNames; i++) + logLevel.setLogLevel(EventLoggerBase::eventCategoryNames[i].category, 7); } else { char * tmpString = strdup(parameters); @@ -852,7 +853,7 @@ void CommandInterpreter::executeLogLevel(int processId, return; } LogLevel::EventCategory cat; - if(!EventLogger::matchEventCategory(categoryTxt, + if(!EventLoggerBase::matchEventCategory(categoryTxt, &cat)){ ndbout << "Invalid loglevel specification, unknown category: " << categoryTxt << endl; @@ -875,6 +876,7 @@ void CommandInterpreter::executeLogLevel(int processId, if (result != 0) { ndbout << _mgmtSrvr.getErrorText(result) << endl; } +#endif } @@ -1080,12 +1082,13 @@ void CommandInterpreter::executeTestOff(int processId, void CommandInterpreter::executeEventReporting(int processId, const char* parameters, bool all) { +#if 0 (void)all; // Don't want compiler warning SetLogLevelOrd logLevel; logLevel.clear(); if (emptyString(parameters) || (strcmp(parameters, "ALL") == 0)) { - for(Uint32 i = 0; i<EventLogger::noOfEventCategoryNames; i++) - logLevel.setLogLevel(EventLogger::eventCategoryNames[i].category, 7); + for(Uint32 i = 0; i<EventLoggerBase::noOfEventCategoryNames; i++) + logLevel.setLogLevel(EventLoggerBase::eventCategoryNames[i].category, 7); } else { char * tmpString = strdup(parameters); @@ -1101,7 +1104,7 @@ void CommandInterpreter::executeEventReporting(int processId, return; } LogLevel::EventCategory cat; - if(!EventLogger::matchEventCategory(categoryTxt, + if(!EventLoggerBase::matchEventCategory(categoryTxt, &cat)){ ndbout << "Invalid loglevel specification, unknown category: " << categoryTxt << endl; @@ -1124,6 +1127,7 @@ void CommandInterpreter::executeEventReporting(int processId, if (result != 0) { ndbout << _mgmtSrvr.getErrorText(result) << endl; } +#endif } void diff --git a/ndb/src/mgmsrv/Makefile.am b/ndb/src/mgmsrv/Makefile.am index 8fa9ec5f63e..36cb7f87d3d 100644 --- a/ndb/src/mgmsrv/Makefile.am +++ b/ndb/src/mgmsrv/Makefile.am @@ -12,8 +12,6 @@ ndb_mgmd_SOURCES = \ main.cpp \ Services.cpp \ convertStrToInt.cpp \ - NodeLogLevel.cpp \ - NodeLogLevelList.cpp \ SignalQueue.cpp \ MgmtSrvrConfig.cpp \ ConfigInfo.cpp \ diff --git a/ndb/src/mgmsrv/MgmtSrvr.cpp b/ndb/src/mgmsrv/MgmtSrvr.cpp index 8380f3fd86a..2c8b3dee167 100644 --- a/ndb/src/mgmsrv/MgmtSrvr.cpp +++ b/ndb/src/mgmsrv/MgmtSrvr.cpp @@ -45,7 +45,6 @@ #include <ndb_version.h> #include <SocketServer.hpp> -#include "NodeLogLevel.hpp" #include <NdbConfig.h> #include <NdbAutoPtr.hpp> @@ -191,41 +190,49 @@ EventLogger g_EventLogger; void MgmtSrvr::logLevelThreadRun() { - NdbMutex* threadMutex = NdbMutex_Create(); - while (!_isStopThread) { - if (_startedNodeId != 0) { - NdbMutex_Lock(threadMutex); - - // Local node - NodeLogLevel* n = NULL; - while ((n = _nodeLogLevelList->next()) != NULL) { - if (n->getNodeId() == _startedNodeId) { - setNodeLogLevel(_startedNodeId, n->getLogLevelOrd(), true); - } - } - // Cluster log - while ((n = _clusterLogLevelList->next()) != NULL) { - if (n->getNodeId() == _startedNodeId) { - setEventReportingLevel(_startedNodeId, n->getLogLevelOrd(), true); - } - } - _startedNodeId = 0; - - NdbMutex_Unlock(threadMutex); + /** + * Handle started nodes + */ + EventSubscribeReq req; + req = m_statisticsListner.m_clients[0].m_logLevel; + req.blockRef = _ownReference; - } // if (_startedNodeId != 0) { + SetLogLevelOrd ord; + + m_started_nodes.lock(); + while(m_started_nodes.size() > 0){ + Uint32 node = m_started_nodes[0]; + m_started_nodes.erase(0, false); + m_started_nodes.unlock(); + setEventReportingLevelImpl(node, req); + + ord = m_nodeLogLevel[node]; + setNodeLogLevelImpl(node, ord); + + m_started_nodes.lock(); + } + m_started_nodes.unlock(); + + m_log_level_requests.lock(); + while(m_log_level_requests.size() > 0){ + req = m_log_level_requests[0]; + m_log_level_requests.erase(0, false); + m_log_level_requests.unlock(); + + if(req.blockRef == 0){ + req.blockRef = _ownReference; + setEventReportingLevelImpl(0, req); + } else { + ord = req; + setNodeLogLevelImpl(req.blockRef, ord); + } + m_log_level_requests.lock(); + } + m_log_level_requests.unlock(); NdbSleep_MilliSleep(_logLevelThreadSleep); - } // while (!_isStopThread) - - NdbMutex_Destroy(threadMutex); -} - -void -MgmtSrvr::setStatisticsListner(StatisticsListner* listner) -{ - m_statisticsListner = listner; + } } void @@ -272,7 +279,7 @@ class ErrorItem { public: int _errorCode; - const BaseString _errorText; + const char * _errorText; }; bool @@ -485,23 +492,6 @@ MgmtSrvr::getPort() const { return port; } -int -MgmtSrvr::getStatPort() const { -#if 0 - const Properties *mgmProps; - if(!getConfig()->get("Node", _ownNodeId, &mgmProps)) - return -1; - - int tmp = -1; - if(!mgmProps->get("PortNumberStats", (Uint32 *)&tmp)) - return -1; - - return tmp; -#else - return -1; -#endif -} - /* Constructor */ MgmtSrvr::MgmtSrvr(NodeId nodeId, const BaseString &configFilename, @@ -510,22 +500,19 @@ MgmtSrvr::MgmtSrvr(NodeId nodeId, _blockNumber(1), // Hard coded block number since it makes it easy to send // signals to other management servers. _ownReference(0), + m_allocated_resources(*this), theSignalIdleList(NULL), theWaitState(WAIT_SUBSCRIBE_CONF), - theConfCount(0), - m_allocated_resources(*this) { - + m_statisticsListner(this){ + DBUG_ENTER("MgmtSrvr::MgmtSrvr"); _config = NULL; - _isStatPortActive = false; - _isClusterLogStatActive = false; _isStopThread = false; _logLevelThread = NULL; _logLevelThreadSleep = 500; m_signalRecvThread = NULL; - _startedNodeId = 0; theFacade = 0; @@ -583,13 +570,7 @@ MgmtSrvr::MgmtSrvr(NodeId nodeId, ndb_mgm_destroy_iterator(iter); } - m_statisticsListner = NULL; - - _nodeLogLevelList = new NodeLogLevelList(); - _clusterLogLevelList = new NodeLogLevelList(); - _props = NULL; - _ownNodeId= 0; NodeId tmp= nodeId; BaseString error_string; @@ -610,6 +591,16 @@ MgmtSrvr::MgmtSrvr(NodeId nodeId, } } + { + MgmStatService::StatListener se; + se.m_socket = -1; + for(size_t t = 0; t<_LOGLEVEL_CATEGORIES; t++) + se.m_logLevel.setLogLevel((LogLevel::EventCategory)t, 7); + se.m_logLevel.setLogLevel(LogLevel::llError, 15); + m_statisticsListner.m_clients.push_back(se); + m_statisticsListner.m_logLevel = se.m_logLevel; + } + DBUG_VOID_RETURN; } @@ -671,8 +662,6 @@ MgmtSrvr::start(BaseString &error_string) // Set the initial confirmation count for subscribe requests confirm // from NDB nodes in the cluster. // - theConfCount = getNodeCount(NDB_MGM_NODE_TYPE_NDB); - // Loglevel thread _logLevelThread = NdbThread_Create(logLevelThread_C, (void**)this, @@ -713,9 +702,6 @@ MgmtSrvr::~MgmtSrvr() if(_config != NULL) delete _config; - delete _nodeLogLevelList; - delete _clusterLogLevelList; - // End set log level thread void* res = 0; _isStopThread = true; @@ -736,6 +722,9 @@ MgmtSrvr::~MgmtSrvr() int MgmtSrvr::okToSendTo(NodeId processId, bool unCond) { + if(processId == 0) + return 0; + if (getNodeType(processId) != NDB_MGM_NODE_TYPE_NDB) return WRONG_PROCESS_TYPE; @@ -1540,175 +1529,72 @@ MgmtSrvr::status(int processId, return -1; } - - -//**************************************************************************** -//**************************************************************************** -int -MgmtSrvr::startStatisticEventReporting(int level) -{ - SetLogLevelOrd ll; - NodeId nodeId = 0; - - ll.clear(); - ll.setLogLevel(LogLevel::llStatistic, level); - - if (level > 0) { - _isStatPortActive = true; - } else { - _isStatPortActive = false; - - if (_isClusterLogStatActive) { - return 0; - } - } - - while (getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)) { - setEventReportingLevelImpl(nodeId, ll); - } - - return 0; -} - -int -MgmtSrvr::setEventReportingLevel(int processId, const SetLogLevelOrd & ll, - bool isResend) -{ - for (Uint32 i = 0; i < ll.noOfEntries; i++) { - if (ll.theCategories[i] == LogLevel::llStatistic) { - if (ll.theLevels[i] > 0) { - _isClusterLogStatActive = true; - break; - } else { - _isClusterLogStatActive = false; - - if (_isStatPortActive) { - return 0; - } - break; - } - } // if (ll.theCategories - } // for (int i = 0 - - return setEventReportingLevelImpl(processId, ll, isResend); -} int MgmtSrvr::setEventReportingLevelImpl(int processId, - const SetLogLevelOrd & ll, - bool isResend) + const EventSubscribeReq& ll) { - Uint32 i; - for(i = 0; i<ll.noOfEntries; i++){ - // Save log level for the cluster log - if (!isResend) { - NodeLogLevel* n = NULL; - bool found = false; - while ((n = _clusterLogLevelList->next()) != NULL) { - if (n->getNodeId() == processId && - n->getCategory() == ll.theCategories[i]) { - - n->setLevel(ll.theLevels[i]); - found = true; - } - } - if (!found) { - _clusterLogLevelList->add(new NodeLogLevel(processId, ll)); - } - } - } - + int result = okToSendTo(processId, true); if (result != 0) { return result; } - NdbApiSignal* signal = getSignal(); - if (signal == NULL) { - return COULD_NOT_ALLOCATE_MEMORY; - } + NdbApiSignal signal(_ownReference); EventSubscribeReq * dst = - CAST_PTR(EventSubscribeReq, signal->getDataPtrSend()); - for(i = 0; i<ll.noOfEntries; i++){ - dst->theCategories[i] = ll.theCategories[i]; - dst->theLevels[i] = ll.theLevels[i]; - } - - dst->noOfEntries = ll.noOfEntries; - dst->blockRef = _ownReference; + CAST_PTR(EventSubscribeReq, signal.getDataPtrSend()); - signal->set(TestOrd::TraceAPI, CMVMI, GSN_EVENT_SUBSCRIBE_REQ, - EventSubscribeReq::SignalLength); + * dst = ll; + + signal.set(TestOrd::TraceAPI, CMVMI, GSN_EVENT_SUBSCRIBE_REQ, + EventSubscribeReq::SignalLength); + + theFacade->lock_mutex(); + send(&signal, processId, NODE_TYPE_DB); + theFacade->unlock_mutex(); - result = sendSignal(processId, WAIT_SUBSCRIBE_CONF, signal, true); - if (result == -1) { - return SEND_OR_RECEIVE_FAILED; - } - else { - // Increment the conf counter - theConfCount++; - } - return 0; } //**************************************************************************** //**************************************************************************** int -MgmtSrvr::setNodeLogLevel(int processId, const SetLogLevelOrd & ll, - bool isResend) +MgmtSrvr::setNodeLogLevelImpl(int processId, const SetLogLevelOrd & ll) { - Uint32 i; - for(i = 0; i<ll.noOfEntries; i++){ - // Save log level for the cluster log - if (!isResend) { - NodeLogLevel* n = NULL; - bool found = false; - while ((n = _clusterLogLevelList->next()) != NULL) { - if (n->getNodeId() == processId && - n->getCategory() == ll.theCategories[i]) { - - n->setLevel(ll.theLevels[i]); - found = true; - } - } - if (!found) { - _clusterLogLevelList->add(new NodeLogLevel(processId, ll)); - } - } - } - int result = okToSendTo(processId, true); if (result != 0) { return result; } - NdbApiSignal* signal = getSignal(); - if (signal == NULL) { - return COULD_NOT_ALLOCATE_MEMORY; - } - - SetLogLevelOrd * dst = CAST_PTR(SetLogLevelOrd, signal->getDataPtrSend()); - - for(i = 0; i<ll.noOfEntries; i++){ - dst->theCategories[i] = ll.theCategories[i]; - dst->theLevels[i] = ll.theLevels[i]; - } + NdbApiSignal signal(_ownReference); - dst->noOfEntries = ll.noOfEntries; + SetLogLevelOrd * dst = CAST_PTR(SetLogLevelOrd, signal.getDataPtrSend()); - signal->set(TestOrd::TraceAPI, CMVMI, GSN_SET_LOGLEVELORD, - SetLogLevelOrd::SignalLength); - - result = sendSignal(processId, NO_WAIT, signal, true); - if (result == -1) { - return SEND_OR_RECEIVE_FAILED; - } + * dst = ll; + + signal.set(TestOrd::TraceAPI, CMVMI, GSN_SET_LOGLEVELORD, + SetLogLevelOrd::SignalLength); + + theFacade->lock_mutex(); + theFacade->sendSignalUnCond(&signal, processId); + theFacade->unlock_mutex(); return 0; } +int +MgmtSrvr::send(NdbApiSignal* signal, Uint32 node, Uint32 node_type){ + Uint32 max = (node == 0) ? MAX_NODES : node + 1; + + for(; node < max; node++){ + while(nodeTypes[node] != node_type && node < max) node++; + if(nodeTypes[node] != node_type) + break; + theFacade->sendSignalUnCond(signal, node); + } + return 0; +} //**************************************************************************** //**************************************************************************** @@ -2003,7 +1889,7 @@ const char* MgmtSrvr::getErrorText(int errorCode) for (int i = 0; i < noOfErrorCodes; ++i) { if (errorCode == errorTable[i]._errorCode) { - return errorTable[i]._errorText.c_str(); + return errorTable[i]._errorText; } } @@ -2011,21 +1897,6 @@ const char* MgmtSrvr::getErrorText(int errorCode) return text; } -/***************************************************************************** - * Handle reception of various signals - *****************************************************************************/ - -int -MgmtSrvr::handleSTATISTICS_CONF(NdbApiSignal* signal) -{ - //ndbout << "MgmtSrvr::handleSTATISTICS_CONF" << endl; - - int x = signal->readData(1); - //ndbout << "MgmtSrvr::handleSTATISTICS_CONF, x: " << x << endl; - _statistics._test1 = x; - return 0; -} - void MgmtSrvr::handleReceivedSignal(NdbApiSignal* signal) { @@ -2049,51 +1920,7 @@ MgmtSrvr::handleReceivedSignal(NdbApiSignal* signal) } break; - case GSN_STATISTICS_CONF: - if (theWaitState != WAIT_STATISTICS) { - g_EventLogger.warning("MgmtSrvr::handleReceivedSignal, unexpected " - "signal received, gsn %d, theWaitState = %d", - gsn, theWaitState); - - return; - } - returnCode = handleSTATISTICS_CONF(signal); - if (returnCode != -1) { - theWaitState = NO_WAIT; - } - break; - - - case GSN_SET_VAR_CONF: - if (theWaitState != WAIT_SET_VAR) { - g_EventLogger.warning("MgmtSrvr::handleReceivedSignal, unexpected " - "signal received, gsn %d, theWaitState = %d", - gsn, theWaitState); - return; - } - theWaitState = NO_WAIT; - _setVarReqResult = 0; - break; - - case GSN_SET_VAR_REF: - if (theWaitState != WAIT_SET_VAR) { - g_EventLogger.warning("MgmtSrvr::handleReceivedSignal, unexpected " - "signal received, gsn %d, theWaitState = %d", - gsn, theWaitState); - return; - } - theWaitState = NO_WAIT; - _setVarReqResult = -1; - break; - case GSN_EVENT_SUBSCRIBE_CONF: - theConfCount--; // OK, we've received a conf message - if (theConfCount < 0) { - g_EventLogger.warning("MgmtSrvr::handleReceivedSignal, unexpected " - "signal received, gsn %d, theWaitState = %d", - gsn, theWaitState); - theConfCount = 0; - } break; case GSN_EVENT_REP: @@ -2276,20 +2103,19 @@ void MgmtSrvr::handleStatus(NodeId nodeId, bool alive) { if (alive) { - _startedNodeId = nodeId; // Used by logLevelThreadRun() + m_started_nodes.push_back(nodeId); Uint32 theData[25]; theData[0] = EventReport::Connected; theData[1] = nodeId; + eventReport(_ownNodeId, theData); } else { handleStopReply(nodeId, 0); - theConfCount++; // Increment the event subscr conf count because - + Uint32 theData[25]; theData[0] = EventReport::Disconnected; theData[1] = nodeId; - + eventReport(_ownNodeId, theData); - g_EventLogger.info("Lost connection to node %d", nodeId); } } @@ -2370,7 +2196,7 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId, continue; found_matching_id= true; if(iter.get(CFG_TYPE_OF_SECTION, &type_c)) abort(); - if(type_c != type) + if(type_c != (unsigned)type) continue; found_matching_type= true; if (connected_nodes.get(tmp)) @@ -2483,77 +2309,18 @@ MgmtSrvr::getNextNodeId(NodeId * nodeId, enum ndb_mgm_node_type type) const return true; } +#include "Services.hpp" + void MgmtSrvr::eventReport(NodeId nodeId, const Uint32 * theData) { const EventReport * const eventReport = (EventReport *)&theData[0]; - + EventReport::EventType type = eventReport->getEventType(); - if (type == EventReport::TransReportCounters || - type == EventReport::OperationReportCounters) { - - if (_isClusterLogStatActive) { - g_EventLogger.log(type, theData, nodeId); - } - - if (_isStatPortActive) { - char theTime[128]; - struct tm* tm_now; - time_t now; - now = time((time_t*)NULL); -#ifdef NDB_WIN32 - tm_now = localtime(&now); -#else - tm_now = gmtime(&now); -#endif - - snprintf(theTime, sizeof(theTime), - STATISTIC_DATE, - tm_now->tm_year + 1900, - tm_now->tm_mon, - tm_now->tm_mday, - tm_now->tm_hour, - tm_now->tm_min, - tm_now->tm_sec); - - char str[255]; - - if (type == EventReport::TransReportCounters) { - snprintf(str, sizeof(str), - STATISTIC_LINE, - theTime, - (int)now, - nodeId, - theData[1], - theData[2], - theData[3], - // theData[4], simple reads - theData[5], - theData[6], - theData[7], - theData[8]); - } else if (type == EventReport::OperationReportCounters) { - snprintf(str, sizeof(str), - OP_STATISTIC_LINE, - theTime, - (int)now, - nodeId, - theData[1]); - } - - if(m_statisticsListner != 0){ - m_statisticsListner->println_statistics(str); - } - } - - return; - - } // if (type == - // Log event g_EventLogger.log(type, theData, nodeId); - + m_statisticsListner.log(type, theData, nodeId); } /*************************************************************************** @@ -2981,3 +2748,7 @@ template class Vector<SigMatch>; #if __SUNPRO_CC != 0x560 template bool SignalQueue::waitFor<SigMatch>(Vector<SigMatch>&, SigMatch*&, NdbApiSignal*&, unsigned); #endif + +template class MutexVector<unsigned short>; +template class MutexVector<MgmStatService::StatListener>; +template class MutexVector<EventSubscribeReq>; diff --git a/ndb/src/mgmsrv/MgmtSrvr.hpp b/ndb/src/mgmsrv/MgmtSrvr.hpp index d7f9f7a1af3..5de39932bf4 100644 --- a/ndb/src/mgmsrv/MgmtSrvr.hpp +++ b/ndb/src/mgmsrv/MgmtSrvr.hpp @@ -28,8 +28,8 @@ #include <signaldata/ManagementServer.hpp> #include "SignalQueue.hpp" #include <ndb_version.h> - -#include "NodeLogLevelList.hpp" +#include <EventLogger.hpp> +#include <signaldata/EventSubscribeReq.hpp> /** * @desc Block number for Management server. @@ -43,6 +43,29 @@ class Config; class SetLogLevelOrd; class SocketServer; +class MgmStatService : public EventLoggerBase +{ + friend class MgmtSrvr; +public: + struct StatListener : public EventLoggerBase { + NDB_SOCKET_TYPE m_socket; + }; + +private: + class MgmtSrvr * m_mgmsrv; + MutexVector<StatListener> m_clients; +public: + MgmStatService(class MgmtSrvr * m) : m_clients(5) { + m_mgmsrv = m; + } + + void add_listener(const StatListener&); + + void log(int eventType, const Uint32* theData, NodeId nodeId); + + void stopSessions(); +}; + /** * @class MgmtSrvr * @brief Main class for the management server. @@ -63,11 +86,6 @@ class SocketServer; class MgmtSrvr { public: - class StatisticsListner { - public: - virtual void println_statistics(const BaseString &s) = 0; - }; - // some compilers need all of this class Allocated_resources; friend class Allocated_resources; @@ -85,11 +103,6 @@ public: }; /** - * Set a reference to the socket server. - */ - void setStatisticsListner(StatisticsListner* listner); - - /** * Start/initate the event log. */ void startEventLog(); @@ -151,15 +164,6 @@ public: STATIC_CONST( NO_CONTACT_WITH_DB_NODES = 5030 ); /** - * This class holds all statistical variables fetched with - * the getStatistics methods. - */ - class Statistics { // TODO, Real statistic data to be added - public: - int _test1; - }; - - /** * This enum specifies the different signal loggig modes possible to set * with the setSignalLoggingMode method. */ @@ -206,7 +210,7 @@ public: typedef void (* EnterSingleCallback)(int nodeId, void * anyData, int errorCode); typedef void (* ExitSingleCallback)(int nodeId, void * anyData, - int errorCode); + int errorCode); /** * Lock configuration @@ -313,13 +317,6 @@ public: bool abort = false, int * stopCount = 0, StopCallback = 0, void * anyData = 0); - int setEventReportingLevel(int processId, - const class SetLogLevelOrd & logLevel, - bool isResend = false); - - int startStatisticEventReporting(int level = 5); - - struct BackupEvent { enum Event { BackupStarted = 1, @@ -377,22 +374,8 @@ public: // INVALID_LEVEL //************************************************************************** - /** - * Sets the Node's log level, i.e., its local event reporting. - * - * @param processId the DB node id. - * @param logLevel the log level. - * @param isResend Flag to indicate for resending log levels - * during node restart - - * @return 0 if successful or NO_CONTACT_WITH_PROCESS, - * SEND_OR_RECEIVE_FAILED, - * COULD_NOT_ALLOCATE_MEMORY - */ - int setNodeLogLevel(int processId, - const class SetLogLevelOrd & logLevel, - bool isResend = false); - + int setEventReportingLevelImpl(int processId, const EventSubscribeReq& ll); + int setNodeLogLevelImpl(int processId, const SetLogLevelOrd & ll); /** * Insert an error in a DB process. @@ -509,11 +492,6 @@ public: NodeId getPrimaryNode() const; /** - * Returns the statistics port number. - * @return statistic port number. - */ - int getStatPort() const; - /** * Returns the port number. * @return port number. */ @@ -526,10 +504,7 @@ public: private: //************************************************************************** - int setEventReportingLevelImpl(int processId, - const class SetLogLevelOrd & logLevel, - bool isResend = false); - + int setEventReportingLevel(int processId, LogLevel::EventCategory, Uint32); /** * Check if it is possible to send a signal to a (DB) process @@ -563,10 +538,6 @@ private: Allocated_resources m_allocated_resources; struct in_addr m_connect_address[MAX_NODES]; - int _setVarReqResult; // The result of the SET_VAR_REQ response - Statistics _statistics; // handleSTATISTICS_CONF store the result here, - // and getStatistics reads it. - //************************************************************************** // Specific signal handling methods //************************************************************************** @@ -598,14 +569,6 @@ private: // Returns: - //************************************************************************** - int handleSTATISTICS_CONF(NdbApiSignal* signal); - //************************************************************************** - // Description: Handle reception of signal STATISTICS_CONF - // Parameters: - // signal: The recieved signal - // Returns: TODO, to be defined - //************************************************************************** - void handle_MGM_LOCK_CONFIG_REQ(NdbApiSignal *signal); void handle_MGM_UNLOCK_CONFIG_REQ(NdbApiSignal *signal); @@ -631,7 +594,6 @@ private: */ enum WaitSignalType { NO_WAIT, // We don't expect to receive any signal - WAIT_STATISTICS, // Accept STATISTICS_CONF WAIT_SET_VAR, // Accept SET_VAR_CONF and SET_VAR_REF WAIT_SUBSCRIBE_CONF, // Accept event subscription confirmation WAIT_STOP, @@ -733,14 +695,6 @@ private: class SignalQueue m_signalRecvQueue; - enum ndb_mgm_node_type nodeTypes[MAX_NODES]; - - int theConfCount; // The number of expected conf signals - - StatisticsListner * m_statisticsListner; // Used for sending statistics info - bool _isStatPortActive; - bool _isClusterLogStatActive; - struct StopRecord { StopRecord(){ inUse = false; callback = 0; singleUserMode = false;} bool inUse; @@ -765,10 +719,16 @@ private: void handleStopReply(NodeId nodeId, Uint32 errCode); int translateStopRef(Uint32 errCode); - + bool _isStopThread; int _logLevelThreadSleep; - int _startedNodeId; + MutexVector<NodeId> m_started_nodes; + MutexVector<EventSubscribeReq> m_log_level_requests; + LogLevel m_nodeLogLevel[MAX_NODES]; + enum ndb_mgm_node_type nodeTypes[MAX_NODES]; + friend class MgmApiSession; + friend class MgmStatService; + MgmStatService m_statisticsListner; /** * Handles the thread wich upon a 'Node is started' event will @@ -782,15 +742,13 @@ private: static void *signalRecvThread_C(void *); void signalRecvThreadRun(); - NodeLogLevelList* _nodeLogLevelList; - NodeLogLevelList* _clusterLogLevelList; - void backupCallback(BackupEvent &); BackupCallback m_backupCallback; BackupEvent m_lastBackupEvent; Config *_props; + int send(class NdbApiSignal* signal, Uint32 node, Uint32 node_type); public: /** * This method does not exist diff --git a/ndb/src/mgmsrv/NodeLogLevel.cpp b/ndb/src/mgmsrv/NodeLogLevel.cpp deleted file mode 100644 index 5271cdb0f2b..00000000000 --- a/ndb/src/mgmsrv/NodeLogLevel.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (C) 2003 MySQL AB - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "NodeLogLevel.hpp" -// TODO_RONM: Clearly getCategory and getLevel is not correctly coded. Must be taken care of. - -NodeLogLevel::NodeLogLevel(int nodeId, const SetLogLevelOrd& ll) -{ - m_nodeId = nodeId; - m_logLevel = ll; -} - -NodeLogLevel::~NodeLogLevel() -{ -} - -int -NodeLogLevel::getNodeId() const -{ - return m_nodeId; -} - -Uint32 -NodeLogLevel::getCategory() const -{ - for (Uint32 i = 0; i < m_logLevel.noOfEntries; i++) - { - return m_logLevel.theCategories[i]; - } - return 0; -} - -int -NodeLogLevel::getLevel() const -{ - for (Uint32 i = 0; i < m_logLevel.noOfEntries; i++) - { - return m_logLevel.theLevels[i]; - } - return 0; -} - -void -NodeLogLevel::setLevel(int level) -{ - for (Uint32 i = 0; i < m_logLevel.noOfEntries; i++) - { - m_logLevel.theLevels[i] = level; - } - -} - -SetLogLevelOrd -NodeLogLevel::getLogLevelOrd() const -{ - return m_logLevel; -} diff --git a/ndb/src/mgmsrv/NodeLogLevel.hpp b/ndb/src/mgmsrv/NodeLogLevel.hpp deleted file mode 100644 index 3ad758cde99..00000000000 --- a/ndb/src/mgmsrv/NodeLogLevel.hpp +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (C) 2003 MySQL AB - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef NODELOGLEVEL_H -#define NODELOGLEVEL_H - -#include <ndb_global.h> - -#include <signaldata/SetLogLevelOrd.hpp> - -/** - * Holds a DB node's log level settings for both local and event log levels. - * It only holds one log level setting even though SetLogLevelOrd can handle - * multiple log levels at once, it is not used in that way in the managment - * server. - * - * @version #@ $Id: NodeLogLevel.hpp,v 1.2 2003/07/05 17:40:22 elathal Exp $ - */ -class NodeLogLevel -{ -public: - NodeLogLevel(int nodeId, const SetLogLevelOrd& ll); - ~NodeLogLevel(); - - int getNodeId() const; - Uint32 getCategory() const; - int getLevel() const; - void setLevel(int level); - SetLogLevelOrd getLogLevelOrd() const; - -private: - NodeLogLevel(); - NodeLogLevel(const NodeLogLevel&); - bool operator == (const NodeLogLevel&); - NodeLogLevel operator = (const NodeLogLevel&); - - int m_nodeId; - SetLogLevelOrd m_logLevel; -}; - -#endif diff --git a/ndb/src/mgmsrv/NodeLogLevelList.cpp b/ndb/src/mgmsrv/NodeLogLevelList.cpp deleted file mode 100644 index 6c7c091c1a8..00000000000 --- a/ndb/src/mgmsrv/NodeLogLevelList.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/* Copyright (C) 2003 MySQL AB - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include <ndb_global.h> - -#include "NodeLogLevelList.hpp" -#include "NodeLogLevel.hpp" - -// -// PUBLIC -// - -NodeLogLevelList::NodeLogLevelList() : - m_size(0), - m_pHeadNode(NULL), - m_pTailNode(NULL), - m_pCurrNode(NULL) -{ -} - -NodeLogLevelList::~NodeLogLevelList() -{ - removeAll(); -} - -void -NodeLogLevelList::add(NodeLogLevel* pNewNode) -{ - NodeLogLevelNode* pNode = new NodeLogLevelNode(); - - if (m_pHeadNode == NULL) - { - m_pHeadNode = pNode; - pNode->pPrev = NULL; - } - else - { - m_pTailNode->pNext = pNode; - pNode->pPrev = m_pTailNode; - } - m_pTailNode = pNode; - pNode->pNext = NULL; - pNode->pHandler = pNewNode; - - m_size++; -} - -bool -NodeLogLevelList::remove(NodeLogLevel* pRemoveNode) -{ - NodeLogLevelNode* pNode = m_pHeadNode; - bool removed = false; - do - { - if (pNode->pHandler == pRemoveNode) - { - removeNode(pNode); - removed = true; - break; - } - } while ( (pNode = next(pNode)) != NULL); - - return removed; -} - -void -NodeLogLevelList::removeAll() -{ - while (m_pHeadNode != NULL) - { - removeNode(m_pHeadNode); - } -} - -NodeLogLevel* -NodeLogLevelList::next() -{ - NodeLogLevel* pHandler = NULL; - if (m_pCurrNode == NULL) - { - m_pCurrNode = m_pHeadNode; - if (m_pCurrNode != NULL) - { - pHandler = m_pCurrNode->pHandler; - } - } - else - { - m_pCurrNode = next(m_pCurrNode); // Next node - if (m_pCurrNode != NULL) - { - pHandler = m_pCurrNode->pHandler; - } - } - - return pHandler; -} - -int -NodeLogLevelList::size() const -{ - return m_size; -} - -// -// PRIVATE -// - -NodeLogLevelList::NodeLogLevelNode* -NodeLogLevelList::next(NodeLogLevelNode* pNode) -{ - NodeLogLevelNode* pCurr = pNode; - if (pNode->pNext != NULL) - { - pCurr = pNode->pNext; - } - else - { - // Tail - pCurr = NULL; - } - return pCurr; -} - -NodeLogLevelList::NodeLogLevelNode* -NodeLogLevelList::prev(NodeLogLevelNode* pNode) -{ - NodeLogLevelNode* pCurr = pNode; - if (pNode->pPrev != NULL) // head - { - pCurr = pNode->pPrev; - } - else - { - // Head - pCurr = NULL; - } - - return pCurr; -} - -void -NodeLogLevelList::removeNode(NodeLogLevelNode* pNode) -{ - if (pNode->pPrev == NULL) // If head - { - m_pHeadNode = pNode->pNext; - } - else - { - pNode->pPrev->pNext = pNode->pNext; - } - - if (pNode->pNext == NULL) // if tail - { - m_pTailNode = pNode->pPrev; - } - else - { - pNode->pNext->pPrev = pNode->pPrev; - } - - pNode->pNext = NULL; - pNode->pPrev = NULL; - delete pNode->pHandler; // Delete log handler - delete pNode; - - m_size--; -} diff --git a/ndb/src/mgmsrv/NodeLogLevelList.hpp b/ndb/src/mgmsrv/NodeLogLevelList.hpp deleted file mode 100644 index 4a55ee211e2..00000000000 --- a/ndb/src/mgmsrv/NodeLogLevelList.hpp +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (C) 2003 MySQL AB - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef NODELOGLEVELLIST_H -#define NODELOGLEVELLIST_H - -class NodeLogLevel; - -/** - * Provides a simple linked list of NodeLogLevel. - * - * @see NodeLogLevel - * @version #@ $Id: NodeLogLevelList.hpp,v 1.1 2002/08/09 12:53:50 eyualex Exp $ - */ -class NodeLogLevelList -{ -public: - /** - * Default Constructor. - */ - NodeLogLevelList(); - - /** - * Destructor. - */ - ~NodeLogLevelList(); - - /** - * Adds a new node. - * - * @param pNewHandler a new NodeLogLevel. - */ - void add(NodeLogLevel* pNewNode); - - /** - * Removes a NodeLogLevel from the list and call its destructor. - * - * @param pRemoveHandler the NodeLogLevel to remove - */ - bool remove(NodeLogLevel* pRemoveNode); - - /** - * Removes all items. - */ - void removeAll(); - - /** - * Returns the next node in the list. - * returns a node or NULL. - */ - NodeLogLevel* next(); - - /** - * Returns the size of the list. - */ - int size() const; -private: - /** List node */ - struct NodeLogLevelNode - { - NodeLogLevelNode* pPrev; - NodeLogLevelNode* pNext; - NodeLogLevel* pHandler; - }; - - NodeLogLevelNode* next(NodeLogLevelNode* pNode); - NodeLogLevelNode* prev(NodeLogLevelNode* pNode); - - void removeNode(NodeLogLevelNode* pNode); - - int m_size; - - NodeLogLevelNode* m_pHeadNode; - NodeLogLevelNode* m_pTailNode; - NodeLogLevelNode* m_pCurrNode; -}; - -#endif - - diff --git a/ndb/src/mgmsrv/Services.cpp b/ndb/src/mgmsrv/Services.cpp index c529e277e0e..8ce9367825f 100644 --- a/ndb/src/mgmsrv/Services.cpp +++ b/ndb/src/mgmsrv/Services.cpp @@ -23,6 +23,7 @@ #include <mgmapi.h> #include <EventLogger.hpp> #include <signaldata/SetLogLevelOrd.hpp> +#include <LogLevel.hpp> #include <BaseString.hpp> #include <Base64.hpp> @@ -133,7 +134,7 @@ ParserRow<MgmApiSession> commands[] = { MGM_ARG("public key", String, Mandatory, "Public key"), MGM_CMD("get version", &MgmApiSession::getVersion, ""), - + MGM_CMD("get status", &MgmApiSession::getStatus, ""), MGM_CMD("get info clusterlog", &MgmApiSession::getInfoClusterLog, ""), @@ -236,7 +237,11 @@ ParserRow<MgmApiSession> commands[] = { MGM_ARG("node", String, Mandatory, "Node"), MGM_ARG("parameter", String, Mandatory, "Parameter"), MGM_ARG("value", String, Mandatory, "Value"), - + + MGM_CMD("listen event", &MgmApiSession::listen_event, ""), + MGM_ARG("node", Int, Optional, "Node"), + MGM_ARG("filter", String, Mandatory, "Event category"), + MGM_END() }; @@ -289,7 +294,8 @@ MgmApiSession::runSession() { break; } } - NDB_CLOSE_SOCKET(m_socket); + if(m_socket >= 0) + NDB_CLOSE_SOCKET(m_socket); } #ifdef MGM_GET_CONFIG_BACKWARDS_COMPAT @@ -554,7 +560,7 @@ MgmApiSession::getStatPort(Parser_t::Context &, const class Properties &) { m_output->println("get statport reply"); - m_output->println("tcpport: %d", m_mgmsrv.getStatPort()); + m_output->println("tcpport: %d", 0); m_output->println(""); } @@ -760,7 +766,6 @@ MgmApiSession::setClusterLogLevel(Parser<MgmApiSession>::Context &, BaseString categoryName, errorString; SetLogLevelOrd logLevel; int result; - logLevel.clear(); args.get("node", &node); args.get("category", categoryName); args.get("level", &level); @@ -779,14 +784,15 @@ MgmApiSession::setClusterLogLevel(Parser<MgmApiSession>::Context &, goto error; } - logLevel.setLogLevel(category, level); - result = m_mgmsrv.setEventReportingLevel(node, logLevel); + EventSubscribeReq req; + req.blockRef = 0; + req.noOfEntries = 1; + req.theCategories[0] = category; + req.theLevels[0] = level; + m_mgmsrv.m_log_level_requests.push_back(req); m_output->println("set cluster loglevel reply"); - if(result != 0) - m_output->println("result: %s", m_mgmsrv.getErrorText(result)); - else - m_output->println("result: Ok"); + m_output->println("result: Ok"); m_output->println(""); return; error: @@ -821,15 +827,15 @@ MgmApiSession::setLogLevel(Parser<MgmApiSession>::Context &, goto error; } - logLevel.setLogLevel(category, level); - - result = m_mgmsrv.setNodeLogLevel(node, logLevel); - + EventSubscribeReq req; + req.blockRef = node; + req.noOfEntries = 1; + req.theCategories[0] = category; + req.theLevels[0] = level; + m_mgmsrv.m_log_level_requests.push_back(req); + m_output->println("set loglevel reply"); - if(result != 0) - m_output->println("result: %s", m_mgmsrv.getErrorText(result)); - else - m_output->println("result: Ok"); + m_output->println("result: Ok"); m_output->println(""); return; error: @@ -1248,33 +1254,91 @@ MgmApiSession::configChange(Parser_t::Context &, m_output->println(""); } -void -MgmStatService::println_statistics(const BaseString &line){ - MutexVector<NDB_SOCKET_TYPE> copy(m_sockets.size()); - m_sockets.lock(); +NdbOut& +operator<<(NdbOut& out, const LogLevel & ll) +{ + out << "[LogLevel: "; + for(size_t i = 0; i<_LOGLEVEL_CATEGORIES; i++) + out << ll.getLogLevel((LogLevel::EventCategory)i) << " "; + out << "]"; +} + +void +MgmStatService::log(int eventType, const Uint32* theData, NodeId nodeId){ + + Uint32 threshold = 0; + LogLevel::EventCategory cat; + + for(unsigned i = 0; i<EventLogger::matrixSize; i++){ + if(EventLogger::matrix[i].eventType == eventType){ + cat = EventLogger::matrix[i].eventCategory; + threshold = EventLogger::matrix[i].threshold; + break; + } + } + + char m_text[256]; + EventLogger::getText(m_text, sizeof(m_text), eventType, theData, nodeId); + + Vector<NDB_SOCKET_TYPE> copy; + m_clients.lock(); int i; - for(i = m_sockets.size() - 1; i >= 0; i--){ - if(println_socket(m_sockets[i], MAX_WRITE_TIMEOUT, line.c_str()) == -1){ - copy.push_back(m_sockets[i]); - m_sockets.erase(i, false); + for(i = m_clients.size() - 1; i >= 0; i--){ + if(threshold <= m_clients[i].m_logLevel.getLogLevel(cat)){ + if(m_clients[i].m_socket >= 0 && + println_socket(m_clients[i].m_socket, + MAX_WRITE_TIMEOUT, m_text) == -1){ + copy.push_back(m_clients[i].m_socket); + m_clients.erase(i, false); + } } } - m_sockets.unlock(); + m_clients.unlock(); - for(i = copy.size() - 1; i >= 0; i--){ + for(i = 0; (unsigned)i<copy.size(); i++){ NDB_CLOSE_SOCKET(copy[i]); - copy.erase(i); } - if(m_sockets.size() == 0 || false){ - m_mgmsrv->startStatisticEventReporting(0); + + if(copy.size()){ + LogLevel tmp; tmp.clear(); + m_clients.lock(); + for(i = 0; i < m_clients.size(); i++){ + tmp.set_max(m_clients[i].m_logLevel); + } + m_clients.unlock(); + + if(!(tmp == m_logLevel)){ + m_logLevel = tmp; + EventSubscribeReq req; + req = tmp; + req.blockRef = 0; + m_mgmsrv->m_log_level_requests.push_back(req); + } + } +} + +void +MgmStatService::add_listener(const StatListener& client){ + m_clients.push_back(client); + LogLevel tmp = m_logLevel; + tmp.set_max(client.m_logLevel); + + if(!(tmp == m_logLevel)){ + m_logLevel = tmp; + EventSubscribeReq req; + req = tmp; + req.blockRef = 0; + m_mgmsrv->m_log_level_requests.push_back(req); } } void MgmStatService::stopSessions(){ - for(int i = m_sockets.size() - 1; i >= 0; i--){ - NDB_CLOSE_SOCKET(m_sockets[i]); - m_sockets.erase(i); + for(int i = m_clients.size() - 1; i >= 0; i--){ + if(m_clients[i].m_socket >= 0){ + NDB_CLOSE_SOCKET(m_clients[i].m_socket); + m_clients.erase(i); + } } } @@ -1298,6 +1362,71 @@ MgmApiSession::setParameter(Parser_t::Context &, m_output->println(""); } +void +MgmApiSession::listen_event(Parser<MgmApiSession>::Context & ctx, + Properties const & args) { + + BaseString node, param, value; + args.get("node", node); + args.get("filter", param); + + int result = 0; + BaseString msg; + + MgmStatService::StatListener le; + le.m_socket = m_socket; + + Vector<BaseString> list; + param.trim(); + param.split(list, " ,"); + for(size_t i = 0; i<list.size(); i++){ + Vector<BaseString> spec; + list[i].trim(); + list[i].split(spec, "=:"); + if(spec.size() != 2){ + msg.appfmt("Invalid filter specification: >%s< >%s< %d", + param.c_str(), list[i].c_str(), spec.size()); + result = -1; + goto done; + } + + spec[0].trim(); + spec[0].ndb_toupper(); + + LogLevel::EventCategory category; + if(!EventLogger::matchEventCategory(spec[0].c_str(), &category)) { + msg.appfmt("Unknown category: >%s<", spec[0].c_str()); + result = -1; + goto done; + } + + int level = atoi(spec[1].c_str()); + if(level < 0 || level > 15){ + msg.appfmt("Invalid level: >%s<", spec[1].c_str()); + result = -1; + goto done; + } + le.m_logLevel.setLogLevel(category, level); + } + + if(list.size() == 0){ + msg.appfmt("Empty filter specification"); + result = -1; + goto done; + } + + m_mgmsrv.m_statisticsListner.add_listener(le); + + m_stop = true; + m_socket = -1; + +done: + m_output->println("listen event"); + m_output->println("result: %d", result); + if(result != 0) + m_output->println("msg: %s", msg.c_str()); +} + template class MutexVector<int>; template class Vector<ParserRow<MgmApiSession> const*>; template class Vector<unsigned short>; diff --git a/ndb/src/mgmsrv/Services.hpp b/ndb/src/mgmsrv/Services.hpp index 9cf8b59be8f..e47820826b6 100644 --- a/ndb/src/mgmsrv/Services.hpp +++ b/ndb/src/mgmsrv/Services.hpp @@ -83,7 +83,8 @@ public: void configChange(Parser_t::Context &ctx, const class Properties &args); void setParameter(Parser_t::Context &ctx, const class Properties &args); - + void listen_event(Parser_t::Context &ctx, const class Properties &args); + void repCommand(Parser_t::Context &ctx, const class Properties &args); }; @@ -103,28 +104,4 @@ public: } }; -class MgmStatService : public SocketServer::Service, - public MgmtSrvr::StatisticsListner -{ - class MgmtSrvr * m_mgmsrv; - MutexVector<NDB_SOCKET_TYPE> m_sockets; -public: - MgmStatService() : m_sockets(5) { - m_mgmsrv = 0; - } - - void setMgm(class MgmtSrvr * mgmsrv){ - m_mgmsrv = mgmsrv; - } - - SocketServer::Session * newSession(NDB_SOCKET_TYPE socket){ - m_sockets.push_back(socket); - m_mgmsrv->startStatisticEventReporting(5); - return 0; - } - - void stopSessions(); - - void println_statistics(const BaseString &line); -}; #endif diff --git a/ndb/src/mgmsrv/main.cpp b/ndb/src/mgmsrv/main.cpp index cecf1c1e499..6e45edb20b1 100644 --- a/ndb/src/mgmsrv/main.cpp +++ b/ndb/src/mgmsrv/main.cpp @@ -70,7 +70,6 @@ struct MgmGlobals { bool use_specific_ip; char * interface_name; int port; - int port_stats; /** The configuration of the cluster */ Config * cluster_config; @@ -169,8 +168,6 @@ NDB_MAIN(mgmsrv){ MgmApiService * mapi = new MgmApiService(); - MgmStatService * mstat = new MgmStatService(); - /**************************** * Read configuration files * ****************************/ @@ -230,13 +227,6 @@ NDB_MAIN(mgmsrv){ goto error_end; } - if(!glob.socketServer->setup(mstat, glob.port_stats, glob.interface_name)){ - ndbout_c("Unable to setup statistic port: %d!\nPlease check if the port" - " is already used.", glob.port_stats); - delete mstat; - goto error_end; - } - if(!glob.mgmObject->check_start()){ ndbout_c("Unable to check start management server."); ndbout_c("Probably caused by illegal initial configuration file."); @@ -267,10 +257,7 @@ NDB_MAIN(mgmsrv){ } //glob.mgmObject->saveConfig(); - - mstat->setMgm(glob.mgmObject); mapi->setMgm(glob.mgmObject); - glob.mgmObject->setStatisticsListner(mstat); char msg[256]; snprintf(msg, sizeof(msg), @@ -278,8 +265,8 @@ NDB_MAIN(mgmsrv){ ndbout_c(msg); g_EventLogger.info(msg); - snprintf(msg, 256, "Id: %d, Command port: %d, Statistics port: %d", - glob.localNodeId, glob.port, glob.port_stats); + snprintf(msg, 256, "Id: %d, Command port: %d", + glob.localNodeId, glob.port); ndbout_c(msg); g_EventLogger.info(msg); @@ -309,7 +296,6 @@ NDB_MAIN(mgmsrv){ MgmGlobals::MgmGlobals(){ // Default values port = 0; - port_stats = 0; config_filename = NULL; local_config_filename = NULL; interface_name = 0; |