Bug #33872 | log events cut after 94 characters for important info events | ||
---|---|---|---|
Submitted: | 14 Jan 2008 20:27 | Modified: | 5 May 2009 7:25 |
Reporter: | Bernd Ocklin | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Cluster: Cluster (NDB) storage engine | Severity: | S3 (Non-critical) |
Version: | mysql-5.1-telco-6.2 | OS: | Any |
Assigned to: | CPU Architecture: | Any | |
Tags: | 5.1.23 ndb-6.2.10 |
[14 Jan 2008 20:27]
Bernd Ocklin
[18 Jul 2008 11:26]
Geert Vanderkelen
Still problem with MySQL Cluster 6.3bzr.
[30 Jan 2009 20:09]
Hartmut Holzgraefe
suggested fix: - the code of infoEvent() and warningEvent() differed in one line only, the new generalEvent() now provides the actual functionality while infoEvent() and warningEvent() just invoke it with different logevent types - resized from SignalT<25> to SignalT<100> - size is now a constant, no more magic numbers throughout the function - redundant result length check removed === modified file 'storage/ndb/src/kernel/vm/SimulatedBlock.cpp' --- storage/ndb/src/kernel/vm/SimulatedBlock.cpp 2008-11-19 10:13:01 +0000 +++ storage/ndb/src/kernel/vm/SimulatedBlock.cpp 2009-01-30 11:16:37 +0000 @@ -1039,25 +1039,22 @@ SimulatedBlock::progError(int line, int } void -SimulatedBlock::infoEvent(const char * msg, ...) const { +SimulatedBlock::generalEvent(enum Ndb_logevent_type eventType, const char * msg, ...) const { + const int datasize = 100; + if(msg == 0) return; - SignalT<25> signalT; - signalT.theData[0] = NDB_LE_InfoEvent; + SignalT<datasize> signalT; + signalT.theData[0] = eventType; + int bufsize = (datasize - 1) * sizeof(signalT.theData[0]); char * buf = (char *)(signalT.theData+1); va_list ap; va_start(ap, msg); - BaseString::vsnprintf(buf, 96, msg, ap); // 96 = 100 - 4 + BaseString::vsnprintf(buf, bufsize, msg, ap); va_end(ap); - int len = strlen(buf) + 1; - if(len > 96){ - len = 96; - buf[95] = 0; - } - /** * Init and put it into the job buffer */ @@ -1072,50 +1069,26 @@ SimulatedBlock::infoEvent(const char * m signalT.header.theSendersBlockRef = reference(); signalT.header.theTrace = tTrace; signalT.header.theSignalId = tSignalId; - signalT.header.theLength = ((len+3)/4)+1; + signalT.header.theLength = ((strlen(buf)+3)/4)+1; globalScheduler.execute(&signalT.header, JBB, signalT.theData, signalT.m_sectionPtrI); } void -SimulatedBlock::warningEvent(const char * msg, ...) const { - if(msg == 0) - return; - - SignalT<25> signalT; - signalT.theData[0] = NDB_LE_WarningEvent; - char * buf = (char *)(signalT.theData+1); - +SimulatedBlock::infoEvent(const char * msg, ...) const { va_list ap; va_start(ap, msg); - BaseString::vsnprintf(buf, 96, msg, ap); // 96 = 100 - 4 + generalEvent(NDB_LE_InfoEvent, msg, ap); va_end(ap); - - int len = strlen(buf) + 1; - if(len > 96){ - len = 96; - buf[95] = 0; - } - - /** - * Init and put it into the job buffer - */ - memset(&signalT.header, 0, sizeof(SignalHeader)); - - const Signal * signal = globalScheduler.getVMSignals(); - Uint32 tTrace = signal->header.theTrace; - Uint32 tSignalId = signal->header.theSignalId; - - signalT.header.theVerId_signalNumber = GSN_EVENT_REP; - signalT.header.theReceiversBlockNumber = CMVMI; - signalT.header.theSendersBlockRef = reference(); - signalT.header.theTrace = tTrace; - signalT.header.theSignalId = tSignalId; - signalT.header.theLength = ((len+3)/4)+1; +} - globalScheduler.execute(&signalT.header, JBB, signalT.theData, - signalT.m_sectionPtrI); +void +SimulatedBlock::warningEvent(const char * msg, ...) const { + va_list ap; + va_start(ap, msg); + generalEvent(NDB_LE_WarningEvent, msg, ap); + va_end(ap); } void === modified file 'storage/ndb/src/kernel/vm/SimulatedBlock.hpp' --- storage/ndb/src/kernel/vm/SimulatedBlock.hpp 2008-11-19 10:13:01 +0000 +++ storage/ndb/src/kernel/vm/SimulatedBlock.hpp 2009-01-30 11:13:47 +0000 @@ -425,6 +425,8 @@ protected: /** * General info event (sent to cluster log) */ + void generalEvent(enum Ndb_logevent_type eventType, const char * msg, ...) const + ATTRIBUTE_FORMAT(printf, 3, 4); void infoEvent(const char * msg, ...) const ATTRIBUTE_FORMAT(printf, 2, 3); void warningEvent(const char * msg, ...) const
[31 Jan 2009 6:21]
Jonas Oreland
signals is 25 is magic, but impossible to change. the job buffer consists of fixed-size-slots 28-byte header and 100 byte payload 100 bytes = 25 words. this concept used to be in silicon and all our code assumes 100 bytes signal data. in order to send bigger signals, you need to use the "newly" (as in 2002) introduced long signal interface.