List:Commits« Previous MessageNext Message »
From:jonas Date:March 6 2007 10:22pm
Subject:bk commit into 5.1 tree (jonas:1.2116)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of jonas. When jonas does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-03-06 22:22:44+01:00, jonas@stripped +10 -0
  Merge perch.ndb.mysql.com:/home/jonas/src/drop5
  into  perch.ndb.mysql.com:/home/jonas/src/drop6
  MERGE: 1.2071.1.42

  cluster_change_hist.txt@stripped, 2007-03-06 22:21:15+01:00, jonas@stripped +0
-14
    MERGE: 1.7.1.8

  storage/ndb/include/mgmapi/mgmapi_config_parameters.h@stripped, 2007-03-06 22:22:43+01:00,
jonas@stripped +1 -1
    merge
    MERGE: 1.25.1.1

  storage/ndb/include/ndbapi/Ndb.hpp@stripped, 2007-03-06 22:21:06+01:00,
jonas@stripped +0 -0
    Auto merged
    MERGE: 1.47.1.1

  storage/ndb/src/common/mgmcommon/IPCConfig.cpp@stripped, 2007-03-06 22:21:06+01:00,
jonas@stripped +0 -0
    Auto merged
    MERGE: 1.26.1.1

  storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp@stripped, 2007-03-06 22:21:06+01:00,
jonas@stripped +0 -0
    Auto merged
    MERGE: 1.53.1.6

  storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp@stripped, 2007-03-06 22:21:06+01:00,
jonas@stripped +0 -0
    Auto merged
    MERGE: 1.89.1.3

  storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp@stripped, 2007-03-06 22:21:06+01:00,
jonas@stripped +0 -0
    Auto merged
    MERGE: 1.12.1.5

  storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp@stripped, 2007-03-06 22:21:06+01:00,
jonas@stripped +0 -0
    Auto merged
    MERGE: 1.30.1.10

  storage/ndb/src/mgmsrv/ConfigInfo.cpp@stripped, 2007-03-06 22:22:43+01:00,
jonas@stripped +12 -12
    merge
    MERGE: 1.76.1.2

  storage/ndb/src/ndbapi/NdbImpl.hpp@stripped, 2007-03-06 22:21:06+01:00,
jonas@stripped +0 -0
    Auto merged
    MERGE: 1.17.1.1

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	jonas
# Host:	perch.ndb.mysql.com
# Root:	/home/jonas/src/drop6/RESYNC

--- 1.26/storage/ndb/include/mgmapi/mgmapi_config_parameters.h	2007-03-06 22:22:48 +01:00
+++ 1.27/storage/ndb/include/mgmapi/mgmapi_config_parameters.h	2007-03-06 22:22:48 +01:00
@@ -127,6 +127,7 @@
 #define CFG_TCP_RCV_BUF_SIZE          457
 #define CFG_TCP_SND_BUF_SIZE          458
 #define CFG_TCP_MAXSEG_SIZE           459
+#define CFG_TCP_BIND_INADDR_ANY       460
 
 #define CFG_SHM_SEND_SIGNAL_ID        500
 #define CFG_SHM_CHECKSUM              501

--- 1.48/storage/ndb/include/ndbapi/Ndb.hpp	2007-03-06 22:22:48 +01:00
+++ 1.49/storage/ndb/include/ndbapi/Ndb.hpp	2007-03-06 22:22:48 +01:00
@@ -1062,6 +1062,8 @@
   friend class NdbDictInterface;
   friend class NdbBlob;
   friend class NdbImpl;
+  friend class Ndb_cluster_connection;
+  friend class Ndb_cluster_connection_impl;
 #endif
 
 public:

--- 1.79/storage/ndb/src/mgmsrv/ConfigInfo.cpp	2007-03-06 22:22:48 +01:00
+++ 1.80/storage/ndb/src/mgmsrv/ConfigInfo.cpp	2007-03-06 22:22:48 +01:00
@@ -1227,6 +1227,18 @@
     "0",
     STR_VALUE(MAX_INT_RNIL) },
 
+  { 
+    KEY_INTERNAL,
+    "TcpBind_INADDR_ANY",
+    DB_TOKEN,
+    "Bind IP_ADDR_ANY so that connections can be made from anywhere (for autogenerated
connections)",
+    ConfigInfo::CI_USED,
+    false,
+    ConfigInfo::CI_BOOL,
+    "false",
+    "false",
+    "true"},
+  
   /***************************************************************************
    * API
    ***************************************************************************/
@@ -1766,7 +1778,18 @@
     "0", 
     "2G" 
   },
-  
+ 
+  {
+    CFG_TCP_BIND_INADDR_ANY,
+    "TcpBind_INADDR_ANY",
+    "TCP",
+    "Bind InAddrAny instead of hostname for server part of connection",
+    ConfigInfo::CI_USED,
+    false,
+    ConfigInfo::CI_BOOL,
+    "false",
+    "false", "true" },
+
   /****************************************************************************
    * SHM
    ***************************************************************************/
@@ -3161,6 +3184,13 @@
     DBUG_RETURN(false);
   }
 
+  Uint32 bindAnyAddr = 0;
+  node1->get("TcpBind_INADDR_ANY", &bindAnyAddr);
+  if (bindAnyAddr)
+  {
+    ctx.m_currentSection->put("TcpBind_INADDR_ANY", 1, true);
+  }
+  
   Uint32 port= 0;
   if(strcmp(type1, MGM_TOKEN)==0)
     node1->get("PortNumber",&port);

--- 1.27/storage/ndb/src/common/mgmcommon/IPCConfig.cpp	2007-03-06 22:22:48 +01:00
+++ 1.28/storage/ndb/src/common/mgmcommon/IPCConfig.cpp	2007-03-06 22:22:48 +01:00
@@ -251,10 +251,15 @@
     else
       conf.isMgmConnection= false;
 
+    Uint32 bindInAddrAny = 0;
+    iter.get(CFG_TCP_BIND_INADDR_ANY, &bindInAddrAny);
+
     if (nodeId == nodeIdServer && !conf.isMgmConnection) {
-      tr.add_transporter_interface(remoteNodeId, localHostName, server_port);
+      tr.add_transporter_interface(remoteNodeId, 
+				   !bindInAddrAny ? localHostName : "", 
+				   server_port);
     }
-
+    
     DBUG_PRINT("info", ("Transporter between this node %d and node %d using port %d,
signalId %d, checksum %d",
                nodeId, remoteNodeId, server_port, sendSignalId, checksum));
     /*

--- 1.55/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp	2007-03-06 22:22:48 +01:00
+++ 1.56/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp	2007-03-06 22:22:48 +01:00
@@ -666,6 +666,12 @@
   {
     jam();
     memcpy(sysfileData, cdata, sizeof(sysfileData));
+
+    if (c_set_initial_start_flag)
+    {
+      jam();
+      Sysfile::setInitialStartOngoing(SYSFILE->systemRestartBits);
+    }
   }
 
   c_copyGCISlave.m_copyReason = reason;
@@ -1163,11 +1169,58 @@
 void Dbdih::execDIH_RESTARTREQ(Signal* signal) 
 {
   jamEntry();
-  cntrlblockref = signal->theData[0];
-  if(theConfiguration.getInitialStart()){
-    sendSignal(cntrlblockref, GSN_DIH_RESTARTREF, signal, 1, JBB);
-  } else {
-    readGciFileLab(signal);
+  if (signal->theData[0])
+  {
+    jam();
+    cntrlblockref = signal->theData[0];
+    if(theConfiguration.getInitialStart()){
+      sendSignal(cntrlblockref, GSN_DIH_RESTARTREF, signal, 1, JBB);
+    } else {
+      readGciFileLab(signal);
+    }
+  }
+  else
+  {
+    /**
+     * Precondition, (not checked)
+     *   atleast 1 node in each node group
+     */
+    Uint32 i;
+    NdbNodeBitmask mask;
+    mask.assign(NdbNodeBitmask::Size, signal->theData + 1);
+    Uint32 *node_gcis = signal->theData+1+NdbNodeBitmask::Size;
+    Uint32 node_group_gcis[MAX_NDB_NODES+1];
+    bzero(node_group_gcis, sizeof(node_group_gcis));
+    for (i = 0; i<MAX_NDB_NODES; i++)
+    {
+      if (mask.get(i))
+      {
+	jam();
+	Uint32 ng = Sysfile::getNodeGroup(i, SYSFILE->nodeGroups);
+	ndbrequire(ng < MAX_NDB_NODES);
+	Uint32 gci = node_gcis[i];
+	if (gci > node_group_gcis[ng])
+	{
+	  jam();
+	  node_group_gcis[ng] = gci;
+	}
+      }
+    }
+    for (i = 0; i<MAX_NDB_NODES && node_group_gcis[i] == 0; i++);
+    
+    Uint32 gci = node_group_gcis[i];
+    for (i++ ; i<MAX_NDB_NODES; i++)
+    {
+      jam();
+      if (node_group_gcis[i] && node_group_gcis[i] != gci)
+      {
+	jam();
+	signal->theData[0] = i;
+	return;
+      }
+    }
+    signal->theData[0] = MAX_NDB_NODES;
+    return;
   }
   return;
 }//Dbdih::execDIH_RESTARTREQ()
@@ -1259,6 +1312,11 @@
     // The permission is given by the master node in the alive set.  
     /*-----------------------------------------------------------------------*/
     createMutexes(signal, 0);
+    if (cstarttype == NodeState::ST_INITIAL_NODE_RESTART)
+    {
+      jam();
+      c_set_initial_start_flag = TRUE; // In sysfile...
+    }
     break;
     
   case ZNDB_SPH3:
@@ -1472,10 +1530,26 @@
        */
       SYSFILE->lastCompletedGCI[nodePtr.i] = 0;
       ndbrequire(nodePtr.p->nodeStatus != NodeRecord::ALIVE);
-      warningEvent("Making filesystem for node %d unusable",
+      warningEvent("Making filesystem for node %d unusable (need --initial)",
 		   nodePtr.i);
     }
+    else if (nodePtr.p->nodeStatus == NodeRecord::ALIVE &&
+	     SYSFILE->lastCompletedGCI[nodePtr.i] == 0)
+    {
+      jam();
+      CRASH_INSERTION(7170);
+      char buf[255];
+      BaseString::snprintf(buf, sizeof(buf), 
+			   "Cluster requires this node to be started "
+			   " with --initial as partial start has been performed"
+			   " and this filesystem is unusable");
+      progError(__LINE__, 
+		NDBD_EXIT_SR_RESTARTCONFLICT,
+		buf);
+      ndbrequire(false);
+    }
   }
+
   /**
    * This set which GCI we will try to restart to
    */
@@ -4538,6 +4612,8 @@
 Dbdih::startLcpMasterTakeOver(Signal* signal, Uint32 nodeId){
   jam();
 
+  Uint32 oldNode = c_lcpMasterTakeOverState.failedNodeId;
+
   c_lcpMasterTakeOverState.minTableId = ~0;
   c_lcpMasterTakeOverState.minFragId = ~0;
   c_lcpMasterTakeOverState.failedNodeId = nodeId;
@@ -4556,7 +4632,20 @@
     /**
      * Node failure during master take over...
      */
-    ndbout_c("Nodefail during master take over");
+    ndbout_c("Nodefail during master take over (old: %d)", oldNode);
+  }
+  
+  NodeRecordPtr nodePtr;
+  nodePtr.i = oldNode;
+  if (oldNode > 0 && oldNode < MAX_NDB_NODES)
+  {
+    jam();
+    ptrCheckGuard(nodePtr, MAX_NDB_NODES, nodeRecord);
+    if (nodePtr.p->m_nodefailSteps.get(NF_LCP_TAKE_OVER))
+    {
+      jam();
+      checkLocalNodefailComplete(signal, oldNode, NF_LCP_TAKE_OVER);
+    }
   }
   
   setLocalNodefailHandling(signal, nodeId, NF_LCP_TAKE_OVER);
@@ -5572,6 +5661,14 @@
   jamEntry();
   const BlockReference newMasterBlockref = req->masterRef;
 
+  if (newMasterBlockref != cmasterdihref)
+  {
+    jam();
+    ndbout_c("resending GSN_MASTER_LCPREQ");
+    sendSignalWithDelay(reference(), GSN_MASTER_LCPREQ, signal,
+			signal->getLength(), 50);
+    return;
+  }
   Uint32 failedNodeId = req->failedNodeId;
 
   /**
@@ -5867,6 +5964,8 @@
   ptrCheckGuard(nodePtr, MAX_NDB_NODES, nodeRecord);
   nodePtr.p->lcpStateAtTakeOver = lcpState;
 
+  CRASH_INSERTION(7180);
+  
 #ifdef VM_TRACE
   ndbout_c("MASTER_LCPCONF");
   printMASTER_LCP_CONF(stdout, &signal->theData[0], 0, 0);
@@ -10359,6 +10458,17 @@
   
   sendSignal(c_lcpState.m_masterLcpDihRef, GSN_LCP_COMPLETE_REP, signal, 
 	     LcpCompleteRep::SignalLength, JBB);
+
+  /**
+   * Say that an initial node restart does not need to be redone
+   *   once node has been part of first LCP
+   */
+  if (c_set_initial_start_flag &&
+      c_lcpState.m_participatingLQH.get(getOwnNodeId()))
+  {
+    jam();
+    c_set_initial_start_flag = FALSE;
+  }
 }
 
 /*-------------------------------------------------------------------------- */
@@ -11998,7 +12108,7 @@
 	(buf, sizeof(buf), 
 	 "Illegal initial start, no alive node in nodegroup %u", i);
       progError(__LINE__, 
-		NDBD_EXIT_SR_RESTARTCONFLICT,
+		NDBD_EXIT_INSUFFICENT_NODES,
 		buf);
       
     }
@@ -12138,14 +12248,23 @@
   /*       THAT THE NEW REPLICA IS NOT STARTED YET AND REPLICA_LAST_GCI IS*/
   /*       SET TO -1 TO INDICATE THAT IT IS NOT DEAD YET.                 */
   /*----------------------------------------------------------------------*/
+  Uint32 lastGCI = SYSFILE->lastCompletedGCI[nodeId];
   arrGuardErr(ncrReplicaPtr.p->noCrashedReplicas + 1, 8,
               NDBD_EXIT_MAX_CRASHED_REPLICAS);
   ncrReplicaPtr.p->replicaLastGci[ncrReplicaPtr.p->noCrashedReplicas] = 
-    SYSFILE->lastCompletedGCI[nodeId];
+    lastGCI;
   ncrReplicaPtr.p->noCrashedReplicas = ncrReplicaPtr.p->noCrashedReplicas + 1;
   ncrReplicaPtr.p->createGci[ncrReplicaPtr.p->noCrashedReplicas] = 0;
   ncrReplicaPtr.p->replicaLastGci[ncrReplicaPtr.p->noCrashedReplicas] = 
     (Uint32)-1;
+
+  if (ncrReplicaPtr.p->noCrashedReplicas == 7 && lastGCI)
+  {
+    jam();
+    SYSFILE->lastCompletedGCI[nodeId] = 0;
+    warningEvent("Making filesystem for node %d unusable (need --initial)",
+		 nodeId);
+  }
 }//Dbdih::newCrashedReplica()
 
 /*************************************************************************/

--- 1.91/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	2007-03-06 22:22:48 +01:00
+++ 1.92/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	2007-03-06 22:22:48 +01:00
@@ -3593,6 +3593,7 @@
     jam();
     regTcPtr->activeCreat = ZTRUE;
     CRASH_INSERTION(5002);
+    CRASH_INSERTION2(5042, tabptr.i == c_error_insert_table_id);
   } else {
     regTcPtr->activeCreat = ZFALSE;
   }//if
@@ -11605,7 +11606,8 @@
     return;
   }
 
-  if(getNodeState().getNodeRestartInProgress()){
+  if(getNodeState().getNodeRestartInProgress() && cstartRecReq < 2)
+  {
     GCPSaveRef * const saveRef = (GCPSaveRef*)&signal->theData[0];
     saveRef->dihPtr = dihPtr;
     saveRef->nodeId = getOwnNodeId();
@@ -13749,7 +13751,7 @@
        *  NO MORE FRAGMENTS ARE WAITING FOR SYSTEM RESTART.
        * -------------------------------------------------------------------- */
       lcpPtr.p->lcpState = LcpRecord::LCP_IDLE;
-      if (cstartRecReq == ZTRUE) {
+      if (cstartRecReq == 1) {
         jam();
 	/* ----------------------------------------------------------------
          *  WE HAVE ALSO RECEIVED AN INDICATION THAT NO MORE FRAGMENTS 
@@ -13819,7 +13821,7 @@
   ndbrequire(req->receivingNodeId == cownNodeid);
 
   cnewestCompletedGci = cnewestGci;
-  cstartRecReq = ZTRUE;
+  cstartRecReq = 1;
   for (logPartPtr.i = 0; logPartPtr.i < 4; logPartPtr.i++) {
     ptrAss(logPartPtr, logPartRecord);
     logPartPtr.p->logPartNewestCompletedGCI = cnewestCompletedGci;
@@ -13840,6 +13842,7 @@
   }//if
   if(cstartType == NodeState::ST_INITIAL_NODE_RESTART){
     jam();
+    cstartRecReq = 2;
     StartRecConf * conf = (StartRecConf*)signal->getDataPtrSend();
     conf->startingNodeId = getOwnNodeId();
     sendSignal(cmasterDihBlockref, GSN_START_RECCONF, signal, 
@@ -15649,6 +15652,7 @@
   } else if ((cstartType == NodeState::ST_NODE_RESTART) ||
              (cstartType == NodeState::ST_SYSTEM_RESTART)) {
     jam();
+    cstartRecReq = 2;
     StartRecConf * conf = (StartRecConf*)signal->getDataPtrSend();
     conf->startingNodeId = getOwnNodeId();
     sendSignal(cmasterDihBlockref, GSN_START_RECCONF, signal, 
@@ -16611,7 +16615,7 @@
     cCommitBlocked = false;
     ccurrentGcprec = RNIL;
     caddNodeState = ZFALSE;
-    cstartRecReq = ZFALSE;
+    cstartRecReq = 0;
     cnewestGci = (UintR)-1;
     cnewestCompletedGci = (UintR)-1;
     crestartOldestGci = 0;
@@ -19190,6 +19194,13 @@
 			   tcRec.p->transid[0], tcRec.p->transid[1], key.c_str());
       infoEvent(buf);
     }
+  }
+
+  if (dumpState->args[0] == DumpStateOrd::LqhErrorInsert5042 && 
+      signal->getLength() == 2)
+  {
+    c_error_insert_table_id = dumpState->args[1];
+    SET_ERROR_INSERT_VALUE(5042);
   }
 }//Dblqh::execDUMP_STATE_ORD()
 

--- 1.18/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp	2007-03-06 22:22:48 +01:00
+++ 1.19/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp	2007-03-06 22:22:48 +01:00
@@ -129,6 +129,7 @@
     Uint32 m_president_candidate_gci;
     Uint16 m_regReqReqSent;
     Uint16 m_regReqReqRecv;
+    Uint32 m_node_gci[MAX_NDB_NODES];
   } c_start;
   
   NdbNodeBitmask c_definedNodes; // DB nodes in config

--- 1.38/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp	2007-03-06 22:22:48 +01:00
+++ 1.39/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp	2007-03-06 22:22:48 +01:00
@@ -1072,7 +1072,8 @@
     jam();
     c_start.m_starting_nodes_w_log.set(TaddNodeno);
   }
-  
+  c_start.m_node_gci[TaddNodeno] = node_gci;
+
   skip_nodes.bitAND(c_definedNodes);
   c_start.m_skip_nodes.bitOR(skip_nodes);
   
@@ -1208,6 +1209,7 @@
   wait.bitANDC(tmp);
 
   Uint32 retVal = 0;
+  Uint32 incompleteng = MAX_NDB_NODES; // Illegal value
   NdbNodeBitmask report_mask;
 
   if ((c_start.m_latest_gci == 0) || 
@@ -1232,6 +1234,7 @@
       goto start_report;
     }
   }
+
   {
     const bool all = c_start.m_starting_nodes.equal(c_definedNodes);
     CheckNodeGroups* sd = (CheckNodeGroups*)&signal->theData[0];
@@ -1293,7 +1296,7 @@
         report_mask.assign(c_definedNodes);
         report_mask.bitANDC(c_start.m_starting_nodes);
         retVal = 1;
-        goto start_report;
+        goto check_log;
       case CheckNodeGroups::Partitioning:
         ndbrequire(result != CheckNodeGroups::Lose);
         signal->theData[1] = 
@@ -1301,7 +1304,7 @@
         report_mask.assign(c_definedNodes);
         report_mask.bitANDC(c_start.m_starting_nodes);
         retVal = 1;
-        goto start_report;
+        goto check_log;
       }
     }
 
@@ -1325,12 +1328,7 @@
     case CheckNodeGroups::Partitioning:
       if (now < partitioned_timeout && result != CheckNodeGroups::Win)
       {
-        signal->theData[1] = c_restartPartionedTimeout == ~0 ? 4 : 5;
-        signal->theData[2] = Uint32((partitioned_timeout - now + 500) / 1000);
-        report_mask.assign(c_definedNodes);
-        report_mask.bitANDC(c_start.m_starting_nodes);
-        retVal = 0;
-        goto start_report;
+        goto missinglog;
       }
       // Fall through...
     case CheckNodeGroups::Win:
@@ -1338,12 +1336,61 @@
         all ? 0x8001 : (result == CheckNodeGroups::Win ? 0x8002 : 0x8003);
       report_mask.assign(c_definedNodes);
       report_mask.bitANDC(c_start.m_starting_nodes);
-      retVal = 1;
-      goto start_report;
+      retVal = 2;
+      goto check_log;
     }
   }
   ndbrequire(false);
 
+check_log:
+  jam();
+  {
+    Uint32 save[4+4*NdbNodeBitmask::Size];
+    memcpy(save, signal->theData, sizeof(save));
+    
+    signal->theData[0] = 0;
+    c_start.m_starting_nodes.copyto(NdbNodeBitmask::Size, signal->theData+1);
+    memcpy(signal->theData+1+NdbNodeBitmask::Size, c_start.m_node_gci,
+	   4*MAX_NDB_NODES);
+    EXECUTE_DIRECT(DBDIH, GSN_DIH_RESTARTREQ, signal, 
+		   1+NdbNodeBitmask::Size+MAX_NDB_NODES);
+    
+    incompleteng = signal->theData[0];
+    memcpy(signal->theData, save, sizeof(save));
+
+    if (incompleteng != MAX_NDB_NODES)
+    {
+      jam();
+      if (retVal == 1)
+      {
+	jam();
+	goto incomplete_log;
+      }
+      else if (retVal == 2)
+      {
+	if (now <= partitioned_timeout)
+	{
+	  jam();
+	  goto missinglog;
+	}
+	else
+	{
+	  goto incomplete_log;
+	}
+      }
+      ndbrequire(false);
+    }
+  }
+  goto start_report;
+
+missinglog:
+  signal->theData[1] = c_restartPartionedTimeout == (Uint32) ~0 ? 4 : 5;
+  signal->theData[2] = Uint32((partitioned_timeout - now + 500) / 1000);
+  report_mask.assign(c_definedNodes);
+  report_mask.bitANDC(c_start.m_starting_nodes);
+  retVal = 0;
+  goto start_report;
+  
 start_report:
   jam();
   {
@@ -1361,18 +1408,32 @@
   return retVal;
   
 missing_nodegroup:
-  jam();
-  char buf[100], mask1[100], mask2[100];
-  c_start.m_starting_nodes.getText(mask1);
-  tmp.assign(c_start.m_starting_nodes);
-  tmp.bitANDC(c_start.m_starting_nodes_w_log);
-  tmp.getText(mask2);
-  BaseString::snprintf(buf, sizeof(buf),
-		       "Unable to start missing node group! "
-		       " starting: %s (missing fs for: %s)",
-		       mask1, mask2);
-  progError(__LINE__, NDBD_EXIT_SR_RESTARTCONFLICT, buf);
-  return 0; // remove warning
+ {
+   char buf[100], mask1[100], mask2[100];
+   c_start.m_starting_nodes.getText(mask1);
+   tmp.assign(c_start.m_starting_nodes);
+   tmp.bitANDC(c_start.m_starting_nodes_w_log);
+   tmp.getText(mask2);
+   BaseString::snprintf(buf, sizeof(buf),
+			"Unable to start missing node group! "
+			" starting: %s (missing fs for: %s)",
+			mask1, mask2);
+   progError(__LINE__, NDBD_EXIT_INSUFFICENT_NODES, buf);
+   return 0;                                     // Deadcode
+ }
+
+incomplete_log:
+ jam();
+ {
+   char buf[100], mask1[100];
+   c_start.m_starting_nodes.getText(mask1);
+   BaseString::snprintf(buf, sizeof(buf),
+			 "Incomplete log for node group: %d! "
+			 " starting nodes: %s",
+			incompleteng, mask1);
+   progError(__LINE__, NDBD_EXIT_INSUFFICENT_NODES, buf);
+   return 0;                                     // Deadcode
+ }
 }
 
 void

--- 1.18/storage/ndb/src/ndbapi/NdbImpl.hpp	2007-03-06 22:22:48 +01:00
+++ 1.19/storage/ndb/src/ndbapi/NdbImpl.hpp	2007-03-06 22:22:48 +01:00
@@ -59,7 +59,8 @@
   int send_event_report(Uint32 *data, Uint32 length);
 
   Ndb &m_ndb;
-
+  Ndb * m_next_ndb_object, * m_prev_ndb_object;
+  
   Ndb_cluster_connection_impl &m_ndb_cluster_connection;
   TransporterFacade *m_transporter_facade;
 
Thread
bk commit into 5.1 tree (jonas:1.2116)jonas6 Mar