fix a bug when multiple crashes. The spare processors need to be updated with the...
authorGengbin Zheng <gzheng@illinois.edu>
Sat, 29 Oct 2011 06:27:11 +0000 (01:27 -0500)
committerGengbin Zheng <gzheng@illinois.edu>
Sat, 29 Oct 2011 06:27:11 +0000 (01:27 -0500)
added a function CkHasCheckpoints(0 which returns true when there is already checkpoints.

src/arch/mpi/machine.c
src/ck-core/ckmemcheckpoint.C
src/ck-core/ckmemcheckpoint.h

index c9759be58fff94fb33a48db803583e99c9f62607..77814c8104ddf0186fdf6890d9e757e7a51689ee 100644 (file)
@@ -1104,10 +1104,8 @@ static void MachineInitForMPI(int *argc, char ***argv, int *numNodes, int *myNod
     for (i=0; i<num_workpes; i++)  petorank[i] = i;
     nextrank = num_workpes;
 
-    char msg[1];
-    MPI_Status sts;
-
     if (*myNodeID >= num_workpes) {
+      MPI_Status sts;
       int vals[2];
       MPI_Recv(vals,2,MPI_INT,MPI_ANY_SOURCE,FAIL_TAG, MPI_COMM_WORLD,&sts);
       int newpe = vals[0];
@@ -1119,8 +1117,9 @@ static void MachineInitForMPI(int *argc, char ***argv, int *numNodes, int *myNod
           exit(0);
       }
 
+        /* update petorank */
+      MPI_Recv(petorank, num_workpes, MPI_INT,MPI_ANY_SOURCE,FAIL_TAG,MPI_COMM_WORLD, &sts);
       nextrank = *myNodeID + 1;
-      petorank[newpe] = *myNodeID;
       *myNodeID = newpe;
       myNID = newpe;
 
@@ -1552,6 +1551,7 @@ void mpi_restart_crashed(int pe, int rank)
     vals[0] = pe;
     vals[1] = CpvAccess(_curRestartPhase)+1;
     MPI_Send((void *)vals,2,MPI_INT,rank,FAIL_TAG,MPI_COMM_WORLD);
+    MPI_Send(petorank, num_workpes, MPI_INT,rank,FAIL_TAG,MPI_COMM_WORLD);
 }
 
 /* notify spare processors to exit */
@@ -1567,7 +1567,7 @@ void mpi_end_spare()
 int find_spare_mpirank(int pe)
 {
     if (nextrank == total_pes) {
-      CmiAbort("Charm++> ran out of spared processors");
+      CmiAbort("Charm++> ran out of spare processors");
     }
     petorank[pe] = nextrank;
     nextrank++;
index 407b6e4b0607a022725c0d97edc6d3172b3de76a..c3f8c235d466d091eb0ac48884bfd7ffbdf97b38 100644 (file)
@@ -79,6 +79,7 @@ int _memChkptOn = 1;                  // checkpoint is on or off
 
 CkGroupID ckCheckPTGroupID;            // readonly
 
+static int checkpointed = 0;
 
 /// @todo the following declarations should be moved into a separate file for all 
 // fault tolerant strategies
@@ -441,6 +442,7 @@ void CkMemCheckPT::recoverEntry(CkArrayCheckPTMessage *msg)
 // to send me checkpoint data.
 void CkMemCheckPT::doItNow(int starter, CkCallback &cb)
 {
+  checkpointed = 1;
   cpCallback = cb;
   cpStarter = starter;
   if (CkMyPe() == cpStarter) {
@@ -1156,11 +1158,11 @@ void CkMemRestart(const char *dummy, CkArgMsg *args)
        
   _discard_charm_message();
   
-if(CmiMyRank()==0){
-   CkCallback cb(qd_callback);
-   CkStartQD(cb);
-   CkPrintf("crash_node:%d\n",CpvAccess( _crashedNode));
- }
+  if(CmiMyRank()==0){
+    CkCallback cb(qd_callback);
+    CkStartQD(cb);
+    CkPrintf("crash_node:%d\n",CpvAccess( _crashedNode));
 }
 #else
    CmiAbort("Fault tolerance is not support, rebuild charm++ with 'syncft' option");
 #endif
@@ -1264,7 +1266,6 @@ extern "C" void (*notify_crash_fn)(int node);
 
 #if CMK_CONVERSE_MPI
 static int pingHandlerIdx;
-static int pingBackHandlerIdx;
 static int pingCheckHandlerIdx;
 static int buddyDieHandlerIdx;
 static double lastPingTime = -1;
@@ -1274,6 +1275,7 @@ extern "C" void mpi_restart_crashed(int pe, int rank);
 extern "C" int  find_spare_mpirank(int pe);
 extern void CkDeleteChares();
 
+void pingBuddy();
 void pingCheckHandler();
 
 void buddyDieHandler(char *msg)
@@ -1295,23 +1297,21 @@ void pingHandler(void *msg)
 {
   lastPingTime = CmiWallTimer();
   CmiFree(msg);
-}
-
-void pingBackHandler(char *msg)
-{
-  CmiSetHandler(msg, pingHandlerIdx);
-  int from = *(int *)(msg+CmiMsgHeaderSizeBytes);
-  CmiSyncSendAndFree(from, CmiMsgHeaderSizeBytes+sizeof(int), (char *)msg);
+//if (CmiMyPe() == 5) printf("[%d] pingHandler %f\n", 5, lastPingTime);
 }
 
 void pingCheckHandler()
 {
   double now = CmiWallTimer();
   if (lastPingTime > 0 && now - lastPingTime > 4) {
+    int pe, buddy;
     // tell everyone the buddy dies
     CkMemCheckPT *obj = CProxy_CkMemCheckPT(ckCheckPTGroupID).ckLocalBranch();
-    int buddy = obj->BuddyPE(CkMyPe());
-    CmiPrintf("[%d] detected buddy processor %d died. \n", CmiMyPe(), buddy);
+    for (pe = 0; pe < CmiNumPes(); pe++) {
+       if (obj->BuddyPE(pe) == CmiMyPe()) break;
+    }
+    buddy = pe;
+    CmiPrintf("[%d] detected buddy processor %d died %f %f. \n", CmiMyPe(), buddy, now, lastPingTime);
     for (int pe = 0; pe < CmiNumPes(); pe++) {
       if (obj->isFailed(pe) || pe == buddy) continue;
       char *msg = (char*)CmiAlloc(CmiMsgHeaderSizeBytes+sizeof(int));
@@ -1332,10 +1332,11 @@ void pingBuddy()
 //printf("[%d] pingBuddy %d\n", CmiMyPe(), buddy);
     char *msg = (char*)CmiAlloc(CmiMsgHeaderSizeBytes+sizeof(int));
     *(int *)(msg+CmiMsgHeaderSizeBytes) = CmiMyPe();
-    CmiSetHandler(msg, pingBackHandlerIdx);
+    CmiSetHandler(msg, pingHandlerIdx);
+    CmiGetRestartPhase(msg) = 9999;
     CmiSyncSendAndFree(buddy, CmiMsgHeaderSizeBytes+sizeof(int), (char *)msg);
-    CcdCallOnCondition(CcdPERIODIC_100ms,(CcdVoidFn)pingBuddy,NULL);
   }
+  CcdCallOnCondition(CcdPERIODIC_100ms,(CcdVoidFn)pingBuddy,NULL);
 }
 #endif
 
@@ -1351,7 +1352,6 @@ void CkRegisterRestartHandler( )
 
 #if CMK_CONVERSE_MPI
   pingHandlerIdx = CkRegisterHandler((CmiHandler)pingHandler);
-  pingBackHandlerIdx = CkRegisterHandler((CmiHandler)pingBackHandler);
   pingCheckHandlerIdx = CkRegisterHandler((CmiHandler)pingCheckHandler);
   buddyDieHandlerIdx = CkRegisterHandler((CmiHandler)buddyDieHandler);
 
@@ -1370,6 +1370,13 @@ void CkRegisterRestartHandler( )
 #endif
 }
 
+
+extern "C"
+int CkHasCheckpoints()
+{
+  return checkpointed;
+}
+
 /// @todo: the following definitions should be moved to a separate file containing
 // structures and functions about fault tolerance strategies
 
index 3ca66a18976c18e5f9f8d55ebe49189393b8dd2b..3d5f989d673088c7fe3570aeb312d24c89ba322e 100644 (file)
@@ -117,6 +117,7 @@ void CkStartMemCheckpoint(CkCallback &cb);
 
 // true if inside a restarting phase
 extern "C" int CkInRestarting(); 
+extern "C" int CkHasCheckpoints();
 
 #if CMK_CONVERSE_MPI
 extern "C" void CkDieNow();