Initialize.
13 {
15 m_env = std::make_unique<mpi3::environment>(mpi3::thread_level::multiple);
16
17 if (
m_env->thread_support() != mpi3::thread_level::multiple) {
18 ATH_MSG_ERROR(
"MPI_THREAD_MULTIPLE is required but unavailable");
19 return StatusCode::FAILURE;
20 }
22
23
24 char version_string[MPI_MAX_LIBRARY_VERSION_STRING];
25 int version_string_len;
26 MPI_Get_library_version(version_string, &version_string_len);
29
32 << " ranks! This is insufficient!");
33 return StatusCode::FAILURE;
34 }
40 if (std::getenv(
"RANK") != std::to_string(
m_rank)) {
41 const char* env_rank = std::getenv("RANK");
43 << ") does not match $RANK = " << env_rank);
44 }
45
47 m_mpiLog->createStatement(
"PRAGMA foreign_keys = ON").run();
48
50 ->createStatement(
51 "CREATE TABLE ranks (rank INTEGER PRIMARY KEY, "
52 "node TEXT, start_time FLOAT, end_time FLOAT)")
53 .run();
55 ->createStatement(
56 "INSERT INTO ranks (rank, node, start_time) "
57 "VALUES(?1, ?2, julianday('now'))")
60 ->createStatement(
61 "CREATE TABLE files (fileId INTEGER PRIMARY KEY, fileName TEXT)")
62 .run();
64 ->createStatement(
65 "CREATE TABLE event_log (rank INTEGER, id INTEGER UNIQUE,"
66 "inputFileId INTEGER,"
67 "runNumber INTEGER, eventNumber INTEGER, complete INTEGER,"
68 "status INTEGER, request_time_ns INTEGER, start_time FLOAT,"
69 "end_time FLOAT, PRIMARY KEY (runNumber, eventNumber, id), "
70 "FOREIGN KEY (rank) REFERENCES ranks(rank),"
71 "FOREIGN KEY (inputFileId) REFERENCES files(fileId))")
72 .run();
74 "INSERT INTO event_log(id, rank, inputFileId, runNumber, eventNumber, "
75 "complete, "
76 "start_time, request_time_ns) "
77 "VALUES(?1, ?4, ?6, ?2, ?3, 0, julianday('now'), ?5)");
79 "UPDATE event_log SET complete = 1, status = ?4, end_time = "
80 "julianday('now') WHERE runNumber = ?2 "
81 "AND eventNumber = ?3 AND id = ?1");
83 "INSERT INTO files (fileId, fileName) VALUES(?1, ?2)");
84
85
86 ServiceHandle<IIncidentSvc> incsvc(
"IncidentSvc", this->
name());
87 if (!incsvc.retrieve().isSuccess()) {
89 return (StatusCode::FAILURE);
90 }
91 incsvc->addListener(this, IncidentType::BeginInputFile, 100);
92 incsvc->addListener(this, IncidentType::BeginProcessing, 100);
93
94 return StatusCode::SUCCESS;
95}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
std::unique_ptr< mpi3::environment > m_env
SQLite::Statement m_mpiLog_addEvent
SQLite::Statement m_mpiLog_completeEvent