2894 Pekka Nousiainen 2009-04-13
MT-DD-SR 02_lcp.diff
Fix LQH call to Lgman::execLCP_FRAG_ORD.
LQH instance did EXECUTE_DIRECT to LGMAN (protected by mutex).
LGMAN can do sendSignal within the call.
This causes use of wrong thread-to-thread signal buffer.
modified:
storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp
storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
storage/ndb/src/kernel/blocks/lgman.cpp
storage/ndb/src/kernel/blocks/lgman.hpp
2893 Pekka Nousiainen 2009-04-13
MT-DD-SR 01_mt.diff
Check that send signal thr1->thr2 uses correct buffer.
The buffer may be wrong if a block executes in another block,
because the block's m_threadId determines the buffer.
modified:
storage/ndb/src/kernel/vm/mt.cpp
2892 Magnus Blåudd 2009-04-09 [merge]
Merge
added:
mysql-test/suite/ndb/t/ndb_restore_compressed-master.opt
=== modified file 'storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp 2009-04-05 21:03:06 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp 2009-04-13 04:21:29 +0000
@@ -37,6 +37,7 @@
class Dbacc;
class Dbtup;
+class Lgman;
#ifdef DBLQH_C
// Constants
@@ -2582,6 +2583,7 @@ private:
Dbtup* c_tup;
Dbacc* c_acc;
+ Lgman* c_lgman;
/**
* Read primary key from tup
=== modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2009-04-05 21:03:06 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2009-04-13 04:21:29 +0000
@@ -593,7 +593,8 @@ void Dblqh::execSTTOR(Signal* signal)
cstartPhase = tstartPhase;
c_tup = (Dbtup*)globalData.getBlock(DBTUP, instance());
c_acc = (Dbacc*)globalData.getBlock(DBACC, instance());
- ndbrequire(c_tup != 0 && c_acc != 0);
+ c_lgman = (Lgman*)globalData.getBlock(LGMAN);
+ ndbrequire(c_tup != 0 && c_acc != 0 && c_lgman != 0);
sendsttorryLab(signal);
#if defined VM_TRACE || defined ERROR_INSERT || defined NDBD_TRACENR
@@ -12356,8 +12357,8 @@ void Dblqh::execLCP_PREPARE_CONF(Signal*
{
LcpFragOrd *ord= (LcpFragOrd*)signal->getDataPtrSend();
*ord = lcpPtr.p->currentFragment.lcpFragOrd;
- EXECUTE_DIRECT(LGMAN, GSN_LCP_FRAG_ORD,
- signal, signal->length(), 0);
+ Logfile_client lgman(this, c_lgman, 0);
+ lgman.exec_lcp_frag_ord(signal);
jamEntry();
*ord = lcpPtr.p->currentFragment.lcpFragOrd;
=== modified file 'storage/ndb/src/kernel/blocks/lgman.cpp'
--- a/storage/ndb/src/kernel/blocks/lgman.cpp 2009-03-24 08:42:42 +0000
+++ b/storage/ndb/src/kernel/blocks/lgman.cpp 2009-04-13 04:21:29 +0000
@@ -1889,6 +1889,14 @@ Lgman::execLCP_FRAG_ORD(Signal* signal)
{
jamEntry();
client_lock(number(), __LINE__);
+ exec_lcp_frag_ord(signal, this);
+ client_unlock(number(), __LINE__);
+}
+
+void
+Lgman::exec_lcp_frag_ord(Signal* signal, SimulatedBlock* client_block)
+{
+ jamEntry();
LcpFragOrd * ord = (LcpFragOrd *)signal->getDataPtr();
Uint32 lcp_id= ord->lcpId;
@@ -1906,7 +1914,7 @@ Lgman::execLCP_FRAG_ORD(Signal* signal)
ptr.p->m_state |= Logfile_group::LG_CUT_LOG_THREAD;
signal->theData[0] = LgmanContinueB::CUT_LOG_TAIL;
signal->theData[1] = ptr.i;
- sendSignal(reference(), GSN_CONTINUEB, signal, 2, JBB);
+ client_block->sendSignal(reference(), GSN_CONTINUEB, signal, 2, JBB);
}
if(!ptr.isNull() && ptr.p->m_last_lsn)
@@ -1971,7 +1979,6 @@ Lgman::execLCP_FRAG_ORD(Signal* signal)
}
m_latest_lcp = lcp_id;
- client_unlock(number(), __LINE__);
}
void
=== modified file 'storage/ndb/src/kernel/blocks/lgman.hpp'
--- a/storage/ndb/src/kernel/blocks/lgman.hpp 2009-03-24 08:33:25 +0000
+++ b/storage/ndb/src/kernel/blocks/lgman.hpp 2009-04-13 04:21:29 +0000
@@ -77,6 +77,8 @@ protected:
GetTabInfoReq * req,
GetTabInfoRef::ErrorCode errorCode);
+ void exec_lcp_frag_ord(Signal*, SimulatedBlock* client_block);
+
public:
struct Log_waiter
{
@@ -384,6 +386,10 @@ public:
int free_log_space(Uint32 words) {
return m_lgman->free_log_space(m_logfile_group_id, words);
}
+
+ void exec_lcp_frag_ord(Signal* signal) {
+ m_lgman->exec_lcp_frag_ord(signal, m_client_block);
+ }
private:
Uint32* get_log_buffer(Uint32 sz);
=== modified file 'storage/ndb/src/kernel/vm/mt.cpp'
--- a/storage/ndb/src/kernel/vm/mt.cpp 2009-01-23 19:37:48 +0000
+++ b/storage/ndb/src/kernel/vm/mt.cpp 2009-04-13 04:16:55 +0000
@@ -734,6 +734,7 @@ struct thr_data
thr_wait m_waiter;
unsigned m_thr_no;
+ pthread_t m_thr_id;
/**
* max signals to execute per JBB buffer
@@ -1251,6 +1252,7 @@ senddelay(Uint32 thr_no, const SignalHea
{
struct thr_repository* rep = &g_thr_repository;
struct thr_data * selfptr = rep->m_thread + thr_no;
+ assert(pthread_equal(selfptr->m_thr_id, pthread_self()));
unsigned siglen = (sizeof(*s) >> 2) + s->theLength + s->m_noOfSections;
Uint32 max;
@@ -2673,6 +2675,8 @@ init_thread(thr_data *selfptr)
tmp.appfmt("err: %u ", res);
}
}
+
+ selfptr->m_thr_id = pthread_self();
for (Uint32 i = 0; i < selfptr->m_instance_count; i++)
{
@@ -3035,6 +3039,7 @@ sendlocal(Uint32 self, const SignalHeade
Uint32 dst = block2ThreadId(block, instance);
struct thr_repository* rep = &g_thr_repository;
struct thr_data * selfptr = rep->m_thread + self;
+ assert(pthread_equal(selfptr->m_thr_id, pthread_self()));
struct thr_data * dstptr = rep->m_thread + dst;
selfptr->m_priob_count++;
@@ -3061,6 +3066,8 @@ sendprioa(Uint32 self, const SignalHeade
Uint32 dst = block2ThreadId(block, instance);
struct thr_repository* rep = &g_thr_repository;
struct thr_data *selfptr = rep->m_thread + self;
+ assert(s->theVerId_signalNumber == GSN_START_ORD ||
+ pthread_equal(selfptr->m_thr_id, pthread_self()));
struct thr_data *dstptr = rep->m_thread + dst;
selfptr->m_prioa_count++;
| Thread |
|---|
| • bzr push into mysql-5.1-telco-7.0 branch (pekka:2892 to 2894) | Pekka Nousiainen | 13 Apr |