EventLogger.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:33k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. #include "EventLogger.hpp"
  15. #include <NdbConfig.h>
  16. #include <kernel/BlockNumbers.h>
  17. #include <signaldata/ArbitSignalData.hpp>
  18. #include <GrepEvent.hpp>
  19. #include <NodeState.hpp>
  20. #include <version.h>
  21. //
  22. // PUBLIC
  23. //
  24. EventLoggerBase::~EventLoggerBase()
  25. {
  26.   
  27. }
  28. /**
  29.  * This matrix defines which event should be printed when
  30.  *
  31.  * threshold - is in range [0-15]
  32.  * severity  - DEBUG to ALERT (Type of log message)
  33.  */
  34. const EventLoggerBase::EventRepLogLevelMatrix EventLoggerBase::matrix[] = {
  35.   // CONNECTION
  36.   { EventReport::Connected,           LogLevel::llConnection, 8, Logger::LL_INFO },
  37.   { EventReport::Disconnected,        LogLevel::llConnection, 8, Logger::LL_ALERT },
  38.   { EventReport::CommunicationClosed, LogLevel::llConnection, 8, Logger::LL_INFO },
  39.   { EventReport::CommunicationOpened, LogLevel::llConnection, 8, Logger::LL_INFO },
  40.   { EventReport::ConnectedApiVersion, LogLevel::llConnection, 8, Logger::LL_INFO },
  41.   // CHECKPOINT
  42.   { EventReport::GlobalCheckpointStarted, LogLevel::llCheckpoint,  9, Logger::LL_INFO },
  43.   { EventReport::GlobalCheckpointCompleted,LogLevel::llCheckpoint,10, Logger::LL_INFO },
  44.   { EventReport::LocalCheckpointStarted,  LogLevel::llCheckpoint,  7, Logger::LL_INFO },
  45.   { EventReport::LocalCheckpointCompleted,LogLevel::llCheckpoint,  8, Logger::LL_INFO },
  46.   { EventReport::LCPStoppedInCalcKeepGci, LogLevel::llCheckpoint,  0, Logger::LL_ALERT },
  47.   { EventReport::LCPFragmentCompleted,    LogLevel::llCheckpoint, 11, Logger::LL_INFO },
  48.   { EventReport::UndoLogBlocked,          LogLevel::llCheckpoint,  7, Logger::LL_INFO },
  49.   // STARTUP
  50.   { EventReport::NDBStartStarted,          LogLevel::llStartUp, 1, Logger::LL_INFO },
  51.   { EventReport::NDBStartCompleted,        LogLevel::llStartUp, 1, Logger::LL_INFO },
  52.   { EventReport::STTORRYRecieved,          LogLevel::llStartUp,15, Logger::LL_INFO },
  53.   { EventReport::StartPhaseCompleted,      LogLevel::llStartUp, 4, Logger::LL_INFO },
  54.   { EventReport::CM_REGCONF,               LogLevel::llStartUp, 3, Logger::LL_INFO },
  55.   { EventReport::CM_REGREF,                LogLevel::llStartUp, 8, Logger::LL_INFO },
  56.   { EventReport::FIND_NEIGHBOURS,          LogLevel::llStartUp, 8, Logger::LL_INFO },
  57.   { EventReport::NDBStopStarted,           LogLevel::llStartUp, 1, Logger::LL_INFO },
  58.   { EventReport::NDBStopAborted,           LogLevel::llStartUp, 1, Logger::LL_INFO },
  59.   { EventReport::StartREDOLog,             LogLevel::llStartUp, 10, Logger::LL_INFO },
  60.   { EventReport::StartLog,                 LogLevel::llStartUp, 10, Logger::LL_INFO },
  61.   { EventReport::UNDORecordsExecuted,      LogLevel::llStartUp, 15, Logger::LL_INFO },
  62.   
  63.   // NODERESTART
  64.   { EventReport::NR_CopyDict,            LogLevel::llNodeRestart,  8, Logger::LL_INFO },
  65.   { EventReport::NR_CopyDistr,           LogLevel::llNodeRestart,  8, Logger::LL_INFO },
  66.   { EventReport::NR_CopyFragsStarted,    LogLevel::llNodeRestart,  8, Logger::LL_INFO },
  67.   { EventReport::NR_CopyFragDone,        LogLevel::llNodeRestart, 10, Logger::LL_INFO },
  68.   { EventReport::NR_CopyFragsCompleted,  LogLevel::llNodeRestart,  8, Logger::LL_INFO },
  69.   { EventReport::NodeFailCompleted,      LogLevel::llNodeRestart,  8, Logger::LL_ALERT},
  70.   { EventReport::NODE_FAILREP,           LogLevel::llNodeRestart,  8, Logger::LL_ALERT},
  71.   { EventReport::ArbitState,  LogLevel::llNodeRestart,  6, Logger::LL_INFO },
  72.   { EventReport::ArbitResult,  LogLevel::llNodeRestart,  2, Logger::LL_ALERT},
  73.   { EventReport::GCP_TakeoverStarted,    LogLevel::llNodeRestart,  7, Logger::LL_INFO },
  74.   { EventReport::GCP_TakeoverCompleted,  LogLevel::llNodeRestart,  7, Logger::LL_INFO },
  75.   { EventReport::LCP_TakeoverStarted,    LogLevel::llNodeRestart,  7, Logger::LL_INFO },
  76.   { EventReport::LCP_TakeoverCompleted,  LogLevel::llNodeRestart,  7, Logger::LL_INFO },
  77.   // STATISTIC
  78.   { EventReport::TransReportCounters,     LogLevel::llStatistic, 8, Logger::LL_INFO },
  79.   { EventReport::OperationReportCounters, LogLevel::llStatistic, 8, Logger::LL_INFO }, 
  80.   { EventReport::TableCreated,            LogLevel::llStatistic, 7, Logger::LL_INFO },
  81.   { EventReport::JobStatistic,            LogLevel::llStatistic, 9, Logger::LL_INFO },
  82.   { EventReport::SendBytesStatistic,      LogLevel::llStatistic, 9, Logger::LL_INFO },
  83.   { EventReport::ReceiveBytesStatistic,   LogLevel::llStatistic, 9, Logger::LL_INFO },
  84.   { EventReport::MemoryUsage,             LogLevel::llStatistic, 5, Logger::LL_INFO },
  85.   // ERROR
  86.   { EventReport::TransporterError,   LogLevel::llError, 2, Logger::LL_ERROR   },
  87.   { EventReport::TransporterWarning, LogLevel::llError, 8, Logger::LL_WARNING },
  88.   { EventReport::MissedHeartbeat,    LogLevel::llError, 8, Logger::LL_WARNING },
  89.   { EventReport::DeadDueToHeartbeat, LogLevel::llError, 8, Logger::LL_ALERT   },
  90.   { EventReport::WarningEvent,       LogLevel::llError, 2, Logger::LL_WARNING },
  91.   // INFO
  92.   { EventReport::SentHeartbeat,     LogLevel::llInfo, 12, Logger::LL_INFO },
  93.   { EventReport::CreateLogBytes,    LogLevel::llInfo, 11, Logger::LL_INFO },
  94.   { EventReport::InfoEvent,         LogLevel::llInfo,  2, Logger::LL_INFO },
  95.   //Single User
  96.   { EventReport::SingleUser,  LogLevel::llInfo, 7, Logger::LL_INFO},
  97.   // Backup
  98.   { EventReport::BackupStarted, LogLevel::llBackup, 7, Logger::LL_INFO },
  99.   { EventReport::BackupCompleted, LogLevel::llBackup, 7, Logger::LL_INFO },
  100.   { EventReport::BackupFailedToStart, LogLevel::llBackup, 7, Logger::LL_ALERT},
  101.   { EventReport::BackupAborted, LogLevel::llBackup, 7, Logger::LL_ALERT }
  102. };
  103. const Uint32 EventLoggerBase::matrixSize = sizeof(EventLoggerBase::matrix)/
  104.                                        sizeof(EventRepLogLevelMatrix);
  105. const char*
  106. EventLogger::getText(char * m_text, size_t m_text_len, 
  107.      int type,
  108.      const Uint32* theData, NodeId nodeId)
  109. {
  110.   // TODO: Change the switch implementation...
  111.   char theNodeId[32];
  112.   if (nodeId != 0){
  113.     BaseString::snprintf(theNodeId, 32, "Node %u: ", nodeId);
  114.   } else {
  115.     theNodeId[0] = 0;
  116.   }
  117.   EventReport::EventType eventType = (EventReport::EventType)type;
  118.   switch (eventType){
  119.   case EventReport::Connected:
  120.     BaseString::snprintf(m_text, m_text_len, 
  121.        "%sNode %u Connected",
  122.        theNodeId,
  123.        theData[1]);
  124.   break;
  125.   case EventReport::ConnectedApiVersion:
  126.     BaseString::snprintf(m_text, m_text_len, 
  127.        "%sNode %u: API version %d.%d.%d",
  128.        theNodeId,
  129.        theData[1],
  130.        getMajor(theData[2]),
  131.        getMinor(theData[2]),
  132.        getBuild(theData[2]));
  133.   break;
  134.   case EventReport::Disconnected:
  135.     BaseString::snprintf(m_text, m_text_len, 
  136.        "%sNode %u Disconnected", 
  137.        theNodeId,
  138.        theData[1]);
  139.   break;
  140.   case EventReport::CommunicationClosed:
  141.     //-----------------------------------------------------------------------
  142.     // REPORT communication to node closed.
  143.     //-----------------------------------------------------------------------
  144.     BaseString::snprintf(m_text, m_text_len, 
  145.        "%sCommunication to Node %u closed", 
  146.        theNodeId,
  147.        theData[1]);
  148.   break;
  149.   case EventReport::CommunicationOpened:
  150.     //-----------------------------------------------------------------------
  151.     // REPORT communication to node opened.
  152.     //-----------------------------------------------------------------------
  153.     BaseString::snprintf(m_text, m_text_len, 
  154.        "%sCommunication to Node %u opened", 
  155.        theNodeId,
  156.        theData[1]);
  157.   break;
  158.   case EventReport::NDBStartStarted:
  159.     //-----------------------------------------------------------------------
  160.     // Start of NDB has been initiated.
  161.     //-----------------------------------------------------------------------
  162.     BaseString::snprintf(m_text, m_text_len, 
  163.        "%sStart initiated (version %d.%d.%d)", 
  164.        theNodeId ,
  165.        getMajor(theData[1]),
  166.        getMinor(theData[1]),
  167.        getBuild(theData[1]));
  168.   break;
  169.   case EventReport::NDBStopStarted:
  170.     BaseString::snprintf(m_text, m_text_len,
  171.        "%s%s shutdown initiated", 
  172.        theNodeId, 
  173.        (theData[1] == 1 ? "Cluster" : "Node"));
  174.   break;
  175.   case EventReport::NDBStopAborted:
  176.     BaseString::snprintf(m_text, m_text_len,
  177.        "%sNode shutdown aborted",
  178.        theNodeId);
  179.   break;
  180.   case EventReport::NDBStartCompleted:
  181.     //-----------------------------------------------------------------------
  182.     // Start of NDB has been completed.
  183.     //-----------------------------------------------------------------------
  184.     BaseString::snprintf(m_text, m_text_len, 
  185.        "%sStarted (version %d.%d.%d)", 
  186.        theNodeId ,
  187.        getMajor(theData[1]),
  188.        getMinor(theData[1]),
  189.        getBuild(theData[1]));
  190.   break;
  191.   case EventReport::STTORRYRecieved:
  192.     //-----------------------------------------------------------------------
  193.     // STTORRY recevied after restart finished.
  194.     //-----------------------------------------------------------------------
  195.     BaseString::snprintf(m_text, m_text_len, 
  196.        "%sSTTORRY received after restart finished",
  197.        theNodeId);
  198.   break;
  199.   case EventReport::StartPhaseCompleted:{
  200.     //-----------------------------------------------------------------------
  201.     // REPORT Start phase completed.
  202.     //-----------------------------------------------------------------------
  203.     const char * type = "<Unknown>";
  204.     switch((NodeState::StartType)theData[2]){
  205.     case NodeState::ST_INITIAL_START:
  206.       type = "(initial start)";
  207.       break;
  208.     case NodeState::ST_SYSTEM_RESTART:
  209.       type = "(system restart)";
  210.       break;
  211.     case NodeState::ST_NODE_RESTART:
  212.       type = "(node restart)";
  213.       break;
  214.     case NodeState::ST_INITIAL_NODE_RESTART:
  215.       type = "(initial node restart)";
  216.       break;
  217.     case NodeState::ST_ILLEGAL_TYPE:
  218.       type = "";
  219.       break;
  220.     default:{
  221.       BaseString::snprintf(m_text, m_text_len, 
  222.  "%sStart phase %u completed (unknown = %d)", 
  223.  theNodeId,
  224.  theData[1],
  225.  theData[2]);
  226.       return m_text;
  227.     }
  228.     }
  229.     BaseString::snprintf(m_text, m_text_len, 
  230.        "%sStart phase %u completed %s", 
  231.        theNodeId,
  232.        theData[1],
  233.        type);
  234.     return m_text;
  235.     break;
  236.   }
  237.   case EventReport::CM_REGCONF:
  238.     BaseString::snprintf(m_text, m_text_len, 
  239.        "%sCM_REGCONF president = %u, own Node = %u, our dynamic id = %u"
  240.        , 
  241.        theNodeId,
  242.        theData[2], 
  243.        theData[1],
  244.        theData[3]);
  245.   break;
  246.   case EventReport::CM_REGREF:
  247.   {
  248.     const char* line = "";
  249.     switch (theData[3]) {
  250.     case 0:
  251.       line = "Busy";
  252.       break;
  253.     case 1:
  254.       line = "Election with wait = false";
  255.       break;
  256.     case 2:
  257.       line = "Election with wait = false";
  258.       break;
  259.     case 3:
  260.       line = "Not president";
  261.       break;
  262.     case 4:
  263.       line = "Election without selecting new candidate";
  264.       break;
  265.     default:
  266.       line = "No such cause";
  267.       break;
  268.     }//switch
  269.     BaseString::snprintf(m_text, m_text_len, 
  270.        "%sCM_REGREF from Node %u to our Node %u. Cause = %s", 
  271.        theNodeId,
  272.        theData[2], 
  273.        theData[1], 
  274.        line);
  275.   }
  276.   break;
  277.   case EventReport::FIND_NEIGHBOURS:
  278.     //-----------------------------------------------------------------------
  279.     // REPORT Node Restart copied a fragment.
  280.     //-----------------------------------------------------------------------
  281.     BaseString::snprintf(m_text, 
  282.        m_text_len, 
  283.        "%sWe are Node %u with dynamic ID %u, our left neighbour "
  284.        "is Node %u, our right is Node %u", 
  285.        theNodeId,
  286.        theData[1], 
  287.        theData[4], 
  288.        theData[2], 
  289.        theData[3]);
  290.   break;
  291.   case EventReport::NodeFailCompleted:
  292.     //-----------------------------------------------------------------------
  293.     // REPORT Node failure phase completed.
  294.     //-----------------------------------------------------------------------
  295.     if (theData[1] == 0)
  296.     {
  297.       if (theData[3] != 0) {
  298.         BaseString::snprintf(m_text, m_text_len, 
  299.  "%sNode %u completed failure of Node %u", 
  300.  theNodeId,
  301.  theData[3], 
  302.  theData[2]);
  303.       } else {
  304.         BaseString::snprintf(m_text, m_text_len, 
  305.  "%sAll nodes completed failure of Node %u", 
  306.  theNodeId,
  307.  theData[2]);
  308.       }//if      
  309.     } else {
  310.       const char* line = "";
  311.       if (theData[1] == DBTC){
  312. line = "DBTC";
  313.       }else if (theData[1] == DBDICT){
  314. line = "DBDICT";
  315.       }else if (theData[1] == DBDIH){
  316. line = "DBDIH";
  317.       }else if (theData[1] == DBLQH){
  318. line = "DBLQH";
  319.       }
  320.       
  321.       BaseString::snprintf(m_text, m_text_len, 
  322.  "%sNode failure of %u %s completed", 
  323.  theNodeId,
  324.  theData[2], 
  325.  line);
  326.     }
  327.     break;
  328.   case EventReport::NODE_FAILREP:
  329.     BaseString::snprintf(m_text, 
  330.        m_text_len, 
  331.        "%sNode %u has failed. The Node state at failure "
  332.        "was %u", 
  333.        theNodeId,
  334.        theData[1], 
  335.        theData[2]); 
  336.   break;
  337.   case EventReport::ArbitState:
  338.     //-----------------------------------------------------------------------
  339.     // REPORT arbitrator found or lost.
  340.     //-----------------------------------------------------------------------
  341.     { const ArbitSignalData* sd = (ArbitSignalData*)theData;
  342.       char ticketText[ArbitTicket::TextLength + 1];
  343.       char errText[ArbitCode::ErrTextLength + 1];
  344.       const unsigned code = sd->code & 0xFFFF;
  345.       const unsigned state = sd->code >> 16;
  346.       switch (code) {
  347.       case ArbitCode::ThreadStart:
  348.         BaseString::snprintf(m_text, m_text_len,
  349.           "%sPresident restarts arbitration thread [state=%u]",
  350.           theNodeId, state);
  351.         break;
  352.       case ArbitCode::PrepPart2:
  353. sd->ticket.getText(ticketText, sizeof(ticketText));
  354. BaseString::snprintf(m_text, m_text_len,
  355.   "%sPrepare arbitrator node %u [ticket=%s]",
  356.   theNodeId, sd->node, ticketText);
  357. break;
  358.       case ArbitCode::PrepAtrun:
  359. sd->ticket.getText(ticketText, sizeof(ticketText));
  360. BaseString::snprintf(m_text, m_text_len,
  361.   "%sReceive arbitrator node %u [ticket=%s]",
  362.   theNodeId, sd->node, ticketText);
  363. break;
  364.       case ArbitCode::ApiStart:
  365. sd->ticket.getText(ticketText, sizeof(ticketText));
  366. BaseString::snprintf(m_text, m_text_len,
  367.   "%sStarted arbitrator node %u [ticket=%s]",
  368.   theNodeId, sd->node, ticketText);
  369. break;
  370.       case ArbitCode::ApiFail:
  371. BaseString::snprintf(m_text, m_text_len,
  372.   "%sLost arbitrator node %u - process failure [state=%u]",
  373.   theNodeId, sd->node, state);
  374. break;
  375.       case ArbitCode::ApiExit:
  376. BaseString::snprintf(m_text, m_text_len,
  377.   "%sLost arbitrator node %u - process exit [state=%u]",
  378.   theNodeId, sd->node, state);
  379. break;
  380.       default:
  381. ArbitCode::getErrText(code, errText, sizeof(errText));
  382. BaseString::snprintf(m_text, m_text_len,
  383.   "%sLost arbitrator node %u - %s [state=%u]",
  384.   theNodeId, sd->node, errText, state);
  385. break;
  386.       }
  387.     }
  388.     break;
  389.   case EventReport::ArbitResult:
  390.     //-----------------------------------------------------------------------
  391.     // REPORT arbitration result (the failures may not reach us).
  392.     //-----------------------------------------------------------------------
  393.     { const ArbitSignalData* sd = (ArbitSignalData*)theData;
  394.       char errText[ArbitCode::ErrTextLength + 1];
  395.       const unsigned code = sd->code & 0xFFFF;
  396.       const unsigned state = sd->code >> 16;
  397.       switch (code) {
  398.       case ArbitCode::LoseNodes:
  399. BaseString::snprintf(m_text, m_text_len,
  400.   "%sArbitration check lost - less than 1/2 nodes left",
  401.   theNodeId);
  402. break;
  403.       case ArbitCode::WinNodes:
  404. BaseString::snprintf(m_text, m_text_len,
  405.   "%sArbitration check won - all node groups and more than 1/2 nodes left",
  406.   theNodeId);
  407. break;
  408.       case ArbitCode::WinGroups:
  409. BaseString::snprintf(m_text, m_text_len,
  410.   "%sArbitration check won - node group majority",
  411.   theNodeId);
  412. break;
  413.       case ArbitCode::LoseGroups:
  414. BaseString::snprintf(m_text, m_text_len,
  415.   "%sArbitration check lost - missing node group",
  416.   theNodeId);
  417. break;
  418.       case ArbitCode::Partitioning:
  419. BaseString::snprintf(m_text, m_text_len,
  420.   "%sNetwork partitioning - arbitration required",
  421.   theNodeId);
  422. break;
  423.       case ArbitCode::WinChoose:
  424. BaseString::snprintf(m_text, m_text_len,
  425.   "%sArbitration won - positive reply from node %u",
  426.   theNodeId, sd->node);
  427. break;
  428.       case ArbitCode::LoseChoose:
  429. BaseString::snprintf(m_text, m_text_len,
  430.   "%sArbitration lost - negative reply from node %u",
  431.   theNodeId, sd->node);
  432. break;
  433.       case ArbitCode::LoseNorun:
  434. BaseString::snprintf(m_text, m_text_len,
  435.   "%sNetwork partitioning - no arbitrator available",
  436.   theNodeId);
  437. break;
  438.       case ArbitCode::LoseNocfg:
  439. BaseString::snprintf(m_text, m_text_len,
  440.   "%sNetwork partitioning - no arbitrator configured",
  441.   theNodeId);
  442. break;
  443.       default:
  444. ArbitCode::getErrText(code, errText, sizeof(errText));
  445. BaseString::snprintf(m_text, m_text_len,
  446.   "%sArbitration failure - %s [state=%u]",
  447.   theNodeId, errText, state);
  448. break;
  449.       }
  450.     }
  451.     break;
  452.   case EventReport::GlobalCheckpointStarted:
  453.     //-----------------------------------------------------------------------
  454.     // This event reports that a global checkpoint has been started and this
  455.     // node is the master of this global checkpoint.
  456.     //-----------------------------------------------------------------------
  457.     BaseString::snprintf(m_text, 
  458.        m_text_len, 
  459.        "%sGlobal checkpoint %u started", 
  460.        theNodeId,
  461.        theData[1]);
  462.     break;
  463.   case EventReport::GlobalCheckpointCompleted:
  464.     //-----------------------------------------------------------------------
  465.     // This event reports that a global checkpoint has been completed on this
  466.     // node and the node is the master of this global checkpoint.
  467.     //-----------------------------------------------------------------------
  468.     BaseString::snprintf(m_text, m_text_len, 
  469.        "%sGlobal checkpoint %u completed", 
  470.        theNodeId,
  471.        theData[1]);
  472.     break;
  473.   case EventReport::LocalCheckpointStarted:
  474.     //-----------------------------------------------------------------------
  475.     // This event reports that a local checkpoint has been started and this
  476.     // node is the master of this local checkpoint.
  477.     //-----------------------------------------------------------------------
  478.     BaseString::snprintf(m_text, 
  479.        m_text_len, 
  480.        "%sLocal checkpoint %u started. "
  481.        "Keep GCI = %u oldest restorable GCI = %u", 
  482.        theNodeId,
  483.        theData[1], 
  484.        theData[2], 
  485.        theData[3]);
  486.     break;
  487.   case EventReport::LocalCheckpointCompleted:
  488.     //-----------------------------------------------------------------------
  489.     // This event reports that a local checkpoint has been completed on this
  490.     // node and the node is the master of this local checkpoint.
  491.     //-----------------------------------------------------------------------
  492.     BaseString::snprintf(m_text, 
  493.        m_text_len, 
  494.        "%sLocal checkpoint %u completed", 
  495.        theNodeId,
  496.        theData[1]);
  497.     break;
  498.   case EventReport::TableCreated:
  499.     //-----------------------------------------------------------------------
  500.     // This event reports that a table has been created.
  501.     //-----------------------------------------------------------------------
  502.     BaseString::snprintf(m_text, m_text_len, 
  503.        "%sTable with ID =  %u created", 
  504.        theNodeId,
  505.        theData[1]);
  506.     break;
  507.   case EventReport::LCPStoppedInCalcKeepGci:
  508.     if (theData[1] == 0)
  509.       BaseString::snprintf(m_text, m_text_len, 
  510.  "%sLocal Checkpoint stopped in CALCULATED_KEEP_GCI",
  511.  theNodeId);
  512.     break;
  513.   case EventReport::NR_CopyDict:
  514.     //-----------------------------------------------------------------------
  515.     // REPORT Node Restart completed copy of dictionary information.
  516.     //-----------------------------------------------------------------------
  517.     BaseString::snprintf(m_text, 
  518.        m_text_len, 
  519.        "%sNode restart completed copy of dictionary information",
  520.        theNodeId);
  521.     break;
  522.   case EventReport::NR_CopyDistr:
  523.     //-----------------------------------------------------------------------
  524.     // REPORT Node Restart completed copy of distribution information.
  525.     //-----------------------------------------------------------------------
  526.     BaseString::snprintf(m_text, 
  527.        m_text_len, 
  528.        "%sNode restart completed copy of distribution information",
  529.        theNodeId);
  530.     break;
  531.   case EventReport::NR_CopyFragsStarted:
  532.     //-----------------------------------------------------------------------
  533.     // REPORT Node Restart is starting to copy the fragments.
  534.     //-----------------------------------------------------------------------
  535.     BaseString::snprintf(m_text, 
  536.        m_text_len, 
  537.        "%sNode restart starting to copy the fragments "
  538.        "to Node %u", 
  539.        theNodeId,
  540.        theData[1]);
  541.     break;
  542.   case EventReport::NR_CopyFragDone:
  543.     //-----------------------------------------------------------------------
  544.     // REPORT Node Restart copied a fragment.
  545.     //-----------------------------------------------------------------------
  546.     BaseString::snprintf(m_text, 
  547.        m_text_len, 
  548.        "%sTable ID = %u, fragment ID = %u have been copied "
  549.        "to Node %u", 
  550.        theNodeId,
  551.        theData[2], 
  552.        theData[3], 
  553.        theData[1]);
  554.   break;
  555.   case EventReport::NR_CopyFragsCompleted:
  556.     BaseString::snprintf(m_text, 
  557.        m_text_len, 
  558.        "%sNode restart completed copying the fragments "
  559.        "to Node %u", 
  560.        theNodeId,
  561.        theData[1]);
  562.     break;
  563.   case EventReport::LCPFragmentCompleted:
  564.     BaseString::snprintf(m_text, 
  565.        m_text_len, 
  566.        "%sTable ID = %u, fragment ID = %u has completed LCP "
  567.        "on Node %u maxGciStarted: %d maxGciCompleted: %d", 
  568.        theNodeId,
  569.        theData[2], 
  570.        theData[3], 
  571.        theData[1],
  572.        theData[4],
  573.        theData[5]);
  574.     break;
  575.   case EventReport::TransReportCounters:
  576.     // -------------------------------------------------------------------  
  577.     // Report information about transaction activity once per 10 seconds.
  578.     // ------------------------------------------------------------------- 
  579.     BaseString::snprintf(m_text, 
  580.        m_text_len, 
  581.        "%sTrans. Count = %u, Commit Count = %u, "
  582.        "Read Count = %u, Simple Read Count = %u,n"
  583.        "Write Count = %u, AttrInfo Count = %u, "
  584.        "Concurrent Operations = %u, Abort Count = %un"
  585.        " Scans: %u Range scans: %u", 
  586.        theNodeId,
  587.        theData[1], 
  588.        theData[2], 
  589.        theData[3], 
  590.        theData[4],
  591.        theData[5], 
  592.        theData[6], 
  593.        theData[7], 
  594.        theData[8],
  595.        theData[9],
  596.        theData[10]);
  597.     break;
  598.   case EventReport::OperationReportCounters:
  599.     BaseString::snprintf(m_text, m_text_len,
  600.        "%sOperations=%u",
  601.        theNodeId, 
  602.        theData[1]);
  603.     break;
  604.   case EventReport::UndoLogBlocked:
  605.     //-----------------------------------------------------------------------
  606.     // REPORT Undo Logging blocked due to buffer near to overflow.
  607.     //-----------------------------------------------------------------------
  608.     BaseString::snprintf(m_text, 
  609.        m_text_len, 
  610.        "%sACC Blocked %u and TUP Blocked %u times last second",
  611.        theNodeId,
  612.        theData[1],
  613.        theData[2]);
  614.   break;
  615.   case EventReport::TransporterError:
  616.   case EventReport::TransporterWarning:
  617.     BaseString::snprintf(m_text, 
  618.        m_text_len, 
  619.        "%sTransporter to node %d reported error 0x%x",
  620.        theNodeId,
  621.        theData[1],
  622.        theData[2]);
  623.   break;
  624.   case EventReport::MissedHeartbeat:
  625.     //-----------------------------------------------------------------------
  626.     // REPORT Undo Logging blocked due to buffer near to overflow.
  627.     //-----------------------------------------------------------------------
  628.     BaseString::snprintf(m_text, 
  629.        m_text_len, 
  630.        "%sNode %d missed heartbeat %d",
  631.        theNodeId,
  632.        theData[1],
  633.        theData[2]);
  634.   break;
  635.   case EventReport::DeadDueToHeartbeat:
  636.     //-----------------------------------------------------------------------
  637.     // REPORT Undo Logging blocked due to buffer near to overflow.
  638.     //-----------------------------------------------------------------------
  639.     BaseString::snprintf(m_text, 
  640.        m_text_len, 
  641.        "%sNode %d declared dead due to missed heartbeat",
  642.        theNodeId,
  643.        theData[1]);
  644.   break;
  645.   case EventReport::JobStatistic:
  646.     BaseString::snprintf(m_text, 
  647.        m_text_len, 
  648.        "%sMean loop Counter in doJob last 8192 times = %u",
  649.        theNodeId,
  650.        theData[1]);
  651.     break;
  652.   case EventReport::SendBytesStatistic:
  653.     BaseString::snprintf(m_text, 
  654.        m_text_len, 
  655.        "%sMean send size to Node = %d last 4096 sends = %u bytes",
  656.        theNodeId,
  657.        theData[1],
  658.        theData[2]);
  659.     break;
  660.   case EventReport::ReceiveBytesStatistic:
  661.     BaseString::snprintf(m_text, 
  662.        m_text_len, 
  663.        "%sMean receive size to Node = %d last 4096 sends = %u bytes",
  664.        theNodeId,
  665.        theData[1],
  666.        theData[2]);
  667.   break;
  668.   case EventReport::SentHeartbeat:
  669.     BaseString::snprintf(m_text, 
  670.        m_text_len, 
  671.        "%sNode Sent Heartbeat to node = %d",
  672.        theNodeId,
  673.        theData[1]);
  674.   break;
  675.   case EventReport::CreateLogBytes:
  676.     BaseString::snprintf(m_text, 
  677.        m_text_len, 
  678.        "%sLog part %u, log file %u, MB %u",
  679.        theNodeId,
  680.        theData[1],
  681.        theData[2],
  682.        theData[3]);
  683.   break;
  684.   case EventReport::StartLog:
  685.     BaseString::snprintf(m_text, 
  686.        m_text_len, 
  687.        "%sLog part %u, start MB %u, stop MB %u, last GCI, log exec %u",
  688.        theNodeId,
  689.        theData[1],
  690.        theData[2],
  691.        theData[3],
  692.        theData[4]);
  693.   break;
  694.   case EventReport::StartREDOLog:
  695.     BaseString::snprintf(m_text, 
  696.        m_text_len, 
  697.        "%sNode: %d StartLog: [GCI Keep: %d LastCompleted: %d NewestRestorable: %d]",
  698.        theNodeId,
  699.        theData[1],
  700.        theData[2],
  701.        theData[3],
  702.        theData[4]);
  703.   break;
  704.   case EventReport::UNDORecordsExecuted:{
  705.     const char* line = "";
  706.     if (theData[1] == DBTUP){
  707.       line = "DBTUP";
  708.     }else if (theData[1] == DBACC){
  709.       line = "DBACC";
  710.     }
  711.     
  712.     BaseString::snprintf(m_text, 
  713.        m_text_len, 
  714.        "%s UNDO %s %d [%d %d %d %d %d %d %d %d %d]",
  715.        theNodeId,
  716.        line,
  717.        theData[2],
  718.        theData[3],
  719.        theData[4],
  720.        theData[5],
  721.        theData[6],
  722.        theData[7],
  723.        theData[8],
  724.        theData[9],
  725.        theData[10],
  726.        theData[11]);
  727.   }
  728.     break;
  729.   case EventReport::InfoEvent:
  730.     BaseString::snprintf(m_text, 
  731.        m_text_len, 
  732.        "%s%s",
  733.        theNodeId,
  734.        (char *)&theData[1]);
  735.   break;
  736.   case EventReport::WarningEvent:
  737.     BaseString::snprintf(m_text, 
  738.        m_text_len, 
  739.        "%s%s",
  740.        theNodeId,
  741.        (char *)&theData[1]);
  742.   break;
  743.   case EventReport::GCP_TakeoverStarted:
  744.     BaseString::snprintf(m_text,
  745.        m_text_len,
  746.        "%sGCP Take over started", theNodeId);
  747.   break;
  748.   case EventReport::GCP_TakeoverCompleted:
  749.     BaseString::snprintf(m_text,
  750.        m_text_len,
  751.        "%sGCP Take over completed", theNodeId);
  752.   break;
  753.   case EventReport::LCP_TakeoverStarted:
  754.     BaseString::snprintf(m_text,
  755.        m_text_len,
  756.        "%sLCP Take over started", theNodeId);
  757.   break;
  758.   case EventReport::LCP_TakeoverCompleted:
  759.     BaseString::snprintf(m_text,
  760.        m_text_len,
  761.        "%sLCP Take over completed (state = %d)", 
  762.        theNodeId, theData[1]);
  763.   break;
  764.   case EventReport::MemoryUsage:{
  765.     const int gth = theData[1];
  766.     const int size = theData[2];
  767.     const int used = theData[3];
  768.     const int total = theData[4];
  769.     const int block = theData[5];
  770.     const int percent = (used*100)/total;
  771.     
  772.     BaseString::snprintf(m_text, m_text_len,
  773.        "%s%s usage %s %d%s(%d %dK pages of total %d)",
  774.        theNodeId,
  775.        (block==DBACC ? "Index" : (block == DBTUP ?"Data":"<unknown>")),
  776.        (gth == 0 ? "is" : (gth > 0 ? "increased to" : "decreased to")),
  777.        percent, "%",
  778.        used, size/1024, total
  779.        );
  780.     break;
  781.   }
  782.   case EventReport::SingleUser : 
  783.   {   
  784.     switch (theData[1])
  785.     {
  786.     case 0:
  787.       BaseString::snprintf(m_text, m_text_len, 
  788.    "%sEntering single user mode", theNodeId);
  789.       break;
  790.     case 1:
  791.       BaseString::snprintf(m_text, m_text_len, 
  792.    "%sEntered single user mode %d", theNodeId, theData[2]);
  793.       break;
  794.     case 2:
  795.       BaseString::snprintf(m_text, m_text_len, 
  796.    "%sExiting single user mode", theNodeId);
  797.       break;
  798.     default:
  799.       BaseString::snprintf(m_text, m_text_len, 
  800.    "%sUnknown single user report %d", theNodeId, theData[1]);
  801.       break;
  802.     }
  803.     break;
  804.   }      
  805.   case EventReport::BackupStarted:
  806.     BaseString::snprintf(m_text,
  807.        m_text_len,
  808.        "%sBackup %d started from node %d", 
  809.        theNodeId, theData[2], refToNode(theData[1]));
  810.   break;
  811.   case EventReport::BackupFailedToStart:
  812.     BaseString::snprintf(m_text,
  813.        m_text_len,
  814.        "%sBackup request from %d failed to start. Error: %d", 
  815.        theNodeId, refToNode(theData[1]), theData[2]);
  816.   break;
  817.   case EventReport::BackupCompleted:
  818.     BaseString::snprintf(m_text,
  819.        m_text_len,
  820.        "%sBackup %u started from node %u completedn" 
  821.        " StartGCP: %u StopGCP: %un"
  822.        " #Records: %u #LogRecords: %un"
  823.        " Data: %u bytes Log: %u bytes",
  824.        theNodeId, theData[2], refToNode(theData[1]),
  825.        theData[3], theData[4], theData[6], theData[8],
  826.        theData[5], theData[7]);
  827.   break;
  828.   case EventReport::BackupAborted:
  829.     BaseString::snprintf(m_text,
  830.        m_text_len,
  831.        "%sBackup %d started from %d has been aborted. Error: %d",
  832.        theNodeId, 
  833.        theData[2], 
  834.        refToNode(theData[1]), 
  835.        theData[3]);
  836.   break;
  837.   default:
  838.     BaseString::snprintf(m_text, 
  839.        m_text_len, 
  840.        "%sUnknown event: %d",
  841.        theNodeId,
  842.        theData[0]);
  843.   
  844.   }
  845.   return m_text;
  846. }
  847. EventLogger::EventLogger() : m_filterLevel(15)
  848. {
  849.   setCategory("EventLogger");
  850.   enable(Logger::LL_INFO, Logger::LL_ALERT); 
  851. }
  852. EventLogger::~EventLogger()
  853. {
  854. }
  855. bool
  856. EventLogger::open(const char* logFileName, int maxNoFiles, long maxFileSize, 
  857.   unsigned int maxLogEntries)
  858. {
  859.   return addHandler(new FileLogHandler(logFileName, maxNoFiles, maxFileSize, 
  860.        maxLogEntries));
  861. }
  862. void
  863. EventLogger::close()
  864. {
  865.   removeAllHandlers();
  866. }
  867. static NdbOut&
  868. operator<<(NdbOut& out, const LogLevel & ll)
  869. {
  870.   out << "[LogLevel: ";
  871.   for(size_t i = 0; i<LogLevel::LOGLEVEL_CATEGORIES; i++)
  872.     out << ll.getLogLevel((LogLevel::EventCategory)i) << " ";
  873.   out << "]";
  874.   return out;
  875. }
  876. int
  877. EventLoggerBase::event_lookup(int eventType,
  878.       LogLevel::EventCategory &cat,
  879.       Uint32 &threshold, 
  880.       Logger::LoggerLevel &severity)
  881. {
  882.   for(unsigned i = 0; i<EventLoggerBase::matrixSize; i++){
  883.     if(EventLoggerBase::matrix[i].eventType == eventType){
  884.       cat = EventLoggerBase::matrix[i].eventCategory;
  885.       threshold = EventLoggerBase::matrix[i].threshold;
  886.       severity = EventLoggerBase::matrix[i].severity;
  887.       return 0;
  888.     }
  889.   }
  890.   return 1;
  891. }
  892. void 
  893. EventLogger::log(int eventType, const Uint32* theData, NodeId nodeId,
  894.  const LogLevel* ll)
  895. {
  896.   Uint32 threshold = 0;
  897.   Logger::LoggerLevel severity = Logger::LL_WARNING;
  898.   LogLevel::EventCategory cat= LogLevel::llInvalid;
  899.   DBUG_ENTER("EventLogger::log");
  900.   DBUG_PRINT("enter",("eventType=%d, nodeid=%d", eventType, nodeId));
  901.   if (EventLoggerBase::event_lookup(eventType,cat,threshold,severity))
  902.     DBUG_VOID_RETURN;
  903.   
  904.   Uint32 set = ll?ll->getLogLevel(cat) : m_logLevel.getLogLevel(cat);
  905.   DBUG_PRINT("info",("threshold=%d, set=%d", threshold, set));
  906.   if (ll)
  907.     DBUG_PRINT("info",("m_logLevel.getLogLevel=%d", m_logLevel.getLogLevel(cat)));
  908.   if (threshold <= set){
  909.     switch (severity){
  910.     case Logger::LL_ALERT:
  911.       alert(EventLogger::getText(m_text, sizeof(m_text), 
  912.  eventType, theData, nodeId));
  913.       break;
  914.       
  915.     case Logger::LL_CRITICAL:
  916.       critical(EventLogger::getText(m_text, sizeof(m_text), 
  917.     eventType, theData, nodeId));
  918.       break;
  919.       
  920.     case Logger::LL_WARNING:
  921.       warning(EventLogger::getText(m_text, sizeof(m_text), 
  922.    eventType, theData, nodeId));
  923.       break;
  924.       
  925.     case Logger::LL_ERROR:
  926.       error(EventLogger::getText(m_text, sizeof(m_text), 
  927.  eventType, theData, nodeId));
  928.       break;
  929.       
  930.     case Logger::LL_INFO:
  931.       info(EventLogger::getText(m_text, sizeof(m_text), 
  932. eventType, theData, nodeId));
  933.       break;
  934.       
  935.     case Logger::LL_DEBUG:
  936.       debug(EventLogger::getText(m_text, sizeof(m_text), 
  937.  eventType, theData, nodeId));
  938.       break;
  939.       
  940.     default:
  941.       info(EventLogger::getText(m_text, sizeof(m_text), 
  942. eventType, theData, nodeId));
  943.       break;
  944.     }
  945.   } // if (..
  946.   DBUG_VOID_RETURN;
  947. }
  948. int
  949. EventLogger::getFilterLevel() const
  950. {
  951.   return m_filterLevel;
  952. }
  953. void 
  954. EventLogger::setFilterLevel(int filterLevel)
  955. {
  956.   m_filterLevel = filterLevel;
  957. }
  958. //
  959. // PRIVATE
  960. //