diff options
author | unknown <tomas@poseidon.ndb.mysql.com> | 2005-10-11 15:48:07 +0200 |
---|---|---|
committer | unknown <tomas@poseidon.ndb.mysql.com> | 2005-10-11 15:48:07 +0200 |
commit | f2aa4bcd15c5bad12c90ba0b34454ec274d20722 (patch) | |
tree | 93fa8a7316fe1db6a15f773b20cb8f38db1e1f67 /ndb/src/kernel/vm | |
parent | f6943edbb6afb990d36de96f3989ae272727914f (diff) | |
download | mariadb-git-f2aa4bcd15c5bad12c90ba0b34454ec274d20722.tar.gz |
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
ndb/include/mgmapi/ndbd_exit_codes.h:
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
- added new exit code for connection setup failure
ndb/include/transporter/TransporterCallback.hpp:
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
- corrected transporter callback error codes to have consistant usage of 0x8000 flag for flagging call to do disconnect
ndb/src/common/transporter/SHM_Transporter.cpp:
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
- added error info to errors
ndb/src/common/transporter/SHM_Transporter.unix.cpp:
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
- added more error info to errors
ndb/src/common/transporter/Transporter.hpp:
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
- added more info to report error
ndb/src/kernel/blocks/qmgr/QmgrMain.cpp:
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
- added error reporting on connect failure
ndb/src/kernel/error/ndbd_exit_codes.c:
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
- new exit code
ndb/src/kernel/vm/FastScheduler.cpp:
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
- corrected stack overflow issues
ndb/src/kernel/vm/TransporterCallback.cpp:
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
- added error info
- corrected stak overflow issues
ndb/src/kernel/vm/VMSignal.hpp:
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
- added struct to allocate smaller Signal
ndb/src/mgmsrv/ConfigInfo.cpp:
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
- enable usage of SHM default section
ndb/src/ndbapi/TransporterFacade.cpp:
Bug #9249 NDBD crashes when mapping SHM segment w/o correct permission
- minor syntax changes
Diffstat (limited to 'ndb/src/kernel/vm')
-rw-r--r-- | ndb/src/kernel/vm/FastScheduler.cpp | 15 | ||||
-rw-r--r-- | ndb/src/kernel/vm/TransporterCallback.cpp | 90 | ||||
-rw-r--r-- | ndb/src/kernel/vm/VMSignal.hpp | 10 |
3 files changed, 90 insertions, 25 deletions
diff --git a/ndb/src/kernel/vm/FastScheduler.cpp b/ndb/src/kernel/vm/FastScheduler.cpp index 5c68cbe6480..ad24a6795a4 100644 --- a/ndb/src/kernel/vm/FastScheduler.cpp +++ b/ndb/src/kernel/vm/FastScheduler.cpp @@ -394,7 +394,8 @@ void print_restart(FILE * output, Signal* signal, Uint32 aLevel); void FastScheduler::dumpSignalMemory(FILE * output) { - Signal signal; + SignalT<25> signalT; + Signal &signal= *(Signal*)&signalT; Uint32 ReadPtr[5]; Uint32 tJob; Uint32 tLastJob; @@ -483,17 +484,17 @@ print_restart(FILE * output, Signal* signal, Uint32 aLevel) */ void FastScheduler::reportDoJobStatistics(Uint32 tMeanLoopCount) { - Signal signal; + SignalT<2> signalT; + Signal &signal= *(Signal*)&signalT; + memset(&signal.header, 0, sizeof(signal.header)); + signal.header.theLength = 2; + signal.header.theSendersSignalId = 0; + signal.header.theSendersBlockRef = numberToRef(0, 0); signal.theData[0] = NDB_LE_JobStatistic; signal.theData[1] = tMeanLoopCount; - memset(&signal.header, 0, sizeof(SignalHeader)); - signal.header.theLength = 2; - signal.header.theSendersSignalId = 0; - signal.header.theSendersBlockRef = numberToRef(0, 0); - execute(&signal, JBA, CMVMI, GSN_EVENT_REP); } diff --git a/ndb/src/kernel/vm/TransporterCallback.cpp b/ndb/src/kernel/vm/TransporterCallback.cpp index 0bdfcf16689..4ce460c1d94 100644 --- a/ndb/src/kernel/vm/TransporterCallback.cpp +++ b/ndb/src/kernel/vm/TransporterCallback.cpp @@ -39,6 +39,26 @@ */ SectionSegmentPool g_sectionSegmentPool; +struct ConnectionError +{ + enum TransporterError err; + const char *text; +}; + +static const ConnectionError connectionError[] = +{ + { TE_NO_ERROR, "No error"}, + { TE_SHM_UNABLE_TO_CREATE_SEGMENT, "Unable to create shared memory segment"}, + { (enum TransporterError) -1, "No connection error message available (please report a bug)"} +}; + +const char *lookupConnectionError(Uint32 err) +{ + int i= 0; + while ((Uint32)connectionError[i].err != err && (Uint32)connectionError[i].err != -1); + return connectionError[i].text; +} + bool import(Ptr<SectionSegment> & first, const Uint32 * src, Uint32 len){ /** @@ -306,30 +326,54 @@ checkJobBuffer() { } void -reportError(void * callbackObj, NodeId nodeId, TransporterError errorCode){ +reportError(void * callbackObj, NodeId nodeId, + TransporterError errorCode, const char *info) +{ #ifdef DEBUG_TRANSPORTER - char buf[255]; - sprintf(buf, "reportError (%d, 0x%x)", nodeId, errorCode); - ndbout << buf << endl; + ndbout_c("reportError (%d, 0x%x) %s", nodeId, errorCode, info ? info : "") #endif - if(errorCode == TE_SIGNAL_LOST_SEND_BUFFER_FULL){ + DBUG_ENTER("reportError"); + DBUG_PRINT("info",("nodeId %d errorCode: 0x%x info: %s", + nodeId, errorCode, info)); + + switch (errorCode) + { + case TE_SIGNAL_LOST_SEND_BUFFER_FULL: + { + char msg[64]; + snprintf(msg, sizeof(msg), "Remote note id %d.%s%s", nodeId, + info ? " " : "", info ? info : ""); ErrorReporter::handleError(NDBD_EXIT_SIGNAL_LOST_SEND_BUFFER_FULL, - "", __FILE__, - NST_ErrorHandler); + msg, __FILE__, NST_ErrorHandler); } - - if(errorCode == TE_SIGNAL_LOST){ + case TE_SIGNAL_LOST: + { + char msg[64]; + snprintf(msg, sizeof(msg), "Remote node id %d,%s%s", nodeId, + info ? " " : "", info ? info : ""); ErrorReporter::handleError(NDBD_EXIT_SIGNAL_LOST, - "", __FILE__, - NST_ErrorHandler); + msg, __FILE__, NST_ErrorHandler); } - - if(errorCode & 0x8000){ + case TE_SHM_IPC_PERMANENT: + { + char msg[128]; + snprintf(msg, sizeof(msg), + "Remote node id %d.%s%s", + nodeId, info ? " " : "", info ? info : ""); + ErrorReporter::handleError(NDBD_EXIT_CONNECTION_SETUP_FAILED, + msg, __FILE__, NST_ErrorHandler); + } + default: + break; + } + + if(errorCode & & TE_DO_DISCONNECT){ reportDisconnect(callbackObj, nodeId, errorCode); } - Signal signal; + SignalT<3> signalT; + Signal &signal= *(Signal*)&signalT; memset(&signal.header, 0, sizeof(signal.header)); @@ -345,6 +389,8 @@ reportError(void * callbackObj, NodeId nodeId, TransporterError errorCode){ signal.header.theSendersSignalId = 0; signal.header.theSendersBlockRef = numberToRef(0, globalData.ownId); globalScheduler.execute(&signal, JBA, CMVMI, GSN_EVENT_REP); + + DBUG_VOID_RETURN; } /** @@ -354,7 +400,8 @@ void reportSendLen(void * callbackObj, NodeId nodeId, Uint32 count, Uint64 bytes){ - Signal signal; + SignalT<3> signalT; + Signal &signal= *(Signal*)&signalT; memset(&signal.header, 0, sizeof(signal.header)); signal.header.theLength = 3; @@ -373,7 +420,8 @@ void reportReceiveLen(void * callbackObj, NodeId nodeId, Uint32 count, Uint64 bytes){ - Signal signal; + SignalT<3> signalT; + Signal &signal= *(Signal*)&signalT; memset(&signal.header, 0, sizeof(signal.header)); signal.header.theLength = 3; @@ -392,7 +440,8 @@ reportReceiveLen(void * callbackObj, void reportConnect(void * callbackObj, NodeId nodeId){ - Signal signal; + SignalT<1> signalT; + Signal &signal= *(Signal*)&signalT; memset(&signal.header, 0, sizeof(signal.header)); signal.header.theLength = 1; @@ -409,7 +458,10 @@ reportConnect(void * callbackObj, NodeId nodeId){ void reportDisconnect(void * callbackObj, NodeId nodeId, Uint32 errNo){ - Signal signal; + DBUG_ENTER("reportDisconnect"); + + SignalT<sizeof(DisconnectRep)/4> signalT; + Signal &signal= *(Signal*)&signalT; memset(&signal.header, 0, sizeof(signal.header)); signal.header.theLength = DisconnectRep::SignalLength; @@ -422,6 +474,8 @@ reportDisconnect(void * callbackObj, NodeId nodeId, Uint32 errNo){ rep->err = errNo; globalScheduler.execute(&signal, JBA, CMVMI, GSN_DISCONNECT_REP); + + DBUG_VOID_RETURN; } void diff --git a/ndb/src/kernel/vm/VMSignal.hpp b/ndb/src/kernel/vm/VMSignal.hpp index 45543c5d174..33f8a9f25c0 100644 --- a/ndb/src/kernel/vm/VMSignal.hpp +++ b/ndb/src/kernel/vm/VMSignal.hpp @@ -42,6 +42,16 @@ struct NodeReceiverGroup { NodeBitmask m_nodes; }; +template <unsigned T> struct SignalT +{ + SignalHeader header; + SegmentedSectionPtr m_sectionPtr[3]; + union { + Uint32 theData[T]; + Uint64 dummyAlign; + }; +}; + /** * class used for passing argumentes to blocks */ |