recover from soft failure
[charm.git] / src / ck-core / ckmemcheckpoint.h
1 #ifndef _CK_MEM_CHECKPT_
2 #define _CK_MEM_CHECKPT_
3
4 #include "CkMemCheckpoint.decl.h"
5
6 extern CkGroupID ckCheckPTGroupID;
7
8 class CkArrayCheckPTReqMessage: public CMessage_CkArrayCheckPTReqMessage {
9 public: 
10   CkArrayCheckPTReqMessage()  {}
11 };
12
13 class CkArrayCheckPTMessage: public CMessage_CkArrayCheckPTMessage {
14 public:
15         CkArrayID  aid;
16         CkGroupID  locMgr;
17         CkArrayIndex index;
18         double *packData;
19         int bud1, bud2;
20         int len;
21         int cp_flag;          // 1: from checkpoint 0: from recover
22 };
23
24 class CkCheckPTMessage: public CMessage_CkCheckPTMessage {
25 public:
26         double *packData;
27         int bud1, bud2;
28         int len;
29         int cp_flag;          // 1: from checkpoint 0: from recover
30 };
31
32 class CkProcCheckPTMessage: public CMessage_CkProcCheckPTMessage {
33 public:
34         int pe;
35         int reportPe;           // chkpt starter
36         int failedpe;
37         int cur_restart_phase;
38         int len;
39         char *packData;
40 };
41
42 // table entry base class
43 class CkCheckPTInfo {
44    friend class CkMemCheckPT;
45 protected:
46    CkArrayID aid;
47    CkGroupID locMgr;
48    CkArrayIndex index;
49    int pNo;   //another buddy
50 public:
51    CkCheckPTInfo();
52    CkCheckPTInfo(CkArrayID a, CkGroupID loc, CkArrayIndex idx, int pno):
53                   aid(a), locMgr(loc), index(idx), pNo(pno)   {}
54    virtual ~CkCheckPTInfo() {}
55    virtual void updateBuffer(CkArrayCheckPTMessage *data) = 0;
56    virtual CkArrayCheckPTMessage * getCopy() = 0;
57    virtual void updateBuddy(int b1, int b2) = 0;
58    virtual int getSize() = 0;
59 };
60
61 /// memory or disk checkpointing
62 #define CkCheckPoint_inMEM   1
63 #define CkCheckPoint_inDISK  2
64
65 class CkMemCheckPT: public CBase_CkMemCheckPT {
66 public:
67   CkMemCheckPT(int w);
68   CkMemCheckPT(CkMigrateMessage *m):CBase_CkMemCheckPT(m) {};
69   virtual ~CkMemCheckPT();
70   void pup(PUP::er& p);
71   inline int BuddyPE(int pe);
72   void doItNow(int sp, CkCallback &);
73   void restart(int diePe);
74   void removeArrayElements();
75   void createEntry(CkArrayID aid, CkGroupID loc, CkArrayIndex index, int buddy);
76   void recvData(CkArrayCheckPTMessage *);
77   void gotData();
78   void recvProcData(CkProcCheckPTMessage *);
79   void cpFinish();
80   void syncFiles(CkReductionMsg *);
81   void report();
82   void recoverBuddies();
83   void recoverEntry(CkArrayCheckPTMessage *msg);
84   void recoverArrayElements();
85   void quiescence(CkCallback &);
86   void resetReductionMgr();
87   void finishUp();
88   void gotReply();
89   void inmem_restore(CkArrayCheckPTMessage *m);
90   void updateLocations(int n, CkGroupID *g, CkArrayIndex *idx,int nowOnPe);
91   void resetLB(int diepe);
92   int  isFailed(int pe);
93   void pupAllElements(PUP::er &p);
94   void startArrayCheckpoint();
95   void recvArrayCheckpoint(CkArrayCheckPTMessage *m);
96   void recoverAll(CkArrayCheckPTMessage * msg, CkVec<CkGroupID> * gmap=NULL, CkVec<CkArrayIndex> * imap=NULL);
97   void startCheckpoint();
98   void doneComparison(bool);
99   void doneRComparison(bool);
100   void RollBack();
101   void recoverFromSoftFailure();
102 public:
103   static CkCallback  cpCallback;
104
105   static int inRestarting;
106   static int inLoadbalancing;
107   static double startTime;
108   static char*  stage;
109 private:
110   CkVec<CkCheckPTInfo *> ckTable;
111   CkArrayCheckPTMessage * chkpTable[2];
112
113   int recvCount, peCount;
114   int expectCount, ackCount;
115     /// the processor who initiate the checkpointing
116   int cpStarter;
117   CkVec<int> failedPes;
118   int thisFailedPe;
119
120     /// to use memory or disk checkpointing
121   int    where;
122 private:
123   inline int isMaster(int pe);
124
125   void failed(int pe);
126   int  totalFailed();
127
128   void sendProcData();
129 };
130
131 // called in initCharm
132 void CkMemRestart(const char *, CkArgMsg *);
133
134 // called by user applications
135 // to start a checkpointing
136 void CkStartMemCheckpoint(CkCallback &cb);
137
138 // true if inside a restarting phase
139 extern "C" int CkInRestarting(); 
140 extern "C" int CkInLdb(); 
141 extern "C" void CkSetInLdb(); 
142 extern "C" void CkResetInLdb();
143
144 extern "C" int CkHasCheckpoints();
145
146 extern "C" void CkDieNow();
147
148 #endif