bool dmtcp::DmtcpWorker::waitForStage2bCheckpoint() { waitForCoordinatorMsg ( "PEER_LOOKUP", DMT_DO_PEER_LOOKUP ); JTRACE ( "Looking up Socket Peers..." ); theTcpConnections.clear(); theCheckpointState->preCheckpointPeerLookup(theTcpConnections); sendPeerLookupRequest(theTcpConnections); JTRACE ( "Done Socket Peer Lookup" ); WorkerState::setCurrentState ( WorkerState::PEER_LOOKUP_COMPLETE ); { dmtcp::DmtcpMessage msg; msg.type = DMT_OK; msg.state = WorkerState::currentState(); _coordinatorSocket << msg; JTRACE ( "waiting for DRAIN/RESUME message" ); do { msg.poison(); _coordinatorSocket >> msg; msg.assertValid(); if ( msg.type == DMT_KILL_PEER ) { JTRACE ( "Received KILL message from coordinator, exiting" ); _exit ( 0 ); } JTRACE ( "received message" ) (msg.type ); if ( msg.type != DMT_UNKNOWN_PEER ) break; JTRACE ("received DMT_UNKNOWN_PEER message") (msg.conId); TcpConnection* con = (TcpConnection*) &( ConnectionList::instance() [msg.conId] ); con->markExternal(); externalTcpConnections.push_back(msg.conId); _waitingForExternalSocketsToClose = true; } while ( msg.type == DMT_UNKNOWN_PEER ); JASSERT ( msg.type == DMT_DO_DRAIN || msg.type == DMT_DO_RESUME ) ( msg.type ); ConnectionList& connections = ConnectionList::instance(); // Tcp Accept and Connect connection with PeerType UNKNOWN should be marked as INTERNAL for ( ConnectionList::iterator i = connections.begin() ; i!= connections.end() ; ++i ) { Connection* con = i->second; if ( con->conType() == Connection::TCP ) { TcpConnection* tcpCon = (TcpConnection *) con; if ( (tcpCon->tcpType() == TcpConnection::TCP_ACCEPT || tcpCon->tcpType() == TcpConnection::TCP_CONNECT) && tcpCon->peerType() == TcpConnection::PEER_UNKNOWN ) tcpCon->markInternal(); } } if ( msg.type == DMT_DO_RESUME ) { JTRACE ( "Peer Lookup not complete, skipping checkpointing \n\n\n\n\n"); return false; } JASSERT (msg.type == DMT_DO_DRAIN); } }