Making changes to fault injector
authorNikhil Jain <nikhil@illinois.edu>
Thu, 27 Dec 2012 07:29:44 +0000 (01:29 -0600)
committerNikhil Jain <nikhil@illinois.edu>
Thu, 27 Dec 2012 07:29:44 +0000 (01:29 -0600)
src/ck-core/ckfaultinjector.C
src/ck-core/ckfaultinjector.h

index 05920bf32ac74ccd4573c7ab9d6cf962c878fe52..155360504985a16774c5df96aec1a58b1464e99d 100644 (file)
@@ -51,8 +51,11 @@ extern "C" {
   }
 
   void FI_injectFault() {
-    CpvAccess(faultInjector)->injectFault();
     CpvAccess(faultInjector)->injected = 0;
+    int rand_num = rand_r(&CpvAccess(faultInjector)->globalSeed);
+    if((rand_num%CkNumPes() == CkMyPe()) && (rand_num%CmiNumPartition() == CmiMyPartition())) {
+      CpvAccess(faultInjector)->injectFault();
+    }
     if(CpvAccess(faultInjector)->inject) {
       CcdCallFnAfter((CcdVoidFn)FI_injectFault, NULL, CpvAccess(faultInjector)->fault_period*1000);
       CpvAccess(faultInjector)->injected = 1;
@@ -69,6 +72,8 @@ FaultInjector::FaultInjector(char **argv) : fault_period(DEFAULT_FAULT_PERIOD),
     inject = 1;
     CcdCallFnAfter((CcdVoidFn)FI_injectFault, NULL, fault_period*1000);
     injected = 1;
+    globalSeed = 3877;
+    localSeed = CkMyPe();
   }
 }
 
@@ -107,36 +112,32 @@ void FaultInjector::startInjection() {
 void FaultInjector::injectFault() {
   //check if we have registered memory regions
 #if FI_DEBUG
-  printf("[%d] Fault injection attempted\n",CmiMyPe());
+  printf("[%d-%d] Fault injection attempted\n",CmiMyPartition(),CmiMyPe());
 #endif
   if(!userZones.size()) return;
 
   //if not select a random memory region
-  int target = rand() % userZones.size();
+  int target = rand_r(&localSeed) % userZones.size();
 
   //in the target select a memory space
-  CmiUInt8 memory = rand() % userZones[target].length;
+  CmiUInt8 memory = rand_r(&localSeed) % userZones[target].length;
 
   char *location = (char*)userZones[target].start + memory;
+  
+  int offset = rand_r(&localSeed) % 8;
+
+  unsigned char bugger = 0xFF;
+  bugger = bugger ^ ((unsigned char)1<<offset);
 
 #if FI_DEBUG
-  printf("[%d] Injecting Fault at %d on %llu, size %d\n",CmiMyPe(),target,memory,userZones.size());
+  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());
 #endif
-  if(*location & 1) {
-    *location = *location & 0xFE;
+  if(*location & ((unsigned char)1<<offset)) {
+    *location = *location & bugger;
   }else{
-    *location = *location | 0x1;
+    *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());
+#endif
 }
-
-
-
-
-
-
-
-
-
-
-
index 6978fda52581786ef48b0545472debda4973325d..b9377e855ca777efd77273328979ec48808a8e04 100644 (file)
@@ -11,7 +11,7 @@
 #include "converse.h"
 #include <vector>
 
-#define DEFAULT_FAULT_PERIOD 10 //in seconds
+#define DEFAULT_FAULT_PERIOD 2 //in seconds
 
 using namespace std;
 
@@ -28,6 +28,8 @@ typedef struct FaultInjector {
   int fault_period; //in seconds
   int inject;       //whether to inject
   int injected;     //is call back set for injection?
+  unsigned int globalSeed; //seed to decide which processor get the fault
+  unsigned int localSeed; //seed to decide where to inject fault
 
   FaultInjector(char **argv);