67#include "fenix_exception.hpp"
68#include "fenix/data/subset.hpp"
110constexpr MlogRecoveryMode INLINE_AUTOSYNC =
122constexpr int STOREV_ALL = FENIX_STOREV_ALL;
124enum CallbackLocation { PRE_RECOVERY, POST_RECOVERY };
129 MPI_Comm in_comm = MPI_COMM_WORLD;
130 MPI_Comm* out_comm =
nullptr;
132 char*** argv =
nullptr;
141void set_option(
SettingName setting,
unsigned option);
147void throw_exception();
158using FenixCallbackFunc = std::function<void(MPI_Comm,
int)>;
161int callback_register(
162 FenixCallbackFunc callback, CallbackLocation loc = POST_RECOVERY
166int callback_pop(CallbackLocation loc = POST_RECOVERY);
169int callback_invoke_all(CallbackLocation loc = POST_RECOVERY);
175std::vector<int> fail_list();
178int detect_failures(
bool recover =
true);
187int comm_revoke(MPI_Comm comm);
191namespace fenix::data {
193extern const DataSubset& SUBSET_FULL;
194extern const DataSubset& SUBSET_EMPTY;
195extern const DataSubset& SUBSET_PRESTAGED;
196extern DataSubset SUBSET_IGNORE;
200 int group_id, MPI_Comm comm,
int start_time_stamp,
int depth,
int policy_name,
201 void* policy_value,
int* flag
206 MPI_Comm comm = MPI_COMM_NULL;
207 int start_time_stamp = 0;
209 int policy_name = FENIX_DATA_POLICY_IMR;
210 void* policy_value =
nullptr;
216bool group_created(
int group_id);
220 int group_id,
int member_id,
void* buffer,
int count, MPI_Datatype datatype
224using SerializeFileFunc = std::function<void(FILE*,
int,
void*,
int,
int)>;
226using SerializeStreamFunc =
227 std::function<void(std::iostream&,
int,
void*,
int,
int)>;
229using SerializeFunc = std::variant<SerializeFileFunc, SerializeStreamFunc>;
233 int group_id,
int member_id,
void* buffer,
int count, MPI_Datatype datatype,
234 SerializeFunc serializer
239 int group_id,
int member_id,
void* buffer,
int count, MPI_Datatype datatype
243 int group_id,
int member_id,
void* buffer,
int count, MPI_Datatype datatype,
244 SerializeFunc serializer
248bool member_created(
int group_id,
int member_id);
251 int group_id,
int member_id,
int attr,
void* value,
int* flag
255 int group_id,
int member_id,
int attr,
void* value,
int* flag
260 int group_id,
int member_id,
const DataSubset& subset = SUBSET_FULL
264int member_stage_inplace(
265 int group_id,
int member_id,
void* buf,
const DataSubset& subset = SUBSET_FULL
269int member_stage_begin(
int group_id,
int member_id, FILE** fp);
271int member_stage_begin(
int group_id,
int member_id, std::iostream** stream);
274int member_stage_end(
int group_id,
int member_id);
278 int group_id,
int member_id,
const DataSubset& subset = SUBSET_FULL
281inline int member_store(
int group_id,
const DataSubset& subset = SUBSET_FULL) {
282 return member_store(group_id, FENIX_DATA_MEMBER_ALL, subset);
286int member_storev(
int group_id,
int member_id,
const DataSubset& subset);
288inline int member_storev(
int group_id,
const DataSubset& subset) {
289 return member_storev(group_id, FENIX_DATA_MEMBER_ALL, subset);
294 int group_id,
int member_id,
const DataSubset& subset,
Fenix_Request* request
298 int member_id = FENIX_DATA_MEMBER_ALL;
302inline int member_istore(
305 return member_istore(group_id, args.member_id, args.subset, request);
310 int group_id,
int member_id,
const DataSubset& subset,
Fenix_Request* request
313inline int member_istorev(
314 int group_id,
const DataSubset& subset,
Fenix_Request* request
316 return member_istorev(group_id, FENIX_DATA_MEMBER_ALL, subset, request);
320int member_repair(
int group_id,
int member_id);
324 int group_id,
int member_id,
int time_stamp = FENIX_DATA_SNAPSHOT_ALL,
325 DataSubset& data_found = SUBSET_IGNORE
330 int group_id,
int member_id,
void* target,
331 int target_count = FENIX_DATA_RESTORE_FULL,
332 int time_stamp = FENIX_DATA_SNAPSHOT_ALL,
333 DataSubset& data_found = SUBSET_IGNORE
337int member_load_begin(
338 int group_id,
int member_id, FILE** fp,
339 int time_stamp = FENIX_DATA_SNAPSHOT_LATEST,
340 DataSubset& data_found = SUBSET_IGNORE
344int member_load_begin(
345 int group_id,
int member_id, std::iostream** strm,
346 int time_stamp = FENIX_DATA_SNAPSHOT_LATEST,
347 DataSubset& data_found = SUBSET_IGNORE
351int member_load_end(
int group_id,
int member_id);
355 int group_id,
int member_id,
void* target_buffer = FENIX_DATA_RESTORE_INPLACE,
356 int max_length = FENIX_DATA_RESTORE_FULL,
357 int time_stamp = FENIX_DATA_SNAPSHOT_ALL,
358 DataSubset& data_found = SUBSET_IGNORE
362[[deprecated(
"Use member_load functions instead")]]
364 int group_id,
int member_id,
void* target_buffer = FENIX_DATA_RESTORE_INPLACE,
365 int max_length = FENIX_DATA_RESTORE_FULL,
366 int time_stamp = FENIX_DATA_SNAPSHOT_ALL,
367 DataSubset& data_found = SUBSET_IGNORE
371int commit(
int group_id,
int* time_stamp =
nullptr);
374int commit_barrier(
int group_id,
int* time_stamp =
nullptr);
378 int group_id,
const DataSubset& subset,
379 const std::vector<int>& storev_ids = {},
int* time_stamp = nullptr
384 int group_id,
const DataSubset& subset,
int* time_stamp =
nullptr
391std::optional<std::vector<int>> group_members(
int group_id);
397std::optional<std::vector<int>> group_snapshots(
int group_id);
400MPI_Group group_cohort(
int group_id);
403int snapshot_delete(
int group_id,
int timestamp);
406int group_delete(
int group_id);
409int member_delete(
int group_id,
int member_id);
413namespace fenix::mlog {
416int create(
int mlog_id, MPI_Comm& comm,
int depth);
419int activate(
int mlog_id);
425int begin_region(
int mlog_id,
int region_id);
428int activate(
int mlog_id,
int region_id);
431int sync(
int mlog_id,
int region_id = FENIX_MLOG_CONTINUE);
434int create_data_member(
int mlog_id,
int group_id,
int member_id);
437int define_data_member(
int mlog_id,
int group_id,
int member_id);
440int mlog_delete(
int mlog_id);
Contains all API function calls and Fenix types. This is the only header file a user should include.
Fenix_Unhandled_mode
Options for dealing with 'unhandled' errors, e.g. invalid rank IDs.
Definition fenix.h:274
Fenix_Spare_finalize_mode
Options for what spare ranks should do when Fenix_Finalize is called. Must be set before Fenix_Init t...
Definition fenix.h:319
Fenix_Resume_mode
Options for passing control back to application after recovery.
Definition fenix.h:247
Fenix_Recovery_mode
Options for recovering after a failed rank is detected.
Definition fenix.h:205
Fenix_Spare_wait_mode
Options for how spare ranks wait to be needed. Must be set before Fenix_Init to take effect.
Definition fenix.h:290
Fenix_Callback_exception_mode
Options for dealing with CommExceptions generated in callbacks.
Definition fenix.h:305
Fenix_Setting_name
Global Fenix settings.
Definition fenix.h:182
Fenix_Mlog_recovery_mode
Definition fenix.h:223
Fenix_Rank_role
All possible roles returned by Fenix_Init.
Definition fenix.h:168
@ FENIX_UNHANDLED_PRINT
Print error and continue without handling.
Definition fenix.h:278
@ FENIX_UNHANDLED_SILENT
Ignore unhandled errors.
Definition fenix.h:276
@ FENIX_UNHANDLED_ABORT
Print error and abort Fenix's world (default)
Definition fenix.h:280
@ FENIX_SPARE_FINALIZE_EXIT
Finalize MPI and exit (default),.
Definition fenix.h:323
@ FENIX_SPARE_FINALIZE_RELEASE
Continue from Fenix_Init with Fenix_Rank_role FENIX_RANK_ROLE_SPARE.
Definition fenix.h:321
@ FENIX_RESUME_THROW
Throw a fenix::CommException.
Definition fenix.h:265
@ FENIX_RESUME_JUMP
Return to Fenix_Init via longjmp (default)
Definition fenix.h:261
@ FENIX_RESUME_RETURN
Return the error code inline.
Definition fenix.h:263
@ FENIX_RECOVERY_IGNORE
Do not repair communicator, immediately resume per FENIX_RESUME_MODE.
Definition fenix.h:207
@ FENIX_RECOVERY_REPAIR
Repair the communicator with spares or by shrinking.
Definition fenix.h:215
@ FENIX_RECOVERY_SPAWN
<span class="mlabel"> UNIMPLEMENTED </span> As REPAIR, but attempt to respawn failed processes
Definition fenix.h:217
@ FENIX_RECOVERY_NOOP
Do not repair communicator, otherwise behave normally.
Definition fenix.h:213
@ FENIX_SPARE_WAIT_YIELD
Tell MPI to yield this thread while waiting (if supported, else busy wait)
Definition fenix.h:294
@ FENIX_SPARE_WAIT_SLEEP
Sleep 100ms between checks to see if this thread is needed for recovery.
Definition fenix.h:296
@ FENIX_SPARE_WAIT_BUSY
Busy wait, consuming CPU time in exchange for faster response.
Definition fenix.h:292
@ FENIX_CALLBACK_EXCEPTION_SQUASH
CommExceptions from callbacks are squashed.
Definition fenix.h:309
@ FENIX_CALLBACK_EXCEPTION_RETHROW
CommExceptions are allowed to propagate out of callbacks.
Definition fenix.h:307
@ FENIX_RESUME_MODE
See Fenix_Resume_mode.
Definition fenix.h:186
@ FENIX_MLOG_RECOVERY_MODE
See Fenix_Mlog_recovery_mode.
Definition fenix.h:192
@ FENIX_SPARE_FINALIZE_MODE
See Fenix_Spare_finalize_mode.
Definition fenix.h:196
@ FENIX_SPARE_WAIT_MODE
See Fenix_Spare_wait_mode.
Definition fenix.h:194
@ FENIX_CALLBACK_EXCEPTION_MODE
See Fenix_Callback_exception_mode.
Definition fenix.h:190
@ FENIX_RECOVERY_MODE
See Fenix_Recovery_mode.
Definition fenix.h:184
@ FENIX_UNHANDLED_MODE
See Fenix_Unhandled_mode.
Definition fenix.h:188
@ FENIX_MLOG_RECOVERY_MANUAL
All message logging recovery is manual.
Definition fenix.h:225
@ FENIX_MLOG_RECOVERY_INLINE_AUTOSYNC
As INLINE, but automatically sync logs with FENIX_MLOG_CONTINUE.
Definition fenix.h:239
@ FENIX_MLOG_RECOVERY_INLINE
Automatically repeats failed, logged MPI operations without disrupting normal application control flo...
Definition fenix.h:232
@ FENIX_ROLE_SPARE_RANK
This rank was a spare when Fenix finalized.
Definition fenix.h:176
@ FENIX_ROLE_RECOVERED_RANK
This rank was a spare before the most recent failure, or was just spawned.
Definition fenix.h:172
@ FENIX_ROLE_INITIAL_RANK
No failures have occurred yet.
Definition fenix.h:170
@ FENIX_ROLE_SURVIVOR_RANK
This rank was not a spare before the most recent failure.
Definition fenix.h:174
<span class="mlabel"> UNIMPLEMENTED </span> As MPI_Request, but for Fenix asynchronous data recove...
Definition fenix.h:611
Definition subset.hpp:152