List:Commits« Previous MessageNext Message »
From:Pekka Nousiainen Date:September 16 2008 6:57pm
Subject:bzr push into mysql-5.1 branch (pekka:2764 to 2765) WL#4391
View as plain text  
 2765 Pekka Nousiainen	2008-09-16
      wl#4391 21.diff
      Alter table.
modified:
  storage/ndb/src/common/debugger/signaldata/AlterTab.cpp
  storage/ndb/src/kernel/blocks/dblqh/DblqhProxy.cpp
  storage/ndb/src/kernel/blocks/dblqh/DblqhProxy.hpp
  storage/ndb/src/kernel/vm/mt.cpp

 2764 Pekka Nousiainen	2008-09-16
      wl#4391 20.diff
      User-BACKUP.  Single-worker version.
modified:
  storage/ndb/src/kernel/blocks/backup/Backup.cpp
  storage/ndb/src/kernel/blocks/backup/Backup.hpp
  storage/ndb/src/kernel/blocks/dbtup/DbtupBuffer.cpp
  storage/ndb/src/mgmsrv/MgmtSrvr.cpp

=== modified file 'storage/ndb/src/common/debugger/signaldata/AlterTab.cpp'
--- a/storage/ndb/src/common/debugger/signaldata/AlterTab.cpp	2007-12-25 16:15:08 +0000
+++ b/storage/ndb/src/common/debugger/signaldata/AlterTab.cpp	2008-09-16 18:33:52 +0000
@@ -29,10 +29,10 @@ printALTER_TAB_REQ(FILE* output, const U
   fprintf(output, " gci: %u", sig->gci);
   fprintf(output, " changeMask: 0x%x", sig->changeMask);
   fprintf(output, "\n");
-  fprintf(output, "connectPtr: %u", sig->connectPtr);
-  fprintf(output, "noOfNewAttr: %u", sig->noOfNewAttr);
-  fprintf(output, "newNoOfCharsets: %u", sig->newNoOfCharsets);
-  fprintf(output, "newNoOfKeyAttrs: %u", sig->newNoOfKeyAttrs);
+  fprintf(output, " connectPtr: %u", sig->connectPtr);
+  fprintf(output, " noOfNewAttr: %u", sig->noOfNewAttr);
+  fprintf(output, " newNoOfCharsets: %u", sig->newNoOfCharsets);
+  fprintf(output, " newNoOfKeyAttrs: %u", sig->newNoOfKeyAttrs);
   fprintf(output, "\n");
   return true;
 }
@@ -43,7 +43,7 @@ printALTER_TAB_CONF(FILE* output, const 
   const AlterTabConf* sig = (const AlterTabConf*)theData;
   fprintf(output, " senderRef: 0x%x", sig->senderRef);
   fprintf(output, " senderData: %u", sig->senderData);
-  fprintf(output, "connectPtr: %u", sig->connectPtr);
+  fprintf(output, " connectPtr: %u", sig->connectPtr);
   fprintf(output, "\n");
   return true;
 }

=== modified file 'storage/ndb/src/kernel/blocks/backup/Backup.cpp'
--- a/storage/ndb/src/kernel/blocks/backup/Backup.cpp	2008-09-12 12:55:29 +0000
+++ b/storage/ndb/src/kernel/blocks/backup/Backup.cpp	2008-09-16 18:29:47 +0000
@@ -250,7 +250,7 @@ Backup::execCONTINUEB(Signal* signal)
       Uint32 * dst;
       if (!filePtr.p->operation.dataBuffer.getWritePtr(&dst, sz))
       {
-	sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 100, 4);
+	sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 4);
 	return;
       }
       
@@ -288,7 +288,7 @@ Backup::execCONTINUEB(Signal* signal)
     signal->theData[1] = ptr_I;
     signal->theData[2] = tabPtr_I;
     signal->theData[3] = fragPtr_I;
-    sendSignal(BACKUP_REF, GSN_CONTINUEB, signal, 4, JBB);
+    sendSignal(reference(), GSN_CONTINUEB, signal, 4, JBB);
     return;
   }
   case BackupContinueB::START_FILE_THREAD:
@@ -365,7 +365,7 @@ Backup::execCONTINUEB(Signal* signal)
     if (ERROR_INSERTED(10039))
     {
       jam();
-      sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 300, 
+      sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 300, 
 			  signal->getLength());
       return;
     }
@@ -374,9 +374,29 @@ Backup::execCONTINUEB(Signal* signal)
       jam();
       CLEAR_ERROR_INSERT_VALUE;
       ndbout_c("Resuming backup");
-      memmove(signal->theData, signal->theData + 1, 
+
+      Uint32 filePtr_I = Tdata1;
+      BackupFilePtr filePtr;
+      c_backupFilePool.getPtr(filePtr, filePtr_I);
+      BackupRecordPtr ptr;
+      c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
+      TablePtr tabPtr;
+      findTable(ptr, tabPtr, filePtr.p->tableId);
+      FragmentPtr fragPtr;
+      tabPtr.p->fragments.getPtr(fragPtr, filePtr.p->fragmentNo);
+
+      BlockReference lqhRef = 0;
+      if (ptr.p->is_lcp()) {
+        lqhRef = calcInstanceBlockRef(DBLQH);
+      } else {
+        const Uint32 instanceKey = fragPtr.p->lqhInstanceKey;
+        ndbrequire(instanceKey != 0);
+        lqhRef = numberToRef(DBLQH, instanceKey, getOwnNodeId());
+      }
+
+      memmove(signal->theData, signal->theData + 2, 
 	      4*ScanFragNextReq::SignalLength);
-      BlockReference lqhRef = calcInstanceBlockRef(DBLQH);
+
       sendSignal(lqhRef, GSN_SCAN_NEXTREQ, signal, 
 		 ScanFragNextReq::SignalLength, JBB);
       return ;
@@ -412,7 +432,7 @@ Backup::execBACKUP_LOCK_TAB_CONF(Signal 
     signal->theData[1] = ptr.i;
     signal->theData[2] = tabPtr.i;
     signal->theData[3] = 0;       // Start from first fragment of next table
-    sendSignal(BACKUP_REF, GSN_CONTINUEB, signal, 4, JBB);
+    sendSignal(reference(), GSN_CONTINUEB, signal, 4, JBB);
     return;
   }
   case BackupLockTab::GET_TABINFO_CONF:
@@ -496,7 +516,7 @@ Backup::execDUMP_STATE_ORD(Signal* signa
     BackupReq * req = (BackupReq*)signal->getDataPtrSend();
     req->senderData = 23;
     req->backupDataLen = 0;
-    sendSignal(BACKUP_REF, GSN_BACKUP_REQ,signal,BackupReq::SignalLength, JBB);
+    sendSignal(reference(), GSN_BACKUP_REQ,signal,BackupReq::SignalLength, JBB);
     startTime = NdbTick_CurrentMillisecond();
     return;
   }
@@ -1415,7 +1435,8 @@ Backup::sendDefineBackupReq(Signal *sign
   
   ptr.p->masterData.gsn = GSN_DEFINE_BACKUP_REQ;
   ptr.p->masterData.sendCounter = ptr.p->nodes;
-  NodeReceiverGroup rg(BACKUP, ptr.p->nodes);
+  BlockNumber backupBlockNo = numberToBlock(BACKUP, instance());
+  NodeReceiverGroup rg(backupBlockNo, ptr.p->nodes);
   sendSignal(rg, GSN_DEFINE_BACKUP_REQ, signal, 
 	     DefineBackupReq::SignalLength, JBB);
   
@@ -1774,7 +1795,8 @@ Backup::sendStartBackup(Signal* signal, 
    */
   ptr.p->masterData.gsn = GSN_START_BACKUP_REQ;
   ptr.p->masterData.sendCounter = ptr.p->nodes;
-  NodeReceiverGroup rg(BACKUP, ptr.p->nodes);
+  BlockNumber backupBlockNo = numberToBlock(BACKUP, instance());
+  NodeReceiverGroup rg(backupBlockNo, ptr.p->nodes);
   sendSignal(rg, GSN_START_BACKUP_REQ, signal,
 	     StartBackupReq::SignalLength, JBB);
 }
@@ -1977,7 +1999,7 @@ Backup::nextFragment(Signal* signal, Bac
 	req->count = 0;
 
 	ptr.p->masterData.sendCounter++;
-	const BlockReference ref = numberToRef(BACKUP, nodeId);
+	const BlockReference ref = numberToRef(BACKUP, instance(), nodeId);
 	sendSignal(ref, GSN_BACKUP_FRAGMENT_REQ, signal,
 		   BackupFragmentReq::SignalLength, JBB);
       }//if
@@ -2077,7 +2099,8 @@ Backup::execBACKUP_FRAGMENT_CONF(Signal*
       rep->noOfTableRowsHigh = (Uint32)(tabPtr.p->noOfRecords >> 32);
       rep->noOfFragmentRowsLow = (Uint32)(noOfRecords & 0xFFFFFFFF);
       rep->noOfFragmentRowsHigh = (Uint32)(noOfRecords >> 32);
-      NodeReceiverGroup rg(BACKUP, ptr.p->nodes);
+      BlockNumber backupBlockNo = numberToBlock(BACKUP, instance());
+      NodeReceiverGroup rg(backupBlockNo, ptr.p->nodes);
       sendSignal(rg, GSN_BACKUP_FRAGMENT_COMPLETE_REP, signal,
                  BackupFragmentCompleteRep::SignalLength, JBB);
     }
@@ -2248,7 +2271,7 @@ Backup::sendDropTrig(Signal* signal, Bac
 	  signal->theData[1] = ptr.i;
 	  signal->theData[2] = tabPtr.i;
 	  signal->theData[3] = 0;
-	  sendSignal(BACKUP_REF, GSN_CONTINUEB, signal, 4, JBB);
+	  sendSignal(reference(), GSN_CONTINUEB, signal, 4, JBB);
 	}
 	else
 	{
@@ -2387,7 +2410,8 @@ Backup::sendStopBackup(Signal* signal, B
 
   ptr.p->masterData.gsn = GSN_STOP_BACKUP_REQ;
   ptr.p->masterData.sendCounter = ptr.p->nodes;
-  NodeReceiverGroup rg(BACKUP, ptr.p->nodes);
+  BlockNumber backupBlockNo = numberToBlock(BACKUP, instance());
+  NodeReceiverGroup rg(backupBlockNo, ptr.p->nodes);
   sendSignal(rg, GSN_STOP_BACKUP_REQ, signal, 
 	     StopBackupReq::SignalLength, JBB);
 }
@@ -2577,7 +2601,8 @@ Backup::masterAbort(Signal* signal, Back
   ord->backupId = ptr.p->backupId;
   ord->backupPtr = ptr.i;
   ord->senderData= ptr.i;
-  NodeReceiverGroup rg(BACKUP, ptr.p->nodes);
+  BlockNumber backupBlockNo = numberToBlock(BACKUP, instance());
+  NodeReceiverGroup rg(backupBlockNo, ptr.p->nodes);
   
   switch(ptr.p->masterData.gsn){
   case GSN_DEFINE_BACKUP_REQ:
@@ -2628,7 +2653,7 @@ Backup::abort_scan(Signal * signal, Back
       if(fragPtr.p->scanning != 0 && ptr.p->nodes.get(nodeId)) {
         jam();
 	
-	const BlockReference ref = numberToRef(BACKUP, nodeId);
+	const BlockReference ref = calcInstanceBlockRef(BACKUP, nodeId);
 	sendSignal(ref, GSN_ABORT_BACKUP_ORD, signal,
 		   AbortBackupOrd::SignalLength, JBB);
 	
@@ -3184,7 +3209,7 @@ Backup::openFilesReply(Signal* signal, 
     
     signal->theData[0] = BackupContinueB::START_FILE_THREAD;
     signal->theData[1] = filePtr.i;
-    sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 100, 2);
+    sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 2);
   }
   else
   {
@@ -3581,6 +3606,7 @@ Backup::execDIH_SCAN_TAB_CONF(Signal* si
     fragPtr.p->scanning = 0;
     fragPtr.p->tableId = tableId;
     fragPtr.p->fragmentId = i;
+    fragPtr.p->lqhInstanceKey = 0;
     fragPtr.p->node = 0;
   }//for
   
@@ -3654,6 +3680,7 @@ Backup::execDIH_SCAN_GET_NODES_CONF(Sign
   const Uint32 nodeCount = conf->count;
   const Uint32 tableId = conf->tableId;
   const Uint32 fragNo = conf->fragId;
+  const Uint32 instanceKey = conf->instanceKey;
 
   ndbrequire(nodeCount > 0 && nodeCount <= MAX_REPLICAS);
   
@@ -3665,6 +3692,7 @@ Backup::execDIH_SCAN_GET_NODES_CONF(Sign
 
   FragmentPtr fragPtr;
   tabPtr.p->fragments.getPtr(fragPtr, fragNo);
+  fragPtr.p->lqhInstanceKey = instanceKey;
   
   fragPtr.p->node = conf->nodes[0];
 
@@ -3718,7 +3746,7 @@ Backup::execSTART_BACKUP_REQ(Signal* sig
       filePtr.p->m_flags |= BackupFile::BF_FILE_THREAD;
       signal->theData[0] = BackupContinueB::START_FILE_THREAD;
       signal->theData[1] = filePtr.i;
-      sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 100, 2);
+      sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 2);
     }//if
   }//for
 
@@ -3799,7 +3827,7 @@ Backup::execBACKUP_FRAGMENT_REQ(Signal* 
   if(!filePtr.p->operation.newFragment(tableId, fragPtr.p->fragmentId)) {
     jam();
     req->count = count + 1;
-    sendSignalWithDelay(BACKUP_REF, GSN_BACKUP_FRAGMENT_REQ, signal, 50,
+    sendSignalWithDelay(reference(), GSN_BACKUP_FRAGMENT_REQ, signal, 50,
 			signal->length());
     ptr.p->slaveState.setState(STARTED);
     return;
@@ -3846,7 +3874,14 @@ Backup::execBACKUP_FRAGMENT_REQ(Signal* 
     req->clientOpPtr= filePtr.i;
     req->batch_size_rows= parallelism;
     req->batch_size_bytes= 0;
-    BlockReference lqhRef = calcInstanceBlockRef(DBLQH);
+    BlockReference lqhRef = 0;
+    if (ptr.p->is_lcp()) {
+      lqhRef = calcInstanceBlockRef(DBLQH);
+    } else {
+      const Uint32 instanceKey = fragPtr.p->lqhInstanceKey;
+      ndbrequire(instanceKey != 0);
+      lqhRef = numberToRef(DBLQH, instanceKey, getOwnNodeId());
+    }
     sendSignal(lqhRef, GSN_SCAN_FRAGREQ, signal,
                ScanFragReq::SignalLength, JBB);
     
@@ -4105,7 +4140,7 @@ Backup::fragmentCompleted(Signal* signal
     jam();
     signal->theData[0] = BackupContinueB::BUFFER_FULL_FRAG_COMPLETE;
     signal->theData[1] = filePtr.i;
-    sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 50, 2);
+    sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 50, 2);
     return;
   }//if
   
@@ -4157,7 +4192,21 @@ void
 Backup::checkScan(Signal* signal, BackupFilePtr filePtr)
 {  
   OperationRecord & op = filePtr.p->operation;
-  BlockReference lqhRef = calcInstanceBlockRef(DBLQH);
+  BlockReference lqhRef = 0;
+  {
+    BackupRecordPtr ptr LINT_SET_PTR;
+    c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
+    if (ptr.p->is_lcp()) {
+      lqhRef = calcInstanceBlockRef(DBLQH);
+    } else {
+      TablePtr tabPtr;
+      ndbrequire(findTable(ptr, tabPtr, filePtr.p->tableId));
+      FragmentPtr fragPtr;
+      tabPtr.p->fragments.getPtr(fragPtr, filePtr.p->fragmentNo);
+      const Uint32 instanceKey = fragPtr.p->lqhInstanceKey;
+      lqhRef = numberToRef(DBLQH, instanceKey, getOwnNodeId());
+    }
+  }
 
   if(filePtr.p->errorCode != 0)
   {
@@ -4196,11 +4245,12 @@ Backup::checkScan(Signal* signal, Backup
 	       filePtr.p->tableId,
 	       filePtr.p->fragmentNo,
 	       filePtr.p->operation.noOfRecords);
-      memmove(signal->theData+1, signal->theData, 
+      memmove(signal->theData+2, signal->theData, 
 	      4*ScanFragNextReq::SignalLength);
       signal->theData[0] = BackupContinueB::ZDELAY_SCAN_NEXT;
-      sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 
-			  300, 1+ScanFragNextReq::SignalLength);
+      signal->theData[1] = filePtr.i;
+      sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 
+			  300, 2+ScanFragNextReq::SignalLength);
       return;
     }
     if(ERROR_INSERTED(10032))
@@ -4240,7 +4290,7 @@ Backup::checkScan(Signal* signal, Backup
   
   signal->theData[0] = BackupContinueB::BUFFER_FULL_SCAN;
   signal->theData[1] = filePtr.i;
-  sendSignalWithDelay(BACKUP_REF, GSN_CONTINUEB, signal, 50, 2);
+  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 50, 2);
 }
 
 void
@@ -4612,7 +4662,8 @@ Backup::sendAbortBackupOrd(Signal* signa
     const Uint32 nodeId = node.p->nodeId;
     if(node.p->alive && ptr.p->nodes.get(nodeId)) {
       jam();
-      sendSignal(numberToRef(BACKUP, nodeId), GSN_ABORT_BACKUP_ORD, signal, 
+      BlockReference ref = calcInstanceBlockRef(BACKUP, nodeId);
+      sendSignal(ref, GSN_ABORT_BACKUP_ORD, signal, 
 		 AbortBackupOrd::SignalLength, JBB);
     }//if
   }//for
@@ -4868,7 +4919,8 @@ Backup::execABORT_BACKUP_ORD(Signal* sig
 #ifdef DEBUG_ABORT
       ndbout_c("---- Forward to master nodeId = %u", getMasterNodeId());
 #endif
-      sendSignal(calcBackupBlockRef(getMasterNodeId()), GSN_ABORT_BACKUP_ORD, 
+      BlockReference ref = calcInstanceBlockRef(BACKUP, getMasterNodeId());
+      sendSignal(ref, GSN_ABORT_BACKUP_ORD, 
 		 signal, AbortBackupOrd::SignalLength, JBB);
       return;
     }

=== modified file 'storage/ndb/src/kernel/blocks/backup/Backup.hpp'
--- a/storage/ndb/src/kernel/blocks/backup/Backup.hpp	2008-07-26 05:13:40 +0000
+++ b/storage/ndb/src/kernel/blocks/backup/Backup.hpp	2008-09-16 18:29:47 +0000
@@ -180,6 +180,7 @@ public:
     Uint32 tableId;
     Uint16 node;
     Uint16 fragmentId;
+    Uint8 lqhInstanceKey;
     Uint8 scanned;  // 0 = not scanned x = scanned by node x
     Uint8 scanning; // 0 = not scanning x = scanning on node x
     Uint8 lcp_no;

=== modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhProxy.cpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhProxy.cpp	2008-08-23 06:32:32 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhProxy.cpp	2008-09-16 18:33:52 +0000
@@ -59,6 +59,11 @@ DblqhProxy::DblqhProxy(Block_context& ct
   addRecSignal(GSN_DROP_TAB_CONF, &DblqhProxy::execDROP_TAB_CONF);
   addRecSignal(GSN_DROP_TAB_REF, &DblqhProxy::execDROP_TAB_REF);
 
+  // GSN_ALTER_TAB_REQ
+  addRecSignal(GSN_ALTER_TAB_REQ, &DblqhProxy::execALTER_TAB_REQ);
+  addRecSignal(GSN_ALTER_TAB_CONF, &DblqhProxy::execALTER_TAB_CONF);
+  addRecSignal(GSN_ALTER_TAB_REF, &DblqhProxy::execALTER_TAB_REF);
+
   // GSN_START_RECREQ
   addRecSignal(GSN_START_RECREQ, &DblqhProxy::execSTART_RECREQ);
   addRecSignal(GSN_START_RECCONF, &DblqhProxy::execSTART_RECCONF);
@@ -726,13 +731,109 @@ DblqhProxy::sendDROP_TAB_CONF(Signal* si
     ref->senderData = ss.m_req.senderData;
     ref->tableId = ss.m_req.tableId;
     ref->errorCode = ss.m_error;
-    sendSignal(dictRef, GSN_DROP_TAB_CONF,
+    sendSignal(dictRef, GSN_DROP_TAB_REF,
                signal, DropTabConf::SignalLength, JBB);
   }
 
   ssRelease<Ss_DROP_TAB_REQ>(ssId);
 }
 
+// GSN_ALTER_TAB_REQ
+
+void
+DblqhProxy::execALTER_TAB_REQ(Signal* signal)
+{
+  const AlterTabReq* req = (const AlterTabReq*)signal->getDataPtr();
+  Uint32 ssId = getSsId(req);
+  Ss_ALTER_TAB_REQ& ss = ssSeize<Ss_ALTER_TAB_REQ>(ssId);
+  ss.m_req = *req;
+  ndbrequire(signal->getLength() == AlterTabReq::SignalLength);
+
+  {
+    SectionHandle handle(this, signal);
+    ss.m_sections = handle.m_cnt;
+    ndbrequire(ss.m_sections <= 1);
+    if (ss.m_sections >= 1) {
+      ss.m_sz0 = handle.m_ptr[0].p->m_sz;
+      ndbrequire(ss.m_sz0 <= ss.MaxSection0);
+      ::copy(ss.m_section0, handle.m_ptr[0]);
+    }
+    releaseSections(handle);
+  }
+
+  sendREQ(signal, ss);
+}
+
+void
+DblqhProxy::sendALTER_TAB_REQ(Signal* signal, Uint32 ssId)
+{
+  Ss_ALTER_TAB_REQ& ss = ssFind<Ss_ALTER_TAB_REQ>(ssId);
+
+  AlterTabReq* req = (AlterTabReq*)signal->getDataPtrSend();
+  *req = ss.m_req;
+  req->senderRef = reference();
+  req->senderData = ssId;
+  if (ss.m_sections == 0) {
+    jam();
+    sendSignal(workerRef(ss.m_worker), GSN_ALTER_TAB_REQ,
+               signal, AlterTabReq::SignalLength, JBB);
+  } else {
+    jam();
+    LinearSectionPtr ptr[3];
+    ptr[0].sz = ss.m_sz0;
+    ptr[0].p = ss.m_section0;
+    sendSignal(workerRef(ss.m_worker), GSN_ALTER_TAB_REQ,
+               signal, AlterTabReq::SignalLength, JBB, ptr, 1);
+  }
+}
+
+void
+DblqhProxy::execALTER_TAB_CONF(Signal* signal)
+{
+  const AlterTabConf* conf = (const AlterTabConf*)signal->getDataPtr();
+  Uint32 ssId = getSsId(conf);
+  Ss_ALTER_TAB_REQ& ss = ssFind<Ss_ALTER_TAB_REQ>(ssId);
+  recvCONF(signal, ss);
+}
+
+void
+DblqhProxy::execALTER_TAB_REF(Signal* signal)
+{
+  const AlterTabRef* ref = (const AlterTabRef*)signal->getDataPtr();
+  Uint32 ssId = getSsId(ref);
+  Ss_ALTER_TAB_REQ& ss = ssFind<Ss_ALTER_TAB_REQ>(ssId);
+  recvREF(signal, ss, ref->errorCode);
+}
+
+void
+DblqhProxy::sendALTER_TAB_CONF(Signal* signal, Uint32 ssId)
+{
+  Ss_ALTER_TAB_REQ& ss = ssFind<Ss_ALTER_TAB_REQ>(ssId);
+  BlockReference dictRef = ss.m_req.senderRef;
+
+  if (!lastReply(ss))
+    return;
+
+  if (ss.m_error == 0) {
+    jam();
+    AlterTabConf* conf = (AlterTabConf*)signal->getDataPtrSend();
+    conf->senderRef = reference();
+    conf->senderData = ss.m_req.senderData;
+    sendSignal(dictRef, GSN_ALTER_TAB_CONF,
+               signal, AlterTabConf::SignalLength, JBB);
+  } else {
+    jam();
+    AlterTabRef* ref = (AlterTabRef*)signal->getDataPtrSend();
+    ref->senderRef = reference();
+    ref->senderData = ss.m_req.senderData;
+    ref->errorCode = ss.m_error;
+    sendSignal(dictRef, GSN_ALTER_TAB_REF,
+               signal, AlterTabConf::SignalLength, JBB);
+  }
+
+  ssRelease<Ss_ALTER_TAB_REQ>(ssId);
+}
+
 // GSN_START_RECREQ
 
 void

=== modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhProxy.hpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhProxy.hpp	2008-08-23 06:32:32 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhProxy.hpp	2008-09-16 18:33:52 +0000
@@ -24,6 +24,7 @@
 #include <signaldata/GCP.hpp>
 #include <signaldata/PrepDropTab.hpp>
 #include <signaldata/DropTab.hpp>
+#include <signaldata/AlterTab.hpp>
 #include <signaldata/StartRec.hpp>
 #include <signaldata/LqhTransReq.hpp>
 #include <signaldata/LqhTransConf.hpp>
@@ -230,6 +231,41 @@ protected:
   void execDROP_TAB_REF(Signal*);
   void sendDROP_TAB_CONF(Signal*, Uint32 ssId);
 
+  // GSN_ALTER_TAB_REQ
+  struct Ss_ALTER_TAB_REQ : SsParallel {
+    AlterTabReq m_req;
+    Uint32 m_sections;
+    // wl4391_todo check max length in various cases
+    enum { MaxSection0 = 2 * MAX_ATTRIBUTES_IN_TABLE };
+    Uint32 m_sz0;
+    Uint32 m_section0[MaxSection0];
+    Ss_ALTER_TAB_REQ() {
+      m_sendREQ = (SsFUNC)&DblqhProxy::sendALTER_TAB_REQ;
+      m_sendCONF = (SsFUNC)&DblqhProxy::sendALTER_TAB_CONF;
+      m_sections = 0;
+      m_sz0 = 0;
+    }
+    enum { poolSize = 1 };
+    static SsPool<Ss_ALTER_TAB_REQ>& pool(LocalProxy* proxy) {
+      return ((DblqhProxy*)proxy)->c_ss_ALTER_TAB_REQ;
+    }
+  };
+  SsPool<Ss_ALTER_TAB_REQ> c_ss_ALTER_TAB_REQ;
+  Uint32 getSsId(const AlterTabReq* req) {
+    return SsIdBase | req->tableId;
+  }
+  Uint32 getSsId(const AlterTabConf* conf) {
+    return conf->senderData;
+  }
+  Uint32 getSsId(const AlterTabRef* ref) {
+    return ref->senderData;
+  }
+  void execALTER_TAB_REQ(Signal*);
+  void sendALTER_TAB_REQ(Signal*, Uint32 ssId);
+  void execALTER_TAB_CONF(Signal*);
+  void execALTER_TAB_REF(Signal*);
+  void sendALTER_TAB_CONF(Signal*, Uint32 ssId);
+
   // GSN_START_RECREQ
   struct Ss_START_RECREQ : SsParallel {
     StartRecReq m_req;

=== modified file 'storage/ndb/src/kernel/blocks/dbtup/DbtupBuffer.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupBuffer.cpp	2008-08-11 11:48:10 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupBuffer.cpp	2008-09-16 18:29:47 +0000
@@ -246,10 +246,11 @@ void Dbtup::sendReadAttrinfo(Signal* sig
      * The UTIL/TC blocks are in another thread (in multi-threaded ndbd), so
      * must use sendSignal().
      *
-     * In MT LQH only LQH and BACKUP are in same thread.
+     * In MT LQH only LQH and BACKUP are in same thread, and BACKUP only
+     * in LCP case since user-backup uses single worker.
      */
     BlockNumber blockMain = blockToMain(block);
-    if (blockMain == DBLQH || blockMain == BACKUP)
+    if (blockMain == DBLQH)
     {
       EXECUTE_DIRECT(blockMain, GSN_TRANSID_AI, signal, 3 + ToutBufIndex);
       jamEntry();
@@ -260,6 +261,13 @@ void Dbtup::sendReadAttrinfo(Signal* sig
       EXECUTE_DIRECT(blockMain, GSN_TRANSID_AI, signal, 3 + ToutBufIndex, 0);
       jamEntry();
     }
+    else if (blockMain == BACKUP)
+    {
+      Uint32 iNo = blockToInstance(block);
+      // wl4391_todo maybe not MT safe in non-LCP case
+      EXECUTE_DIRECT(blockMain, GSN_TRANSID_AI, signal, 3 + ToutBufIndex, iNo);
+      jamEntry();
+    }
     else
     {
       jam();

=== modified file 'storage/ndb/src/kernel/vm/mt.cpp'
--- a/storage/ndb/src/kernel/vm/mt.cpp	2008-08-27 20:27:20 +0000
+++ b/storage/ndb/src/kernel/vm/mt.cpp	2008-09-16 18:33:52 +0000
@@ -1823,11 +1823,16 @@ execute_signals(thr_data *selfptr, thr_j
 
 #ifdef VM_TRACE
     if (globalData.testOn) { //wl4391_todo segments
+      SegmentedSectionPtr ptr[3];
+      ptr[0].i = sig->m_sectionPtrI[0];
+      ptr[1].i = sig->m_sectionPtrI[1];
+      ptr[2].i = sig->m_sectionPtrI[2];
+      ::getSections(seccnt, ptr);
       globalSignalLoggers.executeSignal(*s,
                                         0,
                                         &sig->theData[0], 
-                                        globalData.ownId);
-
+                                        globalData.ownId,
+                                        ptr, seccnt);
     }
 #endif
 

=== modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.cpp'
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp	2008-09-12 12:55:29 +0000
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp	2008-09-16 18:29:47 +0000
@@ -2900,14 +2900,19 @@ MgmtSrvr::startBackup(Uint32& backupId, 
 
   SimpleSignal ssig;
   BackupReq* req = CAST_PTR(BackupReq, ssig.getDataPtrSend());
+  /*
+   * Single-threaded backup.  Set instance key 1.  In the kernel
+   * this maps to main instance 0 or worker instance 1 (if MT LQH).
+   */
+  BlockNumber backupBlockNo = numberToBlock(BACKUP, 1);
   if(input_backupId > 0)
   {
-    ssig.set(ss, TestOrd::TraceAPI, BACKUP, GSN_BACKUP_REQ, 
+    ssig.set(ss, TestOrd::TraceAPI, backupBlockNo, GSN_BACKUP_REQ, 
 	     BackupReq::SignalLength);
     req->inputBackupId = input_backupId;
   }
   else
-    ssig.set(ss, TestOrd::TraceAPI, BACKUP, GSN_BACKUP_REQ, 
+    ssig.set(ss, TestOrd::TraceAPI, backupBlockNo, GSN_BACKUP_REQ, 
 	     BackupReq::SignalLength - 1);
   
   req->senderData = 19;

Thread
bzr push into mysql-5.1 branch (pekka:2764 to 2765) WL#4391Pekka Nousiainen16 Sep