#At file:///home/jonas/src/telco-6.3/ based on
revid:jonas@stripped
3155 Jonas Oreland 2009-11-04
ndb - add assertions to find bugs like 48531
modified:
storage/ndb/src/kernel/vm/SimulatedBlock.cpp
storage/ndb/src/kernel/vm/SimulatedBlock.hpp
=== modified file 'storage/ndb/src/kernel/vm/SimulatedBlock.cpp'
--- a/storage/ndb/src/kernel/vm/SimulatedBlock.cpp 2009-10-20 19:19:19 +0000
+++ b/storage/ndb/src/kernel/vm/SimulatedBlock.cpp 2009-11-04 15:55:06 +0000
@@ -186,7 +186,7 @@ SimulatedBlock::signal_error(Uint32 gsn,
extern class SectionSegmentPool g_sectionSegmentPool;
-#define check_sections(signal, cnt) if (unlikely(cnt))
handle_invalid_sections_in_send_signal(signal)
+#define check_sections(signal, cnt, cnt2) do { if (unlikely(cnt)) {
handle_invalid_sections_in_send_signal(signal); } else if (unlikely(cnt2 == 0 &&
signal->header.m_fragmentInfo != 0)) { handle_invalid_fragmentInfo(signal); } }
while(0)
void
SimulatedBlock::handle_invalid_sections_in_send_signal(Signal* signal) const
@@ -227,6 +227,18 @@ SimulatedBlock::handle_lingering_section
#endif
}
+void
+SimulatedBlock::handle_invalid_fragmentInfo(Signal* signal) const
+{
+#if defined VM_TRACE || defined ERROR_INSERT
+ ErrorReporter::handleError(NDBD_EXIT_BLOCK_BNR_ZERO,
+ "Incorrect header->m_fragmentInfo in sendSignal()",
+ "");
+#else
+ signal->header.m_fragmentInfo = 0;
+ infoEvent("Incorrect header->m_fragmentInfo in sendSignal");
+#endif
+}
void
SimulatedBlock::sendSignal(BlockReference ref,
@@ -248,7 +260,7 @@ SimulatedBlock::sendSignal(BlockReferenc
signal->header.theReceiversBlockNumber = recBlock;
signal->header.m_noOfSections = 0;
- check_sections(signal, noOfSections);
+ check_sections(signal, noOfSections, 0);
Uint32 tSignalId = signal->header.theSignalId;
@@ -325,7 +337,7 @@ SimulatedBlock::sendSignal(NodeReceiverG
signal->header.theSendersBlockRef = reference();
signal->header.m_noOfSections = 0;
- check_sections(signal, noOfSections);
+ check_sections(signal, noOfSections, 0);
if ((length == 0) || (length > 25) || (recBlock == 0)) {
signal_error(gsn, length, recBlock, __FILE__, __LINE__);
@@ -411,7 +423,7 @@ SimulatedBlock::sendSignal(BlockReferenc
Uint32 recNode = refToNode(ref);
Uint32 ourProcessor = globalData.ownId;
- check_sections(signal, signal->header.m_noOfSections);
+ check_sections(signal, signal->header.m_noOfSections, noOfSections);
signal->header.theLength = length;
signal->header.theVerId_signalNumber = gsn;
@@ -505,7 +517,7 @@ SimulatedBlock::sendSignal(NodeReceiverG
Uint32 ourProcessor = globalData.ownId;
Uint32 recBlock = rg.m_block;
- check_sections(signal, signal->header.m_noOfSections);
+ check_sections(signal, signal->header.m_noOfSections, noOfSections);
signal->header.theLength = length;
signal->header.theVerId_signalNumber = gsn;
@@ -609,7 +621,7 @@ SimulatedBlock::sendSignal(BlockReferenc
Uint32 recNode = refToNode(ref);
Uint32 ourProcessor = globalData.ownId;
- check_sections(signal, signal->header.m_noOfSections);
+ check_sections(signal, signal->header.m_noOfSections, noOfSections);
signal->header.theLength = length;
signal->header.theVerId_signalNumber = gsn;
@@ -701,7 +713,7 @@ SimulatedBlock::sendSignal(NodeReceiverG
Uint32 ourProcessor = globalData.ownId;
Uint32 recBlock = rg.m_block;
- check_sections(signal, signal->header.m_noOfSections);
+ check_sections(signal, signal->header.m_noOfSections, noOfSections);
signal->header.theLength = length;
signal->header.theVerId_signalNumber = gsn;
@@ -807,7 +819,7 @@ SimulatedBlock::sendSignalWithDelay(Bloc
BlockNumber bnr = refToBlock(ref);
- check_sections(signal, signal->header.m_noOfSections);
+ check_sections(signal, signal->header.m_noOfSections, 0);
signal->header.theLength = length;
signal->header.theSendersSignalId = signal->header.theSignalId;
@@ -850,7 +862,7 @@ SimulatedBlock::sendSignalWithDelay(Bloc
bnr_error();
}//if
- check_sections(signal, signal->header.m_noOfSections);
+ check_sections(signal, signal->header.m_noOfSections, noOfSections);
signal->header.theLength = length;
signal->header.theSendersSignalId = signal->header.theSignalId;
@@ -1999,7 +2011,7 @@ SimulatedBlock::sendFirstFragment(Fragme
Uint32 noOfSections,
Uint32 messageSize){
- check_sections(signal, signal->header.m_noOfSections);
+ check_sections(signal, signal->header.m_noOfSections, noOfSections);
info.m_sectionPtr[0].m_linear.p = NULL;
info.m_sectionPtr[1].m_linear.p = NULL;
=== modified file 'storage/ndb/src/kernel/vm/SimulatedBlock.hpp'
--- a/storage/ndb/src/kernel/vm/SimulatedBlock.hpp 2009-10-20 19:19:19 +0000
+++ b/storage/ndb/src/kernel/vm/SimulatedBlock.hpp 2009-11-04 15:55:06 +0000
@@ -217,6 +217,7 @@ protected:
void handle_invalid_sections_in_send_signal(Signal*) const;
void handle_lingering_sections_after_execute(Signal*) const;
void handle_lingering_sections_after_execute(SectionHandle*) const;
+ void handle_invalid_fragmentInfo(Signal*) const;
/**
* Send routed signals (ONLY LOCALLY)
Attachment: [text/bzr-bundle] bzr/jonas@mysql.com-20091104155506-eb2ht2wngaklydvb.bundle
| Thread |
|---|
| • bzr commit into mysql-5.1-telco-6.3 branch (jonas:3155) | Jonas Oreland | 4 Nov 2009 |