Go to the documentation of this file.00001 #ifndef FUEVENTPROCESSOR_H
00002 #define FUEVENTPROCESSOR_H 1
00003
00004 #include "EventFilter/Utilities/interface/StateMachine.h"
00005 #include "EventFilter/Utilities/interface/RunBase.h"
00006 #include "EventFilter/Utilities/interface/Css.h"
00007 #include "EventFilter/Utilities/interface/Exception.h"
00008 #include "EventFilter/Utilities/interface/SquidNet.h"
00009 #include "EventFilter/Utilities/interface/Vulture.h"
00010
00011 #include "EventFilter/Utilities/interface/MasterQueue.h"
00012 #include "EventFilter/Utilities/interface/SlaveQueue.h"
00013 #include "EventFilter/Utilities/interface/ModuleWeb.h"
00014 #include "EventFilter/Utilities/interface/ModuleWebRegistry.h"
00015 #include "EventFilter/Modules/interface/ShmOutputModuleRegistry.h"
00016 #include "SubProcess.h"
00017 #include "FWEPWrapper.h"
00018
00019 #include "DataFormats/Provenance/interface/ModuleDescription.h"
00020 #include "FWCore/PluginManager/interface/PresenceFactory.h"
00021
00022 #include "xdaq/Application.h"
00023 #include "xdaq/NamespaceURI.h"
00024
00025 #include "xdata/String.h"
00026 #include "xdata/Integer.h"
00027 #include "xdata/Boolean.h"
00028 #include "xdata/Vector.h"
00029 #include "xdata/UnsignedInteger32.h"
00030 #include "xdata/ActionListener.h"
00031 #include "xdata/InfoSpaceFactory.h"
00032
00033 #include "xgi/Input.h"
00034 #include "xgi/Output.h"
00035 #include "xgi/exception/Exception.h"
00036
00037 #include <sys/time.h>
00038 #include <pthread.h>
00039 #include <sys/resource.h>
00040 #include <signal.h>
00041
00042 #include <list>
00043 #include <vector>
00044 #include <map>
00045
00046 namespace evf
00047 {
00048
00049
00050 struct filter {
00051
00052 };
00053 class CPUStat;
00054 class RateStat;
00055 namespace internal{
00056
00057 class MyCgi : public xgi::Input{
00058 public:
00059 MyCgi() : xgi::Input("",0){}
00060
00061 std::map<std::string, std::string, std::less<std::string> > &getEnvironment(){return environment_;}
00062 };
00063 }
00064 class FUEventProcessor : public xdaq::Application,
00065 public xdata::ActionListener
00066 {
00067 public:
00068
00069
00070
00071 XDAQ_INSTANTIATOR();
00072 FUEventProcessor(xdaq::ApplicationStub *s);
00073 virtual ~FUEventProcessor();
00074
00075
00076
00077
00078
00079
00080
00081 bool configuring(toolbox::task::WorkLoop* wl);
00082 bool enabling(toolbox::task::WorkLoop* wl);
00083 bool stopping(toolbox::task::WorkLoop* wl);
00084 bool halting(toolbox::task::WorkLoop* wl);
00085
00086
00087 xoap::MessageReference fsmCallback(xoap::MessageReference msg)
00088 throw (xoap::exception::Exception);
00089
00090
00091 void actionPerformed(xdata::Event& e);
00092
00093
00094
00095
00096
00097
00098
00099 void defaultWebPage(xgi::Input *in,xgi::Output *out)
00100 throw(xgi::exception::Exception);
00101 void spotlightWebPage(xgi::Input *,xgi::Output *)
00102 throw(xgi::exception::Exception);
00103 void scalersWeb(xgi::Input *,xgi::Output *)
00104 throw(xgi::exception::Exception);
00105 void pathNames(xgi::Input *,xgi::Output *)
00106 throw(xgi::exception::Exception);
00107 void css(xgi::Input *in,xgi::Output *out) throw (xgi::exception::Exception)
00108 {
00109 css_.css(in,out);
00110 }
00111
00112 void getSlavePids(xgi::Input *in, xgi::Output *out) throw (xgi::exception::Exception);
00113 void subWeb(xgi::Input *in,xgi::Output *out) throw (xgi::exception::Exception);
00114 void moduleWeb(xgi::Input *in,xgi::Output *out) throw (xgi::exception::Exception) {evtProcessor_.moduleWeb(in,out);}
00115 void serviceWeb(xgi::Input *in,xgi::Output *out) throw (xgi::exception::Exception) {evtProcessor_.serviceWeb(in,out);}
00116 void microState(xgi::Input *in,xgi::Output *out) throw (xgi::exception::Exception);
00117 void updater(xgi::Input *in,xgi::Output *out) throw (xgi::exception::Exception);
00118 void procStat(xgi::Input *in,xgi::Output *out) throw (xgi::exception::Exception);
00119 void sendMessageOverMonitorQueue(MsgBuf &);
00120
00121 static void forkProcessFromEDM_helper(void * addr);
00122 void handleSignalSlave(int sig, siginfo_t* info, void* c);
00123
00124 private:
00125
00126
00127 void forkProcessesFromEDM();
00128
00129 bool enableForkInEDM();
00130 bool restartForkInEDM(unsigned int slotId);
00131 bool doEndRunInEDM();
00132
00133 void setAttachDqmToShm() throw (evf::Exception);
00134 void attachDqmToShm() throw (evf::Exception);
00135 void detachDqmFromShm() throw (evf::Exception);
00136
00137 std::string logsAsString();
00138 void localLog(std::string);
00139
00140
00141 void startSupervisorLoop();
00142 void startReceivingLoop();
00143 void startReceivingMonitorLoop();
00144
00145 void startScalersWorkLoop() throw (evf::Exception);
00146 bool scalers(toolbox::task::WorkLoop* wl);
00147 void startSummarizeWorkLoop() throw (evf::Exception);
00148 bool summarize(toolbox::task::WorkLoop* wl);
00149
00150 bool receiving(toolbox::task::WorkLoop* wl);
00151 bool receivingAndMonitor(toolbox::task::WorkLoop* wl);
00152 bool supervisor(toolbox::task::WorkLoop* wl);
00153 void startSignalMonitorWorkLoop() throw (evf::Exception);
00154 bool sigmon(toolbox::task::WorkLoop* wl);
00155
00156 bool enableCommon();
00157 bool enableClassic();
00158
00159 bool enableMPEPSlave();
00160 bool stopClassic();
00161 void stopSlavesAndAcknowledge();
00162 void makeStaticInfo();
00163
00164
00165
00166
00167
00168
00169 evf::StateMachine fsm_;
00170
00171
00172 Logger log_;
00173
00174
00175 FWEPWrapper evtProcessor_;
00176
00177
00178 xdata::String url_;
00179 xdata::String class_;
00180 xdata::UnsignedInteger32 instance_;
00181 xdata::UnsignedInteger32 runNumber_;
00182 xdata::Boolean epInitialized_;
00183 xdata::String configString_;
00184 std::string configuration_;
00185
00186 xdata::Boolean outPut_;
00187
00188 xdata::Boolean autoRestartSlaves_;
00189 xdata::UnsignedInteger32 slaveRestartDelaySecs_;
00190
00191 xdata::Boolean hasShMem_;
00192 xdata::Boolean hasPrescaleService_;
00193 xdata::Boolean hasModuleWebRegistry_;
00194 xdata::Boolean hasServiceWebRegistry_;
00195 xdata::Boolean isRunNumberSetter_;
00196 xdata::Boolean iDieStatisticsGathering_;
00197 bool outprev_;
00198
00199
00200 std::string sourceId_;
00201
00202
00203 xdata::Boolean squidPresent_;
00204
00205
00206
00207 xdata::Boolean exitOnError_;
00208
00209
00210 Css css_;
00211
00212
00213 std::string reasonForFailedState_;
00214
00215 SquidNet squidnet_;
00216 std::vector<std::string> logRing_;
00217 unsigned int logRingIndex_;
00218 static const unsigned int logRingSize_ = 50;
00219 bool logWrap_;
00220
00221 xdata::UnsignedInteger32 nbSubProcesses_;
00222 xdata::UnsignedInteger32 nbSubProcessesReporting_;
00223 xdata::UnsignedInteger32 forkInEDM_;
00224 std::vector<SubProcess> subs_;
00225 unsigned int nblive_;
00226 unsigned int nbdead_;
00227
00228 unsigned int nbTotalDQM_;
00229
00230
00231 toolbox::task::WorkLoop *wlReceiving_;
00232 toolbox::task::ActionSignature *asReceiveMsgAndExecute_;
00233 bool receiving_;
00234 toolbox::task::WorkLoop *wlReceivingMonitor_;
00235 toolbox::task::ActionSignature *asReceiveMsgAndRead_;
00236 bool receivingM_;
00237 SubProcess* myProcess_;
00238 toolbox::task::WorkLoop *wlSupervising_;
00239 toolbox::task::ActionSignature *asSupervisor_;
00240 bool supervising_;
00241 toolbox::task::WorkLoop *wlSignalMonitor_;
00242 toolbox::task::ActionSignature *asSignalMonitor_;
00243 bool signalMonitorActive_;
00244
00245
00246 xdata::InfoSpace* monitorInfoSpace_;
00247 xdata::InfoSpace* monitorLegendaInfoSpace_;
00248 xdata::InfoSpace* applicationInfoSpace_;
00249 pthread_mutex_t stop_lock_;
00250 pthread_mutex_t start_lock_;
00251 pthread_mutex_t pickup_lock_;
00252 std::string updaterStatic_;
00253 xdata::Serializable *nbProcessed;
00254 xdata::Serializable *nbAccepted;
00255
00256
00257 xdata::InfoSpace *scalersInfoSpace_;
00258 xdata::InfoSpace *scalersLegendaInfoSpace_;
00259
00260
00261 toolbox::task::WorkLoop *wlScalers_;
00262 toolbox::task::ActionSignature *asScalers_;
00263 bool wlScalersActive_;
00264 unsigned int scalersUpdates_;
00265
00266
00267 toolbox::task::WorkLoop *wlSummarize_;
00268 toolbox::task::ActionSignature *asSummarize_;
00269 bool wlSummarizeActive_;
00270 int anonymousPipe_[2];
00271 xdata::Vector<xdata::Integer> spMStates_;
00272 xdata::Vector<xdata::Integer> spmStates_;
00273 xdata::UnsignedInteger32 superSleepSec_;
00274 std::list<std::string> names_;
00275 xdata::String iDieUrl_;
00276 Vulture *vulture_;
00277 pid_t vp_;
00278 CPUStat *cpustat_;
00279 RateStat *ratestat_;
00280
00281 ModuleWebRegistry *mwrRef_;
00282 ShmOutputModuleRegistry *sorRef_;
00283 MsgBuf master_message_prg_;
00284 MsgBuf master_message_prr_;
00285 MsgBuf slave_message_prr_;
00286 MsgBuf slave_message_monitoring_;
00287 MsgBuf master_message_trr_;
00288
00289 moduleweb::ForkInfoObj *forkInfoObj_;
00290 pthread_mutex_t forkObjLock_;
00291 bool restart_in_progress_;
00292 bool edm_init_done_;
00293
00294 unsigned int crashesThisRun_;
00295 bool rlimit_coresize_changed_;
00296 rlimit rlimit_coresize_default_;
00297 xdata::UnsignedInteger32 crashesToDump_;
00298 sem_t *sigmon_sem_;
00299 timeval lastCrashTime_;
00300
00301 unsigned long long idleProcStats_;
00302 unsigned long long allProcStats_;
00303 timeval lastProcReport_;
00304
00305 std::auto_ptr<edm::Presence> messageServicePresence_;
00306 xdata::Boolean datasetCounting_;
00307 };
00308
00309
00310 }
00311
00312
00313 #endif