67#include "fenix_exception.hpp"
68#include "fenix/data/subset.hpp"
111constexpr MlogRecoveryMode INLINE_AUTOSYNC =
123constexpr int STOREV_ALL = FENIX_STOREV_ALL;
125enum CallbackLocation { PRE_RECOVERY, POST_RECOVERY };
130 MPI_Comm in_comm = MPI_COMM_WORLD;
131 MPI_Comm* out_comm =
nullptr;
133 char*** argv =
nullptr;
142void set_option(
SettingName setting,
unsigned option);
148void throw_exception();
154Role role(MPI_Comm comm,
int rank);
157int n_ranks_with_role(
Role role);
165using FenixCallbackFunc = std::function<void(MPI_Comm,
int)>;
168int callback_register(
169 FenixCallbackFunc callback, CallbackLocation loc = POST_RECOVERY
173int callback_pop(CallbackLocation loc = POST_RECOVERY);
176int callback_invoke_all(CallbackLocation loc = POST_RECOVERY);
182std::vector<int> fail_list();
185int detect_failures(
bool recover =
true);
194int comm_revoke(MPI_Comm comm);
198namespace fenix::data {
200extern const DataSubset& SUBSET_FULL;
201extern const DataSubset& SUBSET_EMPTY;
202extern const DataSubset& SUBSET_PRESTAGED;
203extern DataSubset SUBSET_IGNORE;
207 int group_id, MPI_Comm comm,
int start_time_stamp,
int depth,
int policy_name,
208 void* policy_value,
int* flag
213 MPI_Comm comm = MPI_COMM_NULL;
214 int start_time_stamp = 0;
216 int policy_name = FENIX_DATA_POLICY_IMR;
217 void* policy_value =
nullptr;
223bool group_created(
int group_id);
227 int group_id,
int member_id,
void* buffer,
int count, MPI_Datatype datatype
231using SerializeFileFunc = std::function<void(FILE*,
int,
void*,
int,
int)>;
233using SerializeStreamFunc =
234 std::function<void(std::iostream&,
int,
void*,
int,
int)>;
236using SerializeFunc = std::variant<SerializeFileFunc, SerializeStreamFunc>;
240 int group_id,
int member_id,
void* buffer,
int count, MPI_Datatype datatype,
241 SerializeFunc serializer
246 int group_id,
int member_id,
void* buffer,
int count, MPI_Datatype datatype
250 int group_id,
int member_id,
void* buffer,
int count, MPI_Datatype datatype,
251 SerializeFunc serializer
255bool member_created(
int group_id,
int member_id);
258 int group_id,
int member_id,
int attr,
void* value,
int* flag
262 int group_id,
int member_id,
int attr,
void* value,
int* flag
267 int group_id,
int member_id,
const DataSubset& subset = SUBSET_FULL
271int member_stage_inplace(
272 int group_id,
int member_id,
void* buf,
const DataSubset& subset = SUBSET_FULL
276int member_stage_begin(
int group_id,
int member_id, FILE** fp);
278int member_stage_begin(
int group_id,
int member_id, std::iostream** stream);
281int member_stage_end(
int group_id,
int member_id);
285 int group_id,
int member_id,
const DataSubset& subset = SUBSET_FULL
288inline int member_store(
int group_id,
const DataSubset& subset = SUBSET_FULL) {
289 return member_store(group_id, FENIX_DATA_MEMBER_ALL, subset);
293int member_storev(
int group_id,
int member_id,
const DataSubset& subset);
295inline int member_storev(
int group_id,
const DataSubset& subset) {
296 return member_storev(group_id, FENIX_DATA_MEMBER_ALL, subset);
301 int group_id,
int member_id,
const DataSubset& subset,
Fenix_Request* request
305 int member_id = FENIX_DATA_MEMBER_ALL;
309inline int member_istore(
312 return member_istore(group_id, args.member_id, args.subset, request);
317 int group_id,
int member_id,
const DataSubset& subset,
Fenix_Request* request
320inline int member_istorev(
321 int group_id,
const DataSubset& subset,
Fenix_Request* request
323 return member_istorev(group_id, FENIX_DATA_MEMBER_ALL, subset, request);
327int member_repair(
int group_id,
int member_id);
331 int group_id,
int member_id,
int time_stamp = FENIX_DATA_SNAPSHOT_ALL,
332 DataSubset& data_found = SUBSET_IGNORE
337 int group_id,
int member_id,
void* target,
338 int target_count = FENIX_DATA_RESTORE_FULL,
339 int time_stamp = FENIX_DATA_SNAPSHOT_ALL,
340 DataSubset& data_found = SUBSET_IGNORE
344int member_load_begin(
345 int group_id,
int member_id, FILE** fp,
346 int time_stamp = FENIX_DATA_SNAPSHOT_LATEST,
347 DataSubset& data_found = SUBSET_IGNORE
351int member_load_begin(
352 int group_id,
int member_id, std::iostream** strm,
353 int time_stamp = FENIX_DATA_SNAPSHOT_LATEST,
354 DataSubset& data_found = SUBSET_IGNORE
358int member_load_end(
int group_id,
int member_id);
362 int group_id,
int member_id,
void* target_buffer = FENIX_DATA_RESTORE_INPLACE,
363 int max_length = FENIX_DATA_RESTORE_FULL,
364 int time_stamp = FENIX_DATA_SNAPSHOT_ALL,
365 DataSubset& data_found = SUBSET_IGNORE
369[[deprecated(
"Use member_load functions instead")]]
371 int group_id,
int member_id,
void* target_buffer = FENIX_DATA_RESTORE_INPLACE,
372 int max_length = FENIX_DATA_RESTORE_FULL,
373 int time_stamp = FENIX_DATA_SNAPSHOT_ALL,
374 DataSubset& data_found = SUBSET_IGNORE
378int commit(
int group_id,
int* time_stamp =
nullptr);
381int commit_barrier(
int group_id,
int* time_stamp =
nullptr);
385 int group_id,
const DataSubset& subset,
386 const std::vector<int>& storev_ids = {},
int* time_stamp = nullptr
391 int group_id,
const DataSubset& subset,
int* time_stamp =
nullptr
398std::optional<std::vector<int>> group_members(
int group_id);
404std::optional<std::vector<int>> group_snapshots(
int group_id);
407MPI_Group group_cohort(
int group_id);
410int snapshot_delete(
int group_id,
int timestamp);
413int group_delete(
int group_id);
416int member_delete(
int group_id,
int member_id);
420namespace fenix::mlog {
423int create(
int mlog_id, MPI_Comm& comm,
int depth);
426int activate(
int mlog_id);
432int begin_region(
int mlog_id,
int region_id);
435int activate(
int mlog_id,
int region_id);
438int sync(
int mlog_id,
int region_id = FENIX_MLOG_CONTINUE);
441int create_data_member(
int mlog_id,
int group_id,
int member_id);
444int define_data_member(
int mlog_id,
int group_id,
int member_id);
447int 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:277
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:322
Fenix_Resume_mode
Options for passing control back to application after recovery.
Definition fenix.h:250
Fenix_Recovery_mode
Options for recovering after a failed rank is detected.
Definition fenix.h:208
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:293
Fenix_Callback_exception_mode
Options for dealing with CommExceptions generated in callbacks.
Definition fenix.h:308
Fenix_Setting_name
Global Fenix settings.
Definition fenix.h:185
Fenix_Mlog_recovery_mode
Definition fenix.h:226
Fenix_Rank_role
All possible roles returned by Fenix_Init.
Definition fenix.h:169
@ FENIX_UNHANDLED_PRINT
Print error and continue without handling.
Definition fenix.h:281
@ FENIX_UNHANDLED_SILENT
Ignore unhandled errors.
Definition fenix.h:279
@ FENIX_UNHANDLED_ABORT
Print error and abort Fenix's world (default)
Definition fenix.h:283
@ FENIX_SPARE_FINALIZE_EXIT
Finalize MPI and exit (default),.
Definition fenix.h:326
@ FENIX_SPARE_FINALIZE_RELEASE
Continue from Fenix_Init with Fenix_Rank_role FENIX_RANK_ROLE_SPARE.
Definition fenix.h:324
@ FENIX_RESUME_THROW
Throw a fenix::CommException.
Definition fenix.h:268
@ FENIX_RESUME_JUMP
Return to Fenix_Init via longjmp (default)
Definition fenix.h:264
@ FENIX_RESUME_RETURN
Return the error code inline.
Definition fenix.h:266
@ FENIX_RECOVERY_IGNORE
Do not repair communicator, immediately resume per FENIX_RESUME_MODE.
Definition fenix.h:210
@ FENIX_RECOVERY_REPAIR
Repair the communicator with spares or by shrinking.
Definition fenix.h:218
@ FENIX_RECOVERY_SPAWN
<span class="mlabel"> UNIMPLEMENTED </span> As REPAIR, but attempt to respawn failed processes
Definition fenix.h:220
@ FENIX_RECOVERY_NOOP
Do not repair communicator, otherwise behave normally.
Definition fenix.h:216
@ FENIX_SPARE_WAIT_YIELD
Tell MPI to yield this thread while waiting (if supported, else busy wait)
Definition fenix.h:297
@ FENIX_SPARE_WAIT_SLEEP
Sleep 100ms between checks to see if this thread is needed for recovery.
Definition fenix.h:299
@ FENIX_SPARE_WAIT_BUSY
Busy wait, consuming CPU time in exchange for faster response.
Definition fenix.h:295
@ FENIX_CALLBACK_EXCEPTION_SQUASH
CommExceptions from callbacks are squashed.
Definition fenix.h:312
@ FENIX_CALLBACK_EXCEPTION_RETHROW
CommExceptions are allowed to propagate out of callbacks.
Definition fenix.h:310
@ FENIX_RESUME_MODE
See Fenix_Resume_mode.
Definition fenix.h:189
@ FENIX_MLOG_RECOVERY_MODE
See Fenix_Mlog_recovery_mode.
Definition fenix.h:195
@ FENIX_SPARE_FINALIZE_MODE
See Fenix_Spare_finalize_mode.
Definition fenix.h:199
@ FENIX_SPARE_WAIT_MODE
See Fenix_Spare_wait_mode.
Definition fenix.h:197
@ FENIX_CALLBACK_EXCEPTION_MODE
See Fenix_Callback_exception_mode.
Definition fenix.h:193
@ FENIX_RECOVERY_MODE
See Fenix_Recovery_mode.
Definition fenix.h:187
@ FENIX_UNHANDLED_MODE
See Fenix_Unhandled_mode.
Definition fenix.h:191
@ FENIX_MLOG_RECOVERY_MANUAL
All message logging recovery is manual.
Definition fenix.h:228
@ FENIX_MLOG_RECOVERY_INLINE_AUTOSYNC
As INLINE, but automatically sync logs with FENIX_MLOG_CONTINUE.
Definition fenix.h:242
@ FENIX_MLOG_RECOVERY_INLINE
Automatically repeats failed, logged MPI operations without disrupting normal application control flo...
Definition fenix.h:235
@ FENIX_ROLE_SPARE_RANK
This rank was a spare when Fenix finalized.
Definition fenix.h:177
@ FENIX_ROLE_RECOVERED_RANK
This rank was a spare before the most recent failure, or was just spawned.
Definition fenix.h:173
@ FENIX_ROLE_INITIAL_RANK
No failures have occurred yet.
Definition fenix.h:171
@ FENIX_ROLE_SURVIVOR_RANK
This rank was not a spare before the most recent failure.
Definition fenix.h:175
@ FENIX_ROLE_FAILED_RANK
This rank no longer exists (process failed)
Definition fenix.h:179
<span class="mlabel"> UNIMPLEMENTED </span> As MPI_Request, but for Fenix asynchronous data recove...
Definition fenix.h:634
Definition subset.hpp:152