changes for fault injector
authorXiang Ni <xiangni2@illinois.edu>
Wed, 9 Jan 2013 05:27:47 +0000 (23:27 -0600)
committerXiang Ni <xiangni2@illinois.edu>
Wed, 9 Jan 2013 05:27:47 +0000 (23:27 -0600)
src/ck-core/ckfaultinjector.C
src/ck-core/ckfaultinjector.h
src/ck-core/ckmemcheckpoint.C
src/util/pup.h
src/util/pup_util.C

index 20b8b68b577c29d45f4362a598eb7e72894869e1..3fbe2795e96c3871988f4ca439e75f837ec55e7a 100644 (file)
@@ -8,6 +8,7 @@
 #include "ckfaultinjector.h"
 #include <vector>
 #include "charm++.h"
+#include <sys/time.h>
 
 using namespace std;
 
@@ -57,10 +58,10 @@ extern "C" {
       CpvAccess(faultInjector)->injectFault();
     }
 //     FI_stopInjection();
-    if(CpvAccess(faultInjector)->inject) {
/*   if(CpvAccess(faultInjector)->inject) {
       CcdCallFnAfter((CcdVoidFn)FI_injectFault, NULL, CpvAccess(faultInjector)->fault_period*1000);
       CpvAccess(faultInjector)->injected = 1;
-    }
+    }*///TODO test only to inject one failure
   }
 }
 
@@ -71,10 +72,17 @@ FaultInjector::FaultInjector(char **argv) : fault_period(DEFAULT_FAULT_PERIOD),
 #endif
   if(CmiGetArgFlagDesc(argv, "+inj_fault", "Inject Fault")) {
     inject = 1;
-    CcdCallFnAfter((CcdVoidFn)FI_injectFault, NULL, fault_period*1000);
+    CmiGetArgInt(argv, "+inj_period", &fault_period);
+    //CcdCallFnAfter((CcdVoidFn)FI_injectFault, NULL, fault_period*1000);
     injected = 1;
-    globalSeed = 3877;
-    localSeed = CkMyPe();
+    int seed = 3877;
+    if(!CmiGetArgInt(argv, "+inj_seed",&seed)){
+      timeval tm;
+      gettimeofday(&tm,NULL);
+      seed = tm.tv_sec;
+    }
+    globalSeed = seed%1000;
+    localSeed = CkMyPe()*globalSeed;
   }
 }
 
@@ -82,7 +90,7 @@ int FaultInjector::registerRegion(void *_start, CmiUInt8 _length) {
   MemRegion region(_start,_length);
   userZones.push_back(region);
 #if FI_DEBUG
-//  printf("[%d] Adding memory region, size %d\n",CmiMyPe(),userZones.size());
+  //printf("[%d] Adding memory region %p %p, %p %p, size %d\n",CmiMyPe(),_start,length,region.start,region.length ,userZones.size());
 #endif
   return userZones.size() - 1;
 }
@@ -92,7 +100,7 @@ void FaultInjector::deregisterRegion(void *_start) {
     if(userZones[i].start == _start) {
       userZones.erase(userZones.begin()+i);
 #if FI_DEBUG
-      printf("[%d] Deleting memory region, size %d\n",CmiMyPe(),userZones.size());
+//      printf("[%d] Deleting memory region, size %d\n",CmiMyPe(),userZones.size());
 #endif
     }
   }
@@ -118,20 +126,24 @@ void FaultInjector::injectFault() {
   if(!userZones.size()) return;
 
   //if not select a random memory region
-  int target = rand_r(&localSeed) % userZones.size();
+  //unsigned int seed = localSeed * CmiWallTimer();
+  unsigned int seed = localSeed;
+  int target = rand_r(&seed) % userZones.size();
 
+ // seed = seed* CmiWallTimer();
   //in the target select a memory space
-  CmiUInt8 memory = rand_r(&localSeed) % userZones[target].length;
+  CmiUInt8 memory = rand_r(&seed) % userZones[target].length;
 
   char *location = (char*)userZones[target].start + memory;
   
-  int offset = rand_r(&localSeed) % 8;
+//  seed = seed* CmiWallTimer();
+  int offset = rand_r(&seed) % 8;
 
   unsigned char bugger = 0xFF;
   bugger = bugger ^ ((unsigned char)1<<offset);
 
 #if FI_DEBUG
-  printf("[%d-%d] Injecting Fault in zone %d at memory %llu offset %d, value %X size %d\n",CmiMyPartition(),CmiMyPe(),target,memory,offset,(int)*location,userZones.size());
+  printf("[%d-%d] Injecting Fault in zone %d at memory %p offset %d, value %X size %d\n",CmiMyPartition(),CmiMyPe(),target,location,offset,(int)*location,userZones.size());
 #endif
   if(*location & ((unsigned char)1<<offset)) {
     *location = *location & bugger;
@@ -139,6 +151,6 @@ void FaultInjector::injectFault() {
     *location = *location | ((unsigned char)1<<offset);
   }
 #if FI_DEBUG
-  printf("[%d-%d] Injected Fault in zone %d at memory %llu offset %d, value %X size %d\n",CmiMyPartition(),CmiMyPe(),target,memory,offset,(int)*location,userZones.size());
+  printf("[%d-%d] Injected Fault in zone %d at memory %p offset %d, value %X size %d\n",CmiMyPartition(),CmiMyPe(),target,location,offset,(int)*location,userZones.size());
 #endif
 }
index 45f016be27394930485f33c196f841e029a08cd5..6cb951127ffca2d4bbbbaf2653bb15d2fd4d8f6e 100644 (file)
@@ -11,7 +11,7 @@
 #include "converse.h"
 #include <vector>
 
-#define DEFAULT_FAULT_PERIOD 50 //in seconds
+#define DEFAULT_FAULT_PERIOD 5 //in seconds
 
 using namespace std;
 
index 7bb9b8cf36cb33d44b056d7fc41a85db9cef4489..1506822240cd66af53b397382715203e34fcd186 100644 (file)
@@ -807,7 +807,7 @@ void CkMemCheckPT::startCheckpoint(){
 void CkMemCheckPT::doneComparison(bool ret){
   int _ret = 1;
   if(!ret){
-    //CkPrintf("[%d][%d] fail in doneComparison \n", CmiMyPartition(),CkMyPe());
+    CkPrintf("[%d][%d] fail in doneComparison \n", CmiMyPartition(),CkMyPe());
     _ret = 0;
   }else{
     _ret = 1;
@@ -1662,7 +1662,12 @@ void CkMemCheckPT::RollBack(){
       }
       if(CkMyPe()==0)
         CmiPrintf("[%d][%d]local comparison done at %lf\n",CmiMyPartition(),CkMyPe(),CmiWallTimer());
-      return pchecker.getResult();
+      int fault_num = pchecker.getFaultNum();
+      bool result = pchecker.getResult();
+      if(!result){
+        CmiPrintf("[%d][%d]fault region %d\n",CmiMyPartition(),CkMyPe(),fault_num);
+      }
+      return result;
     }
     int getChecksum(char * buf){
       PUP::checker pchecker(buf);
index d18fbef8cfd95a990f7cb31c9451ba8b20685174..1399040938a5c438b6f0cd2e2aec2f1791ac3ade 100644 (file)
@@ -429,9 +429,10 @@ namespace PUP {
       bool reset;
       bool calCheck;
       long long offset;
+      int fault_bytes;
     public:
-      checker(void * Abuf, void * Bbuf):er(IS_CHECKING),origBuf((myByte *)Abuf),buf((myByte *)Bbuf),_skip(true),accuracy(0.0),result(true),reset(false),calCheck(false) {}
-      checker(void * Abuf):er(IS_CALCHECKING),origBuf((myByte *)Abuf),buf((myByte *)Abuf),_skip(true),accuracy(0.0),result(true),reset(false),calCheck(true),sum1(0),sum2(0) {}
+      checker(void * Abuf, void * Bbuf):er(IS_CHECKING),origBuf((myByte *)Abuf),buf((myByte *)Bbuf),_skip(true),accuracy(0.0),result(true),reset(false),calCheck(false), fault_bytes(0) {}
+      checker(void * Abuf):er(IS_CALCHECKING),origBuf((myByte *)Abuf),buf((myByte *)Abuf),_skip(true),accuracy(0.0),result(true),reset(false),calCheck(true),sum1(0),sum2(0),fault_bytes(0) {}
       virtual void impl_startSeek(seekBlock &s); /*Begin a seeking block*/
       virtual int impl_tell(seekBlock &s); /*Give the current offset*/
       virtual void impl_seek(seekBlock &s,int off); /*Seek to the given offset*/
@@ -484,6 +485,7 @@ namespace PUP {
 
       bool getResult() {return result;}        
       int getChecksum() {return (sum2<<8)|sum1;}
+      int getFaultNum(){return fault_bytes;}
   };
 
   //For packing into a preallocated, presized memory buffer
index 2d0de617e9801f7a5665d3c19370432dd32c8d06..0839d2c1c4525ee415688ba227de65e2399edaf4 100644 (file)
@@ -159,6 +159,7 @@ void PUP::checker::bytes(void * p,int n,size_t itemSize,dataType t)
                   printf("found incorrect double %e %e diff %e\n",p1[i],p2[i],(p1[i]-p2[i]));
                 }       
                 result = result && false;
+                fault_bytes++;
               }
             }
           }    
@@ -175,6 +176,7 @@ void PUP::checker::bytes(void * p,int n,size_t itemSize,dataType t)
                 if(result)
                   printf("found incorrect int %d %d at %d total %d\n",p1[i],p2[i],i,n/itemSize);
                 result = result && false;
+                fault_bytes++;
               }
             }
           }
@@ -191,6 +193,7 @@ void PUP::checker::bytes(void * p,int n,size_t itemSize,dataType t)
                 if(result)
                   printf("found incorrect char %d %d at %d, total %d\n",p1[i],p2[i],i,n/itemSize);
                 result = result && false;
+                fault_bytes++;
               }
             }
           }