List:Commits« Previous MessageNext Message »
From:Pekka Nousiainen Date:April 13 2009 4:24am
Subject:bzr push into mysql-5.1-telco-7.0 branch (pekka:2892 to 2894)
View as plain text  
 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 Nousiainen13 Apr