Skip to content

Commit 4df06c9

Browse files
author
magnus.blaudd@oracle.com
committed
Bug#11764570: NDB_ERROR_REPORTER ONLY COLLECTS LOGS MATCHING NAME
NDB_$ID*. - Remove 'logger.log' as default filename from FileLogHandler - Require filename argument to Logger::createFileHandler() and always call FileLogHandler constructor with that name. - Move the addHandler function from Logger to MgmtSrvr thus making it significantly easier to pass the default cluster log filename for the current node to the FileLogHandler constructor. - Make ndb_error_reporter parse out filename=xxx from LogDestination and try to copy that file(can theoretically be more than one) as well from the remote host. - Add testcase making sure that ndb_mgmd does not create logger.log anymore but instead defaults to ndb_<nodeid>_cluster.log if LogDestination=FILE: has been used wiuthout filename= parameter
1 parent fa2276f commit 4df06c9

File tree

9 files changed

+108
-88
lines changed

9 files changed

+108
-88
lines changed
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#
2+
# BUG#11764570 NDB_ERROR_REPORTER ONLY COLLECTS LOGS MATCHING NAME NDB_*.
3+
#
4+
Make sure that ndb_mgmd creates ndb_<nodeid>_cluster.log file
5+
Make sure that ndb_mgmd does _not_ create logger.log file

mysql-test/suite/ndb/t/ndb_mgmd.cnf

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
!include ../my.cnf
2+
3+
[cluster_config.ndb_mgmd.1.1]
4+
LogDestination=FILE:maxsize=32000000,maxfiles=6
5+

mysql-test/suite/ndb/t/ndb_mgmd.test

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
--source include/have_ndb.inc
2+
3+
--echo #
4+
--echo # BUG#11764570 NDB_ERROR_REPORTER ONLY COLLECTS LOGS MATCHING NAME NDB_$ID*.
5+
--echo #
6+
7+
--echo Make sure that ndb_mgmd creates ndb_<nodeid>_cluster.log file
8+
--file_exists $MYSQLTEST_VARDIR/mysql_cluster.1/ndb_mgmd.1/ndb_3_cluster.log
9+
10+
--echo Make sure that ndb_mgmd does _not_ create logger.log file
11+
--error 1
12+
--file_exists $MYSQLTEST_VARDIR/mysql_cluster.1/ndb_mgmd.1/logger.log
13+

storage/ndb/include/logger/FileLogHandler.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class FileLogHandler : public LogHandler
4949
* @param maxFileSize the maximum log file size before archiving.
5050
* @param maxLogEntries the maximum number of log entries before checking time to archive.
5151
*/
52-
FileLogHandler(const char* aFileName = "logger.log",
52+
FileLogHandler(const char* aFileName,
5353
int maxNoFiles = 6,
5454
long maxFileSize = 1024000,
5555
unsigned int maxLogEntries = 10000);

storage/ndb/include/logger/Logger.hpp

+2-12
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,11 @@ class Logger
153153
bool createEventLogHandler(const char* source_name);
154154

155155
/**
156-
* Create a default handler that logs to a file called logger.log.
156+
* Create a default handler which writes to the specified file name.
157157
*
158158
* @return true if successful.
159159
*/
160-
bool createFileHandler(char* filename= 0);
160+
bool createFileHandler(char* filename);
161161

162162
/**
163163
* Remove the default file handler.
@@ -184,16 +184,6 @@ class Logger
184184
*/
185185
bool addHandler(LogHandler* pHandler);
186186

187-
/**
188-
* Add a new handler
189-
*
190-
* @param logstring string describing the handler to add
191-
* @param err OS errno in event of error
192-
* @param len max length of errStr buffer
193-
* @param errStr logger error string in event of error
194-
*/
195-
bool addHandler(const BaseString &logstring, int *err, int len, char* errStr);
196-
197187
/**
198188
* Remove a log handler.
199189
*

storage/ndb/src/common/logger/Logger.cpp

+1-60
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,7 @@ Logger::createFileHandler(char*filename)
130130
if (m_pFileHandler)
131131
return true; // Ok, already exist
132132

133-
LogHandler* log_handler = filename ? new FileLogHandler(filename)
134-
: new FileLogHandler();
133+
LogHandler* log_handler = new FileLogHandler(filename);
135134
if (!log_handler)
136135
return false;
137136

@@ -210,64 +209,6 @@ Logger::addHandler(LogHandler* pHandler)
210209
return true;
211210
}
212211

213-
bool
214-
Logger::addHandler(const BaseString &logstring, int *err, int len, char* errStr) {
215-
Vector<BaseString> logdest;
216-
DBUG_ENTER("Logger::addHandler");
217-
218-
logstring.split(logdest, ";");
219-
220-
for(unsigned i = 0; i < logdest.size(); i++) {
221-
DBUG_PRINT("info",("adding: %s",logdest[i].c_str()));
222-
223-
Vector<BaseString> v_type_args;
224-
logdest[i].split(v_type_args, ":", 2);
225-
226-
BaseString type(v_type_args[0]);
227-
BaseString params;
228-
if(v_type_args.size() >= 2)
229-
params = v_type_args[1];
230-
231-
LogHandler *handler = NULL;
232-
233-
#ifndef _WIN32
234-
if(type == "SYSLOG")
235-
{
236-
handler = new SysLogHandler();
237-
} else
238-
#endif
239-
if(type == "FILE")
240-
handler = new FileLogHandler();
241-
else if(type == "CONSOLE")
242-
handler = new ConsoleLogHandler();
243-
244-
if(handler == NULL)
245-
{
246-
BaseString::snprintf(errStr,len,"Could not create log destination: %s",
247-
logdest[i].c_str());
248-
DBUG_RETURN(false);
249-
}
250-
251-
if(!handler->parseParams(params))
252-
{
253-
*err= handler->getErrorCode();
254-
if(handler->getErrorStr())
255-
strncpy(errStr, handler->getErrorStr(), len);
256-
delete handler;
257-
DBUG_RETURN(false);
258-
}
259-
260-
if (!addHandler(handler))
261-
{
262-
BaseString::snprintf(errStr,len,"Could not add log destination: %s",
263-
logdest[i].c_str());
264-
delete handler;
265-
DBUG_RETURN(false);
266-
}
267-
}
268-
269-
DBUG_RETURN(true);
270-
}
271212

272213
bool
273214
Logger::removeHandler(LogHandler* pHandler)

storage/ndb/src/mgmsrv/MgmtSrvr.cpp

+69-15
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@
4848
#include <NdbSleep.h>
4949
#include <portlib/NdbDir.hpp>
5050
#include <EventLogger.hpp>
51+
#include <logger/FileLogHandler.hpp>
52+
#include <logger/ConsoleLogHandler.hpp>
53+
#include <logger/SysLogHandler.hpp>
5154
#include <DebuggerNames.hpp>
5255
#include <ndb_version.h>
5356

@@ -578,6 +581,71 @@ MgmtSrvr::start()
578581
}
579582

580583

584+
void
585+
MgmtSrvr::configure_eventlogger(const BaseString& logdestination) const
586+
{
587+
// Close old log handlers before creating the new
588+
g_eventLogger->close();
589+
590+
Vector<BaseString> logdestinations;
591+
logdestination.split(logdestinations, ";");
592+
593+
for(unsigned i = 0; i < logdestinations.size(); i++)
594+
{
595+
// Extract type(everything left of colon)
596+
Vector<BaseString> v_type_params;
597+
logdestinations[i].split(v_type_params, ":", 2);
598+
BaseString type(v_type_params[0]);
599+
600+
// Extract params(everything right of colon)
601+
BaseString params;
602+
if(v_type_params.size() >= 2)
603+
params = v_type_params[1];
604+
605+
LogHandler *handler = NULL;
606+
if(type == "FILE")
607+
{
608+
char *default_file_name= NdbConfig_ClusterLogFileName(_ownNodeId);
609+
handler = new FileLogHandler(default_file_name);
610+
free(default_file_name);
611+
}
612+
else if(type == "CONSOLE")
613+
{
614+
handler = new ConsoleLogHandler();
615+
}
616+
#ifndef _WIN32
617+
else if(type == "SYSLOG")
618+
{
619+
handler = new SysLogHandler();
620+
}
621+
#endif
622+
if(handler == NULL)
623+
{
624+
ndbout_c("INTERNAL ERROR: Could not create log handler for: '%s'",
625+
logdestinations[i].c_str());
626+
continue;
627+
}
628+
629+
if(!handler->parseParams(params))
630+
{
631+
ndbout_c("Failed to parse parameters for log handler: '%s', error: %d '%s'",
632+
logdestinations[i].c_str(), handler->getErrorCode(), handler->getErrorStr());
633+
delete handler;
634+
continue;
635+
}
636+
637+
if (!g_eventLogger->addHandler(handler))
638+
{
639+
ndbout_c("INTERNAL ERROR: Could not add %s log handler", handler->handler_type());
640+
g_eventLogger->error("INTERNAL ERROR: Could not add %s log handler",
641+
handler->handler_type());
642+
delete handler;
643+
continue;
644+
}
645+
}
646+
}
647+
648+
581649
void
582650
MgmtSrvr::setClusterLog(const Config* config)
583651
{
@@ -615,21 +683,7 @@ MgmtSrvr::setClusterLog(const Config* config)
615683
logdest_configured = false;
616684
}
617685

618-
g_eventLogger->close();
619-
620-
int err= 0;
621-
char errStr[100]= {0};
622-
if(!g_eventLogger->addHandler(logdest, &err, sizeof(errStr), errStr)) {
623-
ndbout << "Warning: could not add log destination '"
624-
<< logdest.c_str() << "'. Reason: ";
625-
if(err)
626-
ndbout << strerror(err);
627-
if(err && errStr[0]!='\0')
628-
ndbout << ", ";
629-
if(errStr[0]!='\0')
630-
ndbout << errStr;
631-
ndbout << endl;
632-
}
686+
configure_eventlogger(logdest);
633687

634688
if (logdest_configured == false &&
635689
m_opts.non_interactive)

storage/ndb/src/mgmsrv/MgmtSrvr.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ class MgmtSrvr : private ConfigSubscriber, public trp_client {
304304
private:
305305
void config_changed(NodeId, const Config*);
306306
void setClusterLog(const Config* conf);
307+
void configure_eventlogger(const BaseString& logdestination) const;
307308
public:
308309

309310
/**

storage/ndb/tools/ndb_error_reporter

+11
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,17 @@ foreach my $node (@nodes)
8181
system 'scp -p '.$recurse.$config_username.config($node,'host').
8282
':'.config($node,'datadir')."/ndb_".$node."* ".
8383
"$reportdir/\n";
84+
85+
# Extract cluster log name from LogDestination(if any)
86+
foreach my $file_handler (grep(s/^FILE://i, split(/;/, config($node, 'LogDestination'))))
87+
{
88+
foreach my $file_name (grep(s/^filename=//i, split(/,/, $file_handler)))
89+
{
90+
print " Copying cluster log from '$file_name' on node $node...\n";
91+
system 'scp -p '.$config_username.config($node,'host').
92+
':'.$file_name.". $reportdir/\n";
93+
}
94+
}
8495
}
8596

8697
print "\n\n Copying configuration file...\n\n\t$config_file\n\n";

0 commit comments

Comments
 (0)