Commit 7b0857a7 authored by unknown's avatar unknown
Browse files

fixed so that last repeats are printed first with correct time if another message comes

decided for fixed size buffers in LogHandler repeated messages


mysql-test/ndb/basic.result:
  updated ndb test
ndb/include/logger/LogHandler.hpp:
  decided for fixed size buffers
ndb/include/logger/Logger.hpp:
  decided for fixed size buffers
ndb/src/common/logger/LogHandler.cpp:
  decided for fixed size buffers
ndb/src/common/logger/Logger.cpp:
  decided for fixed size buffers
parent eebd8d7e
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -31,12 +31,12 @@ QUIT Quit management client
<id>       = ALL | Any database node id

Connected to Management Server at: localhost:1186
Node 1: started (Version 4.1.8)
Node 2: started (Version 4.1.8)
Node 1: started (Version 4.1.9)
Node 2: started (Version 4.1.9)

Node 1: started (Version 4.1.8)
Node 1: started (Version 4.1.9)

Node 2: started (Version 4.1.8)
Node 2: started (Version 4.1.9)

Executing CLUSTERLOG on node 1 OK!
Executing CLUSTERLOG on node 2 OK!
+15 −14
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@

#include "Logger.hpp"


/**
 * This class is the base class for all log handlers. A log handler is 
 * responsible for formatting and writing log messages to a specific output.
@@ -68,7 +67,8 @@ public:
  /**
   * Append a log message to the output stream/file whatever.
   * append() will call writeHeader(), writeMessage() and writeFooter() for
   * a child class and in that order.
   * a child class and in that order. Append checks for repeated messages.
   * append_impl() does not check for repeats.
   *
   * @param pCategory the category/name to tag the log entry with.
   * @param level the log level.
@@ -76,6 +76,8 @@ public:
   */
  void append(const char* pCategory, Logger::LoggerLevel level,
	      const char* pMsg);
  void append_impl(const char* pCategory, Logger::LoggerLevel level,
		   const char* pMsg);

  /**
   * Returns a default formatted header. It currently has the
@@ -111,14 +113,6 @@ public:
   */
  void setDateTimeFormat(const char* pFormat);
  
  /**
   * Returns a string date and time string.
   * 
   * @param pStr a string.
   * @return a string with date and time.
   */
  char* getTimeAsString(char* pStr) const;

  /**
   * Returns the error code.
   */
@@ -185,6 +179,15 @@ protected:
  virtual void writeFooter() = 0;
  
private: 
  /**
   * Returns a string date and time string.
   * @note does not update time, uses m_now as time
   * @param pStr a string.
   * @return a string with date and time.
   */
  char* getTimeAsString(char* pStr) const;
  time_t m_now;

  /** Prohibit */
  LogHandler(const LogHandler&);
  LogHandler* operator = (const LogHandler&);
@@ -197,11 +200,9 @@ private:
  unsigned m_count_repeated_messages;
  unsigned m_max_repeat_frequency;
  time_t m_last_log_time;
  char m_last_category_buf[16];
  char m_last_message_buf[256];
  char *m_last_category;
  char m_last_category[MAX_HEADER_LENGTH];
  char m_last_message[MAX_LOG_MESSAGE_SIZE];
  Logger::LoggerLevel m_last_level;
  char *m_last_message;
};

#endif
+2 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@
#include <ndb_global.h>
#include <BaseString.hpp>

#define MAX_LOG_MESSAGE_SIZE 1024

class LogHandler;
class LogHandlerList;

+24 −27
Original line number Diff line number Diff line
@@ -23,21 +23,18 @@
//
LogHandler::LogHandler() : 
  m_pDateTimeFormat("%d-%.2d-%.2d %.2d:%.2d:%.2d"),
  m_errorCode(0),
  m_last_category(m_last_category_buf),
  m_last_message(m_last_message_buf)
  m_errorCode(0)
{
  m_max_repeat_frequency= 3; // repeat messages maximum every 3 seconds
  m_last_category_buf[0]= 0;
  m_last_message_buf[0]= 0;
  m_count_repeated_messages= 0;
  m_last_category[0]= 0;
  m_last_message[0]= 0;
  m_last_log_time= 0;
  m_now= 0;
}

LogHandler::~LogHandler()
{  
  if (m_last_message != m_last_message_buf)
    free(m_last_message);
  if (m_last_category != m_last_category_buf)
    free(m_last_category);
}

void 
@@ -51,42 +48,44 @@ LogHandler::append(const char* pCategory, Logger::LoggerLevel level,
      strcmp(pCategory, m_last_category) ||
      strcmp(pMsg, m_last_message))
  {
    if (m_last_message != m_last_message_buf)
      free(m_last_message);
    if (m_last_category != m_last_category_buf)
      free(m_last_category);

    m_count_repeated_messages= 0;
    if (m_count_repeated_messages > 0) // print that message
      append_impl(m_last_category, m_last_level, m_last_message);

    m_last_level= level;
    BaseString::snprintf(m_last_category_buf, sizeof(m_last_category_buf), "%s", pCategory);
    BaseString::snprintf(m_last_message_buf, sizeof(m_last_message_buf), "%s", pMsg);
    // ToDo: handle too long messages correctly
    // right now all that will happen is that too long messages
    // will be repeated unneccesarily
    strncpy(m_last_category, pCategory, sizeof(m_last_category));
    strncpy(m_last_message, pMsg, sizeof(m_last_message));
  }
  else // repeated message
  {
    if (now < m_last_log_time+m_max_repeat_frequency)
    {
      m_count_repeated_messages++;
      m_now= now;
      return;
    }
  }

  m_now= now;

  append_impl(pCategory, level, pMsg);
  m_last_log_time= now;
}

void 
LogHandler::append_impl(const char* pCategory, Logger::LoggerLevel level,
			const char* pMsg)
{
  writeHeader(pCategory, level);
  if (m_count_repeated_messages == 0)
    writeMessage(pMsg);
  else
  {
    BaseString str(pMsg);
    str.appfmt(" - repeated %d times", m_count_repeated_messages);
    str.appfmt(" - Repeated %d times", m_count_repeated_messages);
    writeMessage(str.c_str());
    m_count_repeated_messages= 0;
  }
  writeFooter();

  m_last_log_time= now;
}

const char* 
@@ -125,12 +124,10 @@ char*
LogHandler::getTimeAsString(char* pStr) const 
{
  struct tm* tm_now;
  time_t now;
  now = ::time((time_t*)NULL);
#ifdef NDB_WIN32
  tm_now = localtime(&now);
  tm_now = localtime(&m_now);
#else
  tm_now = ::localtime(&now); //uses the "current" timezone
  tm_now = ::localtime(&m_now); //uses the "current" timezone
#endif

  BaseString::snprintf(pStr, MAX_DATE_TIME_HEADER_LENGTH, 
+2 −2
Original line number Diff line number Diff line
@@ -355,7 +355,7 @@ Logger::log(LoggerLevel logLevel, const char* pMsg, va_list ap) const
    LogHandler* pHandler = NULL;
    while ( (pHandler = m_pHandlerList->next()) != NULL)
    {
      char buf[1024];
      char buf[MAX_LOG_MESSAGE_SIZE];
      BaseString::vsnprintf(buf, sizeof(buf), pMsg, ap);
      pHandler->append(m_pCategory, logLevel, buf);
    }