===== storage/ndb/src/mgmsrv/MgmtSrvr.cpp 1.143 vs edited =====
--- 1.143/storage/ndb/src/mgmsrv/MgmtSrvr.cpp	2008-03-03 12:12:28 +01:00
+++ edited/storage/ndb/src/mgmsrv/MgmtSrvr.cpp	2008-03-13 16:40:09 +01:00
@@ -1190,14 +1190,19 @@
 {
   if (!abort)
   {
+    /*
+      verify that no nodes are starting, as a stop would cause starting
+      nodes to shut down
+    */
     NodeId nodeId = 0;
     ClusterMgr::Node node;
     while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB))
     {
       node = theFacade->theClusterMgr->getNodeInfo(nodeId);
       if((node.m_state.startLevel != NodeState::SL_STARTED) && 
-	 (node.m_state.startLevel != NodeState::SL_NOTHING))
-	return OPERATION_NOT_ALLOWED_START_STOP;
+         (node.m_state.startLevel != NodeState::SL_CMVMI) && 
+         (node.m_state.startLevel != NodeState::SL_NOTHING))
+        return OPERATION_NOT_ALLOWED_START_STOP;
     }
   }
   NdbNodeBitmask nodes;
@@ -1270,12 +1275,17 @@
 {
   if (getNodeType(singleUserNodeId) != NDB_MGM_NODE_TYPE_API)
     return NODE_NOT_API_NODE;
+  /*
+    verify that no nodes are starting, as a stop would cause starting
+    nodes to shut down
+  */
   NodeId nodeId = 0;
   ClusterMgr::Node node;
   while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB))
   {
     node = theFacade->theClusterMgr->getNodeInfo(nodeId);
     if((node.m_state.startLevel != NodeState::SL_STARTED) && 
+       (node.m_state.startLevel != NodeState::SL_CMVMI) && 
        (node.m_state.startLevel != NodeState::SL_NOTHING))
       return OPERATION_NOT_ALLOWED_START_STOP;
   }
@@ -1305,6 +1315,23 @@
                            bool initialStart, bool abort,
                            int *stopSelf)
 {
+  if (!abort)
+  {
+    /*
+      verify that no nodes are starting, as a stop would cause starting
+      nodes to shut down
+    */
+    NodeId nodeId = 0;
+    ClusterMgr::Node node;
+    while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB))
+    {
+      node = theFacade->theClusterMgr->getNodeInfo(nodeId);
+      if((node.m_state.startLevel != NodeState::SL_STARTED) && 
+         (node.m_state.startLevel != NodeState::SL_CMVMI) && 
+         (node.m_state.startLevel != NodeState::SL_NOTHING))
+        return OPERATION_NOT_ALLOWED_START_STOP;
+    }
+  }
   NdbNodeBitmask nodes;
   int ret= sendSTOP_REQ(node_ids,
                         nodes,
@@ -1350,6 +1377,36 @@
   if (nostart)
     return 0;
 
+  /*
+    verify that no nodes are stopping before starting as this would cause
+    the starting node to shutdown
+  */
+  for (;;)
+  {
+    int stopping = 0;
+    NodeId nodeId = 0;
+    ClusterMgr::Node node;
+    while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB))
+    {
+      node = theFacade->theClusterMgr->getNodeInfo(nodeId);
+      if((node.m_state.startLevel != NodeState::SL_STARTED) && 
+         (node.m_state.startLevel != NodeState::SL_CMVMI) && 
+         (node.m_state.startLevel != NodeState::SL_NOTHING))
+      {
+        stopping = 1;
+        break;
+      }
+    }
+    if (stopping)
+    {
+      NdbSleep_MilliSleep(100);
+      continue;
+    }
+    break;
+  }
+  /*
+    start the nodes
+  */
   for (unsigned i = 0; i < node_ids.size(); i++)
   {
     (void) start(node_ids[i]);
