AlgErrorAuditor.cpp
Go to the documentation of this file.
1 #include "AlgErrorAuditor.h"
5 
7 
8 AlgErrorAuditor::AlgErrorAuditor(const std::string& name, ISvcLocator* pSvcLocator)
9  : Auditor(name, pSvcLocator), m_error(0), m_fatal(0) {
10 
11  declareProperty( "Abort", m_abort = false,
12  "Abort job upon illegal Algorithm return code");
13  declareProperty( "Throw", m_throw = false,
14  "Throw GaudiException upon illegal Algorithm return code");
15 }
16 
17 void
21 }
22 
25 
26  if (m_abort && m_throw) {
27  info() << "Both \"Throw\" and \"Abort\" options have been set."
28  << " Abort takes precedence." << endmsg;
29  }
30 
31  return StatusCode::SUCCESS;
32 }
33 
34 
35 void
37 
38  bool fail(false);
39  if (msgSvc()->messageCount(MSG::ERROR) != m_error && ! sc.isRecoverable() ) {
41  os << "Illegal Return Code: Algorithm " << alg->name()
42  << " reported an ERROR, but returned a StatusCode \"" << sc << "\"";
43  os << std::endl << "Error policy described in "
44  << "https://twiki.cern.ch/twiki/bin/view/AtlasComputing/ReportingErrors";
45 
46  error() << os.str() << endmsg;
47  incrMap(alg->name(), 0);
48  fail = true;
49 
50  if (m_throw && ! m_abort) {
51  throw GaudiException(os.str(),"AlgErrorAuditor",0);
52  }
53  }
54 
56  sc != StatusCode::FAILURE ) {
58  os << "Illegal Return Code: Algorithm " << alg->name()
59  << " reported a FATAL, but returned a StatusCode \"" << sc << "\"";
60  os << std::endl << "Error policy described in "
61  << "https://twiki.cern.ch/twiki/bin/view/AtlasComputing/ReportingErrors";
62 
63  error() << os.str() << endmsg;
64  incrMap(alg->name(), 1);
65  fail = true;
66 
67  if (m_throw && ! m_abort) {
68  throw GaudiException(os.str(),"AlgErrorAuditor",0);
69  }
70 
71  }
72 
73  if (fail && m_abort) {
74  abort();
75  }
76 
77 }
78 
81 
82 
83  if (m_algMap[0].size() != 0) {
84  info() << "Found " << m_algMap[0].size()
85  << " instances where an Algorithm::execute() produced an ERROR "
86  << "but returned a SUCCESS:" << std::endl;
87 
88  for (const auto& i : m_algMap[0] ) {
89  msgStream() << i.first << ": " << i.second << std::endl;
90  }
91 
92  msgStream() << endmsg;
93  }
94 
95  if (m_algMap[1].size() != 0) {
96  info() << "Found " << m_algMap[1].size()
97  << " instances where an Algorithm::execute() produced a FATAL "
98  << "but returned a SUCCESS:" << std::endl;
99 
100  for (const auto& i : m_algMap[1]) {
101  msgStream() << i.first << ": " << i.second << std::endl;
102  }
103 
104  msgStream() << endmsg;
105  }
106  return StatusCode::SUCCESS;
107 }
108 
109 void
111  auto i=m_algMap[level].find(alg);
112  if ( i != m_algMap[level].end()) {
113  i->second++;
114  } else {
115  m_algMap[level].emplace( alg,1 );
116  }
117 }
Define general base for Gaudi exception.
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition: ISvcLocator.h:25
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
std::map< std::string, int > m_algMap[2]
Monitors the cpu time usage of each algorithm.
T endl(T...args)
STL namespace.
virtual void beforeExecute(INamedInterface *alg)
virtual StatusCode finalize()
BooleanProperty m_abort
#define DECLARE_COMPONENT(type)
Definition: PluginService.h:36
STL class.
virtual const std::string & name() const =0
Retrieve the name of the instance.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
void incrMap(const std::string &algName, int level)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
virtual int messageCount(MSG::Level level) const =0
Get the number of messages issued at a particular level.
auto end(reverse_wrapper< T > &w)
Definition: reverse.h:47
bool isRecoverable() const
Definition: StatusCode.h:87
IInterface compliant class extending IInterface with the name() method.
T find(T...args)
T size(T...args)
virtual void afterExecute(INamedInterface *alg, const StatusCode &)
BooleanProperty m_throw
virtual StatusCode initialize()
T emplace(T...args)
MsgStream & msgStream() const
Return an uninitialized MsgStream.
SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
list i
Definition: ana.py:128
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
Base class from which all concrete auditor classes should be derived.
Definition: Auditor.h:35