41static std::mutex &faults_sync()
50 static std::map<int32_t, Fault> map;
64 std::cout << std::string(
"Called etiss::fault::Stressor::loadXML(file=") + file + std::string(
")") << std::endl;
66 etiss::log(
etiss::INFO, std::string(
"Called etiss::fault::Stressor::loadXML(file=") + file + std::string(
")"));
72 std::vector<Fault> fault_definitions;
73 std::vector<FaultRef> initial_faults;
77 in.open(file.c_str());
81 std::cout <<
"etiss::fault::Stressor::loadXML(): Failed open file " << file << std::endl;
84 std::string(
" Failed to open Trigger file ") + file);
88 pugi::xml_document doc;
93 std::cout <<
"etiss::fault::Stressor::loadXML: Failed parse file " << file << std::endl;
96 std::string(
"etiss::fault::Stressor::loadXML:") + std::string(
" Failed to parse file ") + file);
101 xml::Diagnostics diag;
105 std::stringstream ss;
108 std::cout <<
"etiss::fault::Stressor::loadXML: Failed parse Fault definitions " << ss << std::endl;
111 std::string(
" Failed parse Fault definitions ") + ss.str());
119 for (
const auto &fdef : fault_definitions)
124 std::cout <<
"etiss::fault::Stressor::loadXML: Failed to add Fault definitions: " << fdef.name_
128 std::string(
"etiss::fault::Stressor::loadXML:") +
129 std::string(
" Failed to add Fault definitions "),
138 std::stringstream ss;
141 std::cout <<
"etiss::fault::Stressor::loadXML: Failed parse initial Faults " << ss << std::endl;
144 std::string(
" Failed parse initial Faults ") + ss.str());
149 for (
const auto &fref : initial_faults)
154 std::cout <<
"etiss::fault::Stressor::loadXML: Failed to add initial Fault: " << fref.name_ << std::endl;
157 std::string(
"etiss::fault::Stressor::loadXML:") + std::string(
" Failed to add initial Fault "),
171 std::cout <<
"etiss::fault::Stressor::addFaultDefinition called." << std::endl;
177 std::map<int32_t, Fault>::iterator find =
faults().find(f.
id_);
178 if (find !=
faults().end())
181 std::cout <<
"etiss::fault::Stressor::addFaultDefinition: Fault definition already registered:" << f.
toString()
185 std::string(
"etiss::fault::Stressor::addFaultDefinition:") +
186 std::string(
" Fault definition already registered: "),
193 faults().insert(std::pair<int32_t, Fault>(f.
id_, f));
201#if CXX0X_UP_SUPPORTED
203 std::lock_guard<std::mutex> lock(faults_sync());
209 std::map<int32_t, Fault>::iterator find =
faults().find(f.
id_);
210 if (find ==
faults().end())
213 std::cout <<
"etiss::fault::Stressor::addFault: Fault not registered in Fault definitions:" << f.
toString()
217 std::string(
"etiss::fault::Stressor::addFault:") +
218 std::string(
" Fault not registered in Fault definitions. "),
225 for (
const auto &trigger : f.
triggers)
228 if (trigger.getType() != +etiss::fault::Trigger_Type::NOP)
230 iptr = trigger.getInjector();
235 std::cout <<
"etiss::fault::Stressor::addFault: Added trigger: " << trigger.toString() << std::endl;
238 std::string(
"etiss::fault::Stressor::addFault:") + std::string(
" Added trigger: "), trigger);
245 std::cout <<
"etiss::fault::Stressor::addFault: Error: Injector not found for: " << trigger.toString()
249 std::string(
"etiss::fault::Stressor::addFault:") + std::string(
" Injector not found for "),
258 std::string(
" Trigger is a NOP and is not added."));
264 for (
const auto &it : f.
actions)
266 if (it.is_action_on_field())
268 bool ret_update =
false;
269 std::string errormsg;
285#if CXX0X_UP_SUPPORTED
287 std::lock_guard<std::mutex> lock(faults_sync());
293 std::map<int32_t, Fault>::iterator find =
faults().find(f.
id_);
294 if (find ==
faults().end())
297 std::cout <<
"etiss::fault::Stressor::removeFault: Fault not registered in Fault definitions:" << f.
toString()
301 std::string(
"etiss::fault::Stressor::removeFault:") +
302 std::string(
" Fault not registered in Fault definitions. "),
309 for (
const auto &trigger : f.
triggers)
312 if (trigger.getType() != +etiss::fault::Trigger_Type::NOP)
314 iptr = trigger.getInjector();
319 std::cout <<
"etiss::fault::Stressor::removeFault: Removed trigger: " << trigger.toString()
323 std::string(
"etiss::fault::Stressor::removeFault:") + std::string(
" Removed trigger: "),
331 std::cout <<
"etiss::fault::Stressor::removeFault: Error: Injector not found for: "
332 << trigger.toString() << std::endl;
335 std::string(
"etiss::fault::Stressor::removeFault:") +
336 std::string(
" Injector not found for "),
345 std::string(
" Trigger is a NOP and is does not need to be removed."));
356#if CXX0X_UP_SUPPORTED
357 std::lock_guard<std::mutex> lock(faults_sync());
361 std::map<int32_t, Fault>::iterator find =
faults().find(fault_id);
362 if (find !=
faults().end())
365 for (std::vector<etiss::fault::Action>::iterator iter = find->second.actions.begin();
366 iter != find->second.actions.end(); ++iter)
368 switch (iter->getType())
370 case +etiss::fault::Action_Type::INJECTION:
371 if (!iter->getFaultRef().is_set())
374 if (!iter->getFaultRef().resolve_reference())
379 "Stressor::firedTrigger: Injected Fault reference not found in fault definitions."),
380 iter->getFaultRef());
383 addFault(iter->getFaultRef().get_fault(),
true);
385 case +etiss::fault::Action_Type::EJECTION:
387 if (!iter->getFaultRef().is_set())
390 if (!iter->getFaultRef().resolve_reference())
395 "Stressor::firedTrigger: Injected Fault reference not found in fault definitions."),
396 iter->getFaultRef());
399 removeFault(iter->getFaultRef().get_fault(),
true);
401 case +etiss::fault::Action_Type::NOP:
403 std::string(
"Stressor::firedTrigger: Discarded - Action is NOP (do not care)."));
406 case +etiss::fault::Action_Type::EVENT:
413 if (iter->getInjectorAddress().getInjector())
415#if CXX0X_UP_SUPPORTED
416 if (iter->getInjectorAddress().getInjector().get() != injector)
418 if (iter->getInjectorAddress().getInjector() != injector)
423 std::string(
"etiss::fault::Stressor::firedTrigger: Action") +
424 std::string(
" injector is not the injector that triggered this event.") +
425 std::string(
" threadsafety must be ensured by user."),
426 find->second, *iter);
430 bool ret_applyaction =
431 iter->getInjectorAddress().getInjector()->applyAction(find->second, *iter, err);
432 if (!ret_applyaction)
435 std::cout <<
"Stressor::firedTrigger: Failed to apply action. Fault: " << fault_id <<
" ["
436 << err <<
"]" << std::endl;
439 find->second, *iter, err);
442 ret = ret && ret_applyaction;
448 std::cout <<
"Stressor::firedTrigger: Failed to find action target. Fault: " << fault_id
452 find->second, *iter);
462 std::cout <<
"Stressor::firedTrigger: Failed to find triggered Fault: " << fault_id << std::endl;
464 etiss::log(
etiss::ERROR, std::string(
"Stressor::firedTrigger: Failed to find triggered Fault: "), fault_id);
473#if CXX0X_UP_SUPPORTED
474 std::lock_guard<std::mutex> lock(faults_sync());
contains an action class that describes actions associated with a fault
contains the fault container class that stores triggers and actions for fault injection
contains a simple class that represents and resolves injector addresses as used by triggers (
contains the fault injector interface class.
general configuration and logging
contains the stressor class that loads and activates faults.
contains the Trigger class that defines conditions under which actions of a Fault need to be applied.
contains XML related functions.
static __inline__ uint64_t
static __inline__ int32_t
std::string toString() const
operator<< can be used.
std::vector< Trigger > triggers
contains the triggers for this fault
std::vector< Action > actions
contains the actions for this fault
void removeTrigger(const Trigger &t, int32_t fault_id)
virtual bool update_field_access_rights(const etiss::fault::Action &action, std::string &errormsg)=0
Update the field of injector with access rights to allow action (used to get type of action).
void addTrigger(const Trigger &t, int32_t fault_id)
TODO specialized lists. e.g. time triggers should be sorted and only the earliest time should be chec...
static etiss::int32 event_code_
static bool loadXML(const std::string &file, const int coreID=0)
extracts faults out of the given xml file.
static bool removeFault(const Fault &f, bool injected_fault=false)
removes a fault's active triggers from their injectors, thus, deactivating the fault.
static bool addFault(const Fault &f, bool injected_fault=false)
activates a fault's triggers in their injectors
static bool addFaultDefinition(const Fault &f)
adds a fault to a static map that can be accessed by static std::map<int32_t,Fault> & faults().
static void clear()
clears the fault map.
static std::map< int32_t, Fault > & faults()
static map with all referencable faults.
static void set_event(etiss::int32 code)
static bool firedTrigger(const Trigger &firedTrigger, int32_t fault_id, Injector *injector, uint64_t time_ps)
Checks if the given trigger is valid and calls applyAction.
bool parseXML(pugi::xml_document &doc, std::istream &input, std::ostream &diagnostics_out=std::cout)
parse a XML document held in input stream and return as doc
void log(Verbosity level, std::string msg)
write log message at the given level.