===== 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]);