![]() |
|
|
Generated: 24 Nov 2008 |
00001 // $Id: HistorySvc.cpp,v 1.18 2008/06/04 12:35:15 marcocle Exp $ 00002 00003 #ifndef GAUDISVC_FASTHISTORYSVC_H 00004 #include "HistorySvc.h" 00005 #endif 00006 00007 #include "GaudiKernel/HistoryObj.h" 00008 00009 #include "GaudiKernel/JobHistory.h" 00010 #include "GaudiKernel/AlgorithmHistory.h" 00011 #include "GaudiKernel/AlgToolHistory.h" 00012 #include "GaudiKernel/DataHistory.h" 00013 #include "GaudiKernel/ServiceHistory.h" 00014 00015 #ifndef KERNEL_SVCFACTORY_H 00016 #include "GaudiKernel/SvcFactory.h" 00017 #endif 00018 #ifndef GAUDIKERNEL_ISVCLOCATOR_H 00019 #include "GaudiKernel/ISvcLocator.h" 00020 #endif 00021 00022 #include "GaudiKernel/System.h" 00023 #include "GaudiKernel/Bootstrap.h" 00024 #include "GaudiKernel/IAlgManager.h" 00025 #include "GaudiKernel/IAlgorithm.h" 00026 #include "GaudiKernel/Algorithm.h" 00027 #include "GaudiKernel/IAlgTool.h" 00028 #include "GaudiKernel/AlgTool.h" 00029 #include "GaudiKernel/IService.h" 00030 #include "GaudiKernel/IJobOptionsSvc.h" 00031 #include "GaudiKernel/IAppMgrUI.h" 00032 #include "GaudiKernel/IIncidentSvc.h" 00033 #include "GaudiKernel/IToolSvc.h" 00034 #include "GaudiKernel/ServiceHandle.h" 00035 00036 #include "GaudiKernel/IAlgContextSvc.h" 00037 00038 #include <iostream> 00039 #include <fstream> 00040 #include <sstream> 00041 #include <limits> 00042 00043 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00044 DECLARE_SERVICE_FACTORY(HistorySvc) 00045 00046 using namespace std; 00047 00048 // 00050 // 00051 00052 struct DHH { 00053 CLID id; 00054 std::string key; 00055 00056 DHH(const CLID& i, const std::string& k):id(i), key(k) {} 00057 00058 bool operator < ( DHH const &rhs ) const { 00059 if (id != rhs.id) { 00060 return (id < rhs.id); 00061 } else { 00062 return (key < rhs.key); 00063 } 00064 } 00065 }; 00066 00067 void fenv_dummy(char**) {} 00068 00069 HistorySvc::HistorySvc( const std::string& name, ISvcLocator* svc ) 00070 : Service( name, svc ), 00071 m_isInitialized(false), 00072 m_dump(false), 00073 p_algCtxSvc(0), 00074 m_jobHistory(0), 00075 m_outputFile(""), 00076 m_incidentSvc(0), 00077 m_log(msgSvc(), name ) 00078 00079 { 00080 declareProperty("Dump",m_dump); 00081 declareProperty("Activate", m_activate=true); 00082 declareProperty("OutputFile",m_outputFile); 00083 00084 // hack to bring in environ 00085 vector<string> envtmp = System::getEnv(); 00086 00087 } 00088 00089 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00090 00091 HistorySvc::~HistorySvc() { 00092 delete m_jobHistory; 00093 } 00094 00095 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00096 00097 StatusCode HistorySvc::reinitialize() { 00098 00099 clearState(); 00100 00101 m_state = Gaudi::StateMachine::OFFLINE; 00102 00103 return initialize(); 00104 00105 } 00106 00107 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00108 00109 void HistorySvc::clearState() { 00110 m_algs.clear(); 00111 std::map<const Algorithm*, AlgorithmHistory*>::iterator algitr; 00112 for (algitr = m_algmap.begin(); algitr != m_algmap.end(); ++algitr) { 00113 AlgorithmHistory* h = algitr->second; 00114 (const_cast<Algorithm*> (algitr->first))->release(); 00115 delete h; 00116 } 00117 m_algmap.clear(); 00118 00119 m_ialgtools.clear(); 00120 m_algtools.clear(); 00121 std::map<const AlgTool*, AlgToolHistory*>::iterator atitr; 00122 for (atitr=m_algtoolmap.begin(); atitr != m_algtoolmap.end(); ++atitr) { 00123 (const_cast<AlgTool*> (atitr->first))->release(); 00124 delete atitr->second; 00125 } 00126 m_algtoolmap.clear(); 00127 00128 m_svcs.clear(); 00129 std::map<const IService*, ServiceHistory*>::iterator svitr; 00130 for (svitr = m_svcmap.begin(); svitr != m_svcmap.end(); ++svitr) { 00131 (const_cast<IService*> (svitr->first))->release(); 00132 delete svitr->second; 00133 } 00134 m_svcmap.clear(); 00135 } 00136 00137 00138 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00139 00140 StatusCode HistorySvc::initialize() { 00141 00142 StatusCode status = Service::initialize(); 00143 m_log.setLevel( m_outputLevel.value() ); 00144 00145 if (status.isFailure()) { 00146 #ifndef NDEBUG 00147 m_log << MSG::DEBUG << "Failed to initialize the base class (Service)" 00148 << endreq; 00149 #endif 00150 return status; 00151 } 00152 00153 #ifndef NDEBUG 00154 m_log << MSG::DEBUG << "Initializing HistorySvc" << endreq; 00155 #endif 00156 00157 if (!m_activate) return StatusCode::SUCCESS; 00158 00159 static const bool CREATEIF(true); 00160 00161 if ( service("AlgContextSvc",p_algCtxSvc,CREATEIF).isFailure() ) { 00162 m_log << MSG::ERROR << "unable to get the AlgContextSvc" << endreq; 00163 return StatusCode::FAILURE; 00164 } 00165 00166 if (service("IncidentSvc", m_incidentSvc, CREATEIF).isFailure()) { 00167 m_log << MSG::ERROR << "unable to get the IncidentSvc" << endreq; 00168 return StatusCode::FAILURE; 00169 } 00170 00171 // create a weak dependency on the ToolSvc, so that it doesn't get deleted 00172 // before we're done with it in finalize 00173 if (ServiceHandle<IToolSvc>("ToolSvc/ToolSvc",name()).retrieve().isFailure()) { 00174 m_log << MSG::ERROR << "could not retrieve the ToolSvc handle !" 00175 << endreq; 00176 return StatusCode::FAILURE; 00177 } 00178 00179 // add listener to be triggered by first BeginEvent with low priority 00180 // so it gets called first 00181 const bool rethrow = false; 00182 const bool oneShot = true; // make the listener called only once 00183 m_incidentSvc->addListener(this,IncidentType::BeginEvent, 00184 std::numeric_limits<long>::min(),rethrow,oneShot); 00185 00186 m_isInitialized = true; 00187 00188 return StatusCode::SUCCESS; 00189 00190 } 00191 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00192 00193 StatusCode HistorySvc::captureState() { 00194 00195 if (m_jobHistory == 0) { 00196 m_jobHistory = new JobHistory; 00197 IJobOptionsSvc *jo; 00198 if (service("JobOptionsSvc",jo).isFailure()) { 00199 m_log << MSG::ERROR 00200 << "Could not get jobOptionsSvc - " 00201 << "not adding properties to JobHistory" << endreq; 00202 } else { 00203 00204 bool foundAppMgr(false); 00205 00206 std::vector<std::string> clients = jo->getClients(); 00207 std::vector<std::string>::const_iterator it; 00208 std::vector<const Property*>::const_iterator itr; 00209 for (it=clients.begin(); it!=clients.end(); ++it) { 00210 if (*it == "ApplicationMgr") { 00211 foundAppMgr = true; 00212 } 00213 const std::vector<const Property*> *props = jo->getProperties(*it); 00214 for (itr=props->begin(); itr != props->end(); ++itr) { 00215 m_jobHistory->addProperty( *it, *itr ); 00216 } 00217 } 00218 00219 if (!foundAppMgr) { 00220 IProperty *ap; 00221 if (service("ApplicationMgr",ap).isFailure()) { 00222 m_log << MSG::ERROR << "could not get the ApplicationMgr" << endreq; 00223 } else { 00224 std::vector<Property*>::const_iterator itr2; 00225 const std::vector<Property*> props = ap->getProperties(); 00226 for (itr2=props.begin(); itr2 != props.end(); ++itr2) { 00227 m_jobHistory->addProperty( "ApplicationMgr", *itr2 ); 00228 } 00229 } 00230 } 00231 00232 } 00233 } 00234 00236 00237 StatusCode sc; 00238 IAlgManager* algMgr = 0; 00239 sc = Gaudi::svcLocator()->queryInterface( IID_IAlgManager, 00240 pp_cast<void>(&algMgr) ); 00241 if (sc.isFailure()) { 00242 m_log << MSG::ERROR << "Could not get AlgManager" << endreq; 00243 return StatusCode::FAILURE; 00244 } else { 00245 00246 std::list<IAlgorithm*> algs; 00247 algs = algMgr->getAlgorithms(); 00248 std::list<IAlgorithm*>::const_iterator itr; 00249 for (itr=algs.begin(); itr!=algs.end(); ++itr) { 00250 Algorithm* alg = dynamic_cast<Algorithm*> (*itr); 00251 if (alg == 0) { 00252 m_log << MSG::WARNING << "Algorithm " << (*itr)->name() 00253 << " does not inherit from Algorithm. Not registering it." 00254 << endreq; 00255 } else { 00256 registerAlg( *alg ).ignore(); 00257 } 00258 } 00259 00260 m_log << MSG::INFO; 00261 m_log << "Registered " << algs.size() << " Algorithms" << endreq; 00262 00263 } 00264 00266 00267 m_isInitialized = true; 00268 std::set<const IAlgTool*>::const_iterator itra; 00269 for (itra = m_ialgtools.begin(); itra != m_ialgtools.end(); ++itra) { 00270 (const_cast<IAlgTool*>(*itra))->addRef(); 00271 registerAlgTool(**itra).ignore(); 00272 } 00273 00274 m_log << MSG::INFO << "Registered " << m_algtools.size() << " AlgTools" 00275 << endreq; 00276 00278 00279 std::list<IService*> svcs = Gaudi::svcLocator()->getServices(); 00280 00281 std::list<IService*>::const_iterator itrs; 00282 for (itrs=svcs.begin(); itrs!=svcs.end(); ++itrs) { 00283 (*itrs)->addRef(); 00284 registerSvc(**itrs).ignore(); 00285 } 00286 00287 m_log << MSG::INFO; 00288 m_log << "Registered " << svcs.size() << " Services" << endreq; 00289 00290 return StatusCode::SUCCESS; 00291 00292 00293 } 00294 00295 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00296 00297 StatusCode HistorySvc::finalize() { 00298 00299 if (!m_activate) return StatusCode::SUCCESS; 00300 00301 if (m_dump) { 00302 listProperties().ignore(); 00303 } 00304 00305 if (m_outputFile != "") { 00306 std::ofstream ofs; 00307 ofs.open(m_outputFile.c_str()); 00308 if (!ofs) { 00309 m_log << MSG::ERROR << "Unable to open output file \"m_outputFile\"" 00310 << endreq; 00311 } else { 00312 00313 // dumpProperties(ofs); 00314 dumpState(ofs); 00315 00316 ofs.close(); 00317 } 00318 } 00319 00320 clearState(); 00321 00322 StatusCode status = Service::finalize(); 00323 00324 if ( status.isSuccess() ) 00325 m_log << MSG::INFO << "Service finalised successfully" << endreq; 00326 00327 return status; 00328 00329 } 00330 00331 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00332 00333 StatusCode HistorySvc::queryInterface(const InterfaceID& riid, 00334 void** ppvInterface) 00335 { 00336 StatusCode sc = StatusCode::FAILURE; 00337 if ( ppvInterface ) { 00338 *ppvInterface = 0; 00339 00340 if ( IHistorySvc::interfaceID().versionMatch(riid) ) { 00341 *ppvInterface = static_cast<IHistorySvc*>(this); 00342 sc = StatusCode::SUCCESS; 00343 addRef(); 00344 } 00345 else 00346 sc = Service::queryInterface( riid, ppvInterface ); 00347 } 00348 return sc; 00349 } 00350 00351 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00352 00353 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00354 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00355 00356 StatusCode 00357 HistorySvc::registerAlg(const Algorithm &alg) { 00358 00359 JobHistory *job = getJobHistory(); 00360 if (m_algmap.find(&alg) != m_algmap.end()) { 00361 m_log << MSG::WARNING << "Algorithm " << alg.name() 00362 << " already registered with HistorySvc" << endreq; 00363 return StatusCode::SUCCESS; 00364 } 00365 00366 (const_cast<Algorithm*>(&alg))->addRef(); 00367 00368 m_algs.insert(&alg); 00369 00370 AlgorithmHistory *algHist = new AlgorithmHistory(alg, job); 00371 m_algmap[&alg] = algHist; 00372 00373 #ifndef NDEBUG 00374 m_log << MSG::DEBUG << "Registering algorithm: "; 00375 m_log.setColor(MSG::CYAN); 00376 m_log << alg.name() << endreq; 00377 m_log.resetColor(); 00378 #endif 00379 00380 return StatusCode(StatusCode::SUCCESS,true); 00381 00382 } 00383 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00384 00385 StatusCode 00386 HistorySvc::listProperties(const Algorithm &alg) const { 00387 00388 m_log << MSG::INFO << "Dumping properties for " << alg.name() << endl; 00389 00390 AlgorithmHistory *hist = getAlgHistory( alg ); 00391 00392 if (hist == 0) { 00393 return StatusCode::FAILURE; 00394 } 00395 00396 ostringstream ost; 00397 ost << *hist; 00398 00399 std::string str = ost.str(); 00400 00401 m_log << MSG::INFO << alg.name() << " --> " << endl << str << endreq; 00402 00403 return StatusCode(StatusCode::SUCCESS,true); 00404 00405 } 00406 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00407 00408 void 00409 HistorySvc::dumpProperties(const Algorithm &alg, std::ofstream& ofs) const { 00410 00411 AlgorithmHistory *hist = getAlgHistory( alg ); 00412 00413 if (hist == 0) { 00414 return; 00415 } 00416 00417 AlgorithmHistory::PropertyList::const_iterator itr; 00418 for (itr=hist->properties().begin(); itr!=hist->properties().end(); ++itr) { 00419 ofs << alg.name() << " " << dumpProp(*itr) << std::endl; 00420 } 00421 00422 } 00423 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00424 00425 AlgorithmHistory* 00426 HistorySvc::getAlgHistory(const Algorithm &alg) const { 00427 00428 const Algorithm *palg = &alg; 00429 set<const Algorithm*>::const_iterator itr = m_algs.find(palg); 00430 if ( itr == m_algs.end() ) { 00431 m_log << MSG::WARNING << "Algorithm " << alg.name() << " not registered" 00432 << endreq; 00433 return 0; 00434 } 00435 00436 map<const Algorithm*, AlgorithmHistory*>::const_iterator itr2; 00437 itr2 = m_algmap.find( *itr ); 00438 00439 return ( itr2->second ); 00440 00441 } 00442 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00443 00444 void 00445 HistorySvc::getAlgHistory(std::set<AlgorithmHistory*>& algs) const { 00446 00447 set<const Algorithm*>::const_iterator itr; 00448 for (itr=m_algs.begin(); itr!=m_algs.end(); ++itr) { 00449 AlgorithmHistory *ah = m_algmap.find(*itr)->second; 00450 00451 algs.insert(ah); 00452 } 00453 00454 } 00455 00456 00457 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00458 StatusCode 00459 HistorySvc::registerJob() { 00460 00461 00462 return StatusCode(StatusCode::SUCCESS,true); 00463 00464 00465 } 00466 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00467 00468 00469 StatusCode 00470 HistorySvc::listProperties() const { 00471 00472 m_log << MSG::INFO; 00473 m_log.setColor(MSG::CYAN); 00474 m_log << "Dumping properties for all Algorithms" << endreq; 00475 00476 std::map<const Algorithm*, AlgorithmHistory*>::const_iterator itr; 00477 for (itr=m_algmap.begin(); itr != m_algmap.end(); ++itr) { 00478 const Algorithm* alg = itr->first; 00479 00480 listProperties( *alg ).ignore(); 00481 00482 } 00483 00484 m_log << MSG::INFO; 00485 m_log.setColor(MSG::CYAN); 00486 m_log << "Dumping properties for all AlgTools" << endreq; 00487 00488 std::map<const AlgTool*, AlgToolHistory*>::const_iterator itr_a; 00489 for (itr_a=m_algtoolmap.begin(); itr_a != m_algtoolmap.end(); ++itr_a) { 00490 const AlgTool* alg = itr_a->first; 00491 00492 listProperties( *alg ).ignore(); 00493 00494 } 00495 00496 m_log << MSG::INFO; 00497 m_log.setColor(MSG::CYAN); 00498 m_log << "Dumping properties for all Services" << endreq; 00499 00500 std::map<const IService*, ServiceHistory*>::const_iterator itr_s; 00501 for (itr_s=m_svcmap.begin(); itr_s != m_svcmap.end(); ++itr_s) { 00502 const IService* svc = itr_s->first; 00503 00504 listProperties( *svc ).ignore(); 00505 00506 } 00507 00508 m_log << MSG::INFO; 00509 m_log.setColor(MSG::CYAN); 00510 m_log << "Dumping properties for Job"; 00511 m_log.resetColor(); 00512 00513 ostringstream ost; 00514 ost << *m_jobHistory; 00515 std::string str = ost.str(); 00516 00517 m_log << std::endl << str << endreq; 00518 00519 return StatusCode(StatusCode::SUCCESS,true); 00520 00521 } 00522 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00523 00524 void 00525 HistorySvc::dumpProperties(std::ofstream& ofs) const { 00526 00527 00528 ofs << "GLOBAL" << std::endl; 00529 const JobHistory::PropertyList props = m_jobHistory->properties(); 00530 JobHistory::PropertyList::const_iterator itrj; 00531 for (itrj=props.begin(); itrj != props.end(); ++itrj) { 00532 std::string client = itrj->first; 00533 const Property* prp = itrj->second; 00534 ofs << client << " " << dumpProp(prp) << std::endl; 00535 } 00536 00537 ofs << std::endl << "SERVICES" << std::endl; 00538 std::map<const IService*, ServiceHistory*>::const_iterator itr_s; 00539 for (itr_s=m_svcmap.begin(); itr_s != m_svcmap.end(); ++itr_s) { 00540 const IService* svc = itr_s->first; 00541 00542 dumpProperties( *svc, ofs ); 00543 00544 } 00545 00546 ofs << std::endl << "ALGORITHMS" << std::endl; 00547 std::map<const Algorithm*, AlgorithmHistory*>::const_iterator itr; 00548 for (itr=m_algmap.begin(); itr != m_algmap.end(); ++itr) { 00549 const Algorithm* alg = itr->first; 00550 00551 dumpProperties( *alg, ofs ); 00552 00553 } 00554 00555 ofs << std::endl << "ALGTOOLS" << std::endl; 00556 std::map<const AlgTool*, AlgToolHistory*>::const_iterator itr_a; 00557 for (itr_a=m_algtoolmap.begin(); itr_a != m_algtoolmap.end(); ++itr_a) { 00558 const AlgTool* alg = itr_a->first; 00559 00560 dumpProperties( *alg, ofs ); 00561 00562 } 00563 00564 00565 } 00566 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00567 00568 JobHistory* 00569 HistorySvc::getJobHistory() const { 00570 00571 return m_jobHistory; 00572 00573 } 00574 00575 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00576 IAlgorithm* 00577 HistorySvc::getCurrentIAlg() const { 00578 if (p_algCtxSvc == 0) { 00579 m_log << MSG::WARNING << "trying to create DataHistoryObj before " 00580 << "HistorySvc has been initialized" << endreq; 00581 return 0; 00582 00583 } else { 00584 return p_algCtxSvc->currentAlg(); 00585 } 00586 } 00587 00588 00589 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00590 00591 DataHistory* 00592 HistorySvc::createDataHistoryObj(const CLID& id, const std::string& key, 00593 const std::string& /* storeName */) { 00594 00595 if (!m_activate) return 0; 00596 00597 00598 AlgorithmHistory *algHist; 00599 00600 IAlgorithm* ialg = getCurrentIAlg(); 00601 if (ialg == 0) { 00602 #ifndef NDEBUG 00603 m_log << MSG::DEBUG 00604 << "Could not discover current Algorithm:" << endl 00605 << " object CLID: " << id << " key: \"" << key 00606 << "\"" << endreq; 00607 #endif 00608 algHist = 0; 00609 } else { 00610 Algorithm* alg = dynamic_cast<Algorithm*>(ialg); 00611 if (alg != 0) { 00612 algHist = getAlgHistory( *alg ); 00613 } else { 00614 m_log << MSG::WARNING 00615 << "Could not extract concerete Algorithm:" 00616 << endl 00617 << " object CLID: " << id << " key: \"" << key 00618 << "\"" << endreq; 00619 algHist = 0; 00620 } 00621 } 00622 00623 DataHistory *hist = new DataHistory(id, key, algHist); 00624 00625 return hist; 00626 00627 } 00628 00629 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00630 StatusCode 00631 HistorySvc::registerDataHistory(const CLID& id, const std::string& key, 00632 const std::string& storeName) { 00633 00634 DHH dhh(id,key); 00635 00636 pair<DHMitr,DHMitr> mitr = m_datMap.equal_range(dhh); 00637 00638 if (mitr.first == mitr.second) { 00639 // not in the map 00640 DataHistory *dh = createDataHistoryObj(id,key,storeName); 00641 m_datMap.insert(pair<DHH,DataHistory*>(dhh,dh)); 00642 } else { 00643 // found at least one 00644 bool match(false); 00645 00646 std::string algName; 00647 IAlgorithm *ialg = getCurrentIAlg(); 00648 if (ialg != 0) { 00649 algName = ialg->name(); 00650 } else { 00651 algName = "UNKNOWN"; 00652 } 00653 00654 for (DHMitr itr = mitr.first; itr != mitr.second; ++itr) { 00655 DataHistory *dh = itr->second; 00656 if (dh->algorithmHistory()->algorithm_name() == algName) { 00657 match = true; 00658 break; 00659 } 00660 } 00661 00662 if (! match) { 00663 DataHistory *dh = createDataHistoryObj(id,key,storeName); 00664 m_datMap.insert(pair<DHH,DataHistory*>(dhh,dh)); 00665 } 00666 } 00667 00668 return StatusCode::SUCCESS; 00669 00670 } 00671 00672 00673 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00674 DataHistory* 00675 HistorySvc::getDataHistory(const CLID& id, const std::string& key, 00676 const std::string& /*storeName*/) const { 00677 00678 DHH dhh(id,key); 00679 00680 pair<DHMCitr,DHMCitr> mitr = m_datMap.equal_range(dhh); 00681 00682 if(mitr.first == mitr.second) { 00683 return 0; 00684 } 00685 00686 return mitr.first->second; 00687 00688 } 00689 00690 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00691 00692 int 00693 HistorySvc::getDataHistory(const CLID& id, const std::string& key, 00694 const std::string& /*storeName*/, 00695 std::list<DataHistory*>& dhlist) const { 00696 00697 DHH dhh(id,key); 00698 00699 int n(0); 00700 00701 pair<DHMCitr,DHMCitr> mitr = m_datMap.equal_range(dhh); 00702 00703 for (DHMCitr itr=mitr.first; itr != mitr.second; ++itr) { 00704 dhlist.push_back(itr->second); 00705 n++; 00706 } 00707 00708 return n; 00709 00710 } 00711 00712 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00713 00714 StatusCode 00715 HistorySvc::registerSvc(const IService &svc) { 00716 00717 if ( svc.name() == "HistoryStore" ) { 00718 // m_log << MSG::WARNING << "not registering store" << endreq; 00719 return StatusCode(StatusCode::SUCCESS,true); 00720 } 00721 00722 JobHistory *job = getJobHistory(); 00723 const IService* psvc = &svc; 00724 map<const IService*, ServiceHistory*>::const_iterator itr = 00725 m_svcmap.find(psvc); 00726 if (itr == m_svcmap.end()) { 00727 00728 #ifndef NDEBUG 00729 m_log << MSG::DEBUG << "Registering Service: "; 00730 m_log.setColor(MSG::CYAN); 00731 m_log << svc.name() << endreq; 00732 #endif 00733 00734 m_svcs.insert(psvc); 00735 00736 ServiceHistory *svcHist = new ServiceHistory(&svc, job); 00737 m_svcmap[psvc] = svcHist; 00738 00739 (const_cast<IService*>(psvc))->addRef(); 00740 00741 } 00742 00743 m_log.resetColor(); 00744 return StatusCode(StatusCode::SUCCESS,true); 00745 00746 } 00747 00748 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00749 00750 ServiceHistory* 00751 HistorySvc::getServiceHistory(const IService &svc) const { 00752 00753 const IService *psvc = &svc; 00754 map<const IService*, ServiceHistory*>::const_iterator itr = 00755 m_svcmap.find(psvc); 00756 if ( itr == m_svcmap.end() ) { 00757 m_log << MSG::WARNING << "Service " << svc.name() << " not registered" 00758 << endreq; 00759 return 0; 00760 } 00761 00762 return ( itr->second ); 00763 00764 } 00765 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00766 00767 void 00768 HistorySvc::getServiceHistory(std::set<ServiceHistory*>& svcs) const { 00769 00770 set<const IService*>::const_iterator itr; 00771 for (itr=m_svcs.begin(); itr!=m_svcs.end(); ++itr) { 00772 ServiceHistory *sh = m_svcmap.find( *itr )->second; 00773 00774 svcs.insert(sh); 00775 } 00776 00777 } 00778 00779 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00780 00781 StatusCode 00782 HistorySvc::listProperties(const IService &svc) const { 00783 00784 m_log << MSG::INFO << "Dumping properties for " << svc.name() << endl; 00785 00786 ServiceHistory *hist = getServiceHistory( svc ); 00787 00788 if (hist == 0) { 00789 return StatusCode::FAILURE; 00790 } 00791 00792 ostringstream ost; 00793 ost << *hist; 00794 00795 std::string str = ost.str(); 00796 00797 m_log << MSG::INFO << svc.name() << " --> " << endl << str << endreq; 00798 00799 00800 00801 return StatusCode(StatusCode::SUCCESS,true); 00802 00803 } 00804 00805 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00806 00807 void 00808 HistorySvc::dumpProperties(const IService &svc, std::ofstream &ofs) const { 00809 00810 ServiceHistory *hist = getServiceHistory( svc ); 00811 00812 if (hist == 0) { 00813 return; 00814 } 00815 00816 ServiceHistory::PropertyList::const_iterator itr; 00817 for (itr=hist->properties().begin(); itr != hist->properties().end();++itr) { 00818 ofs << svc.name() << " " << dumpProp(*itr) << std::endl; 00819 } 00820 00821 } 00822 00823 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00824 00825 StatusCode 00826 HistorySvc::registerAlgTool(const IAlgTool& ialg) { 00827 00828 if (! m_isInitialized) { 00829 if (p_algCtxSvc == 0) { 00830 if ( service("AlgContextSvc",p_algCtxSvc,true).isFailure() ) { 00831 m_log << MSG::ERROR << "unable to get the AlgContextSvc" << endreq; 00832 return StatusCode::FAILURE; 00833 } 00834 } 00835 00836 m_ialgtools.insert(&ialg); 00837 return StatusCode::SUCCESS; 00838 } 00839 00840 const AlgTool *alg = dynamic_cast<const AlgTool*>( &ialg ); 00841 if ( alg == 0 ) { 00842 m_log << MSG::ERROR << "Could not dcast IAlgTool \"" << ialg.name() 00843 << "\" to an AlgTool" << endreq; 00844 return StatusCode::FAILURE; 00845 } 00846 00847 if (m_algtools.find(alg) != m_algtools.end()) { 00848 m_log << MSG::WARNING << "AlgTool " << ialg.name() 00849 << " already registered in HistorySvc" << endreq; 00850 return StatusCode::SUCCESS; 00851 } 00852 00853 m_algtools.insert(alg); 00854 (const_cast<AlgTool*>(alg))->addRef(); 00855 00856 const JobHistory *job = getJobHistory(); 00857 AlgToolHistory *algHist = new AlgToolHistory(*alg, job); 00858 m_algtoolmap[alg] = algHist; 00859 00860 #ifndef NDEBUG 00861 m_log << MSG::DEBUG << "Registering algtool: "; 00862 m_log.setColor(MSG::CYAN); 00863 m_log << alg->name() << endreq; 00864 m_log.resetColor(); 00865 #endif 00866 00867 return StatusCode::SUCCESS; 00868 00869 } 00870 00871 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00872 00873 StatusCode 00874 HistorySvc::listProperties(const IAlgTool& alg) const { 00875 00876 m_log << MSG::INFO << "Dumping properties for " << alg.name() << endl; 00877 00878 AlgToolHistory *hist = getAlgToolHistory( alg ); 00879 00880 if (hist == 0) { 00881 return StatusCode::FAILURE; 00882 } 00883 00884 ostringstream ost; 00885 ost << *hist; 00886 00887 std::string str = ost.str(); 00888 00889 m_log << MSG::INFO << alg.name() << " --> " << endl << str << endreq; 00890 00891 return StatusCode::SUCCESS; 00892 00893 } 00894 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00895 00896 void 00897 HistorySvc::dumpProperties(const IAlgTool& alg, std::ofstream &ofs) const { 00898 00899 AlgToolHistory *hist = getAlgToolHistory( alg ); 00900 00901 if (hist == 0) { 00902 return; 00903 } 00904 00905 AlgToolHistory::PropertyList::const_iterator itr; 00906 for (itr=hist->properties().begin(); itr!=hist->properties().end(); ++itr) { 00907 ofs << alg.name() << " " << dumpProp(*itr) << std::endl; 00908 } 00909 00910 } 00911 00912 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00913 00914 AlgToolHistory* 00915 HistorySvc::getAlgToolHistory(const IAlgTool& alg) const { 00916 00917 const AlgTool *palg = dynamic_cast<const AlgTool*>(&alg); 00918 set<const AlgTool*>::const_iterator itr = m_algtools.find(palg); 00919 if ( itr == m_algtools.end() ) { 00920 m_log << MSG::WARNING << "AlgTool " << alg.name() << " not registered" 00921 << endreq; 00922 return 0; 00923 } 00924 00925 map<const AlgTool*, AlgToolHistory*>::const_iterator itr2; 00926 itr2 = m_algtoolmap.find( *itr ); 00927 00928 return ( itr2->second ); 00929 00930 } 00931 00932 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00933 00934 void 00935 HistorySvc::getAlgToolHistory(std::set<AlgToolHistory*>& algs) const { 00936 00937 set<const AlgTool*>::const_iterator itr; 00938 for (itr=m_algtools.begin(); itr!=m_algtools.end(); ++itr) { 00939 AlgToolHistory *ah = m_algtoolmap.find(*itr)->second; 00940 00941 algs.insert(ah); 00942 } 00943 00944 } 00945 00946 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00947 00948 void 00949 HistorySvc::handle(const Incident& incident) { 00950 00951 if (incident.type() == IncidentType::BeginEvent) { 00952 if (captureState().isFailure()) { 00953 m_log << MSG::WARNING << "Error capturing state." << endl 00954 << "Will try again at next BeginEvent incident" << endreq; 00955 } 00956 } 00957 00958 } 00959 00960 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00961 00962 00963 std::string 00964 HistorySvc::dumpProp(const Property* prop) const { 00965 std::ostringstream ost; 00966 prop->fillStream(ost); 00967 return ost.str(); 00968 } 00969 00970 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00971 00972 void 00973 HistorySvc::dumpState(std::ofstream& ofs) const { 00974 00975 00976 ofs << "GLOBAL" << std::endl; 00977 const JobHistory::PropertyList props = m_jobHistory->properties(); 00978 JobHistory::PropertyList::const_iterator itrj; 00979 for (itrj=props.begin(); itrj != props.end(); ++itrj) { 00980 std::string client = itrj->first; 00981 const Property* prp = itrj->second; 00982 ofs << client << " " << dumpProp(prp) << std::endl; 00983 } 00984 00985 00986 ofs << "SERVICES" << std::endl; 00987 std::map<const IService*, ServiceHistory*>::const_iterator itr_s; 00988 for (itr_s=m_svcmap.begin(); itr_s != m_svcmap.end(); ++itr_s) { 00989 const IService* svc = itr_s->first; 00990 00991 dumpState( *svc, ofs ); 00992 00993 } 00994 00995 ofs << "ALGORITHMS" << std::endl; 00996 std::map<const Algorithm*, AlgorithmHistory*>::const_iterator itr; 00997 for (itr=m_algmap.begin(); itr != m_algmap.end(); ++itr) { 00998 const Algorithm* alg = itr->first; 00999 01000 dumpState( *alg, ofs ); 01001 01002 } 01003 01004 01005 ofs << "ALGTOOLS" << std::endl; 01006 std::map<const AlgTool*, AlgToolHistory*>::const_iterator itr_a; 01007 for (itr_a=m_algtoolmap.begin(); itr_a != m_algtoolmap.end(); ++itr_a) { 01008 const AlgTool* alg = itr_a->first; 01009 01010 dumpState( *alg, ofs ); 01011 01012 } 01013 01014 } 01015 01016 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 01017 01018 void 01019 HistorySvc::dumpState(const Algorithm &alg, std::ofstream& ofs) const { 01020 01021 AlgorithmHistory *hist = getAlgHistory( alg ); 01022 01023 if (hist == 0) { 01024 return; 01025 } 01026 01027 ofs << ">> " << alg.name() << endl << *hist << endl; 01028 01029 } 01030 01031 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 01032 01033 void 01034 HistorySvc::dumpState(const IService &svc, std::ofstream& ofs) const { 01035 01036 ServiceHistory *hist = getServiceHistory( svc ); 01037 01038 if (hist == 0) { 01039 return; 01040 } 01041 01042 ofs << ">> " << svc.name() << endl << *hist << endl; 01043 01044 } 01045 01046 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 01047 01048 void 01049 HistorySvc::dumpState(const IAlgTool &alg, std::ofstream& ofs) const { 01050 01051 AlgToolHistory *hist = getAlgToolHistory( alg ); 01052 01053 if (hist == 0) { 01054 return; 01055 } 01056 01057 ofs << ">> " << alg.name() << endl << *hist << endl; 01058 01059 }