00001 #ifndef artdaq_Application_MPI2_AggregatorCore_hh
00002 #define artdaq_Application_MPI2_AggregatorCore_hh
00003
00004 #include <string>
00005 #include <vector>
00006 #include <atomic>
00007 #include <thread>
00008
00009 #include "fhiclcpp/ParameterSet.h"
00010 #include "canvas/Persistency/Provenance/RunID.h"
00011
00012 #include "artdaq-core/Core/GlobalQueue.hh"
00013 #include "artdaq-utilities/Plugins/MetricManager.hh"
00014
00015 #include "artdaq/DAQrate/DataSenderManager.hh"
00016 #include "artdaq/DAQrate/DataReceiverManager.hh"
00017 #include "artdaq/DAQrate/EventStore.hh"
00018 #include "artdaq/Application/StatisticsHelper.hh"
00019 #include "artdaq/TransferPlugins/TransferInterface.hh"
00020
00021
00022 namespace artdaq
00023 {
00024 class AggregatorCore;
00025 }
00026
00031 class artdaq::AggregatorCore
00032 {
00033 public:
00034 static const std::string INPUT_EVENTS_STAT_KEY;
00035 static const std::string INPUT_WAIT_STAT_KEY;
00036 static const std::string STORE_EVENT_WAIT_STAT_KEY;
00037 static const std::string SHM_COPY_TIME_STAT_KEY;
00038 static const std::string FILE_CHECK_TIME_STAT_KEY;
00039
00046 AggregatorCore(int rank, std::string name);
00047
00051 AggregatorCore(AggregatorCore const&) = delete;
00052
00056 ~AggregatorCore();
00057
00062 AggregatorCore& operator=(AggregatorCore const&) = delete;
00063
00096 bool initialize(fhicl::ParameterSet const& pset);
00097
00103 bool start(art::RunID id);
00104
00109 bool stop();
00110
00115 bool pause();
00116
00121 bool resume();
00122
00127 bool shutdown();
00128
00134 bool soft_initialize(fhicl::ParameterSet const& pset);
00135
00141 bool reinitialize(fhicl::ParameterSet const& pset);
00142
00155 size_t process_fragments();
00156
00171 std::string report(std::string const& which) const;
00172
00180 std::string register_monitor(fhicl::ParameterSet const& pset);
00181
00187 std::string unregister_monitor(std::string const& label);
00188
00189 private:
00190 std::string name_;
00191 art::RunID run_id_;
00192 bool art_initialized_;
00193
00194 fhicl::ParameterSet data_pset_;
00195 std::string init_string_;
00196 size_t expected_events_per_bunch_;
00197 size_t inrun_recv_timeout_usec_;
00198 size_t endrun_recv_timeout_usec_;
00199 size_t pause_recv_timeout_usec_;
00200 size_t onmon_event_prescale_;
00201 int32_t filesize_check_interval_seconds_;
00202 int32_t filesize_check_interval_events_;
00203 bool is_data_logger_;
00204 bool is_online_monitor_;
00205 bool is_dispatcher_;
00206 artdaq::detail::seconds enq_timeout_;
00207
00208 std::unique_ptr<artdaq::DataReceiverManager> receiver_ptr_;
00209 std::unique_ptr<artdaq::DataSenderManager> sender_ptr_;
00210 std::unique_ptr<artdaq::EventStore> event_store_ptr_;
00211 artdaq::RawEventQueue& event_queue_;
00212 fhicl::ParameterSet previous_pset_;
00213 std::atomic<bool> stop_requested_;
00214 std::atomic<bool> local_pause_requested_;
00215 std::atomic<bool> processing_fragments_;
00216
00217 size_t event_count_in_run_;
00218 size_t event_count_in_subrun_;
00219 time_t subrun_start_time_;
00220 std::string disk_writing_directory_;
00221
00222 size_t getLatestFileSize_() const;
00223
00224 std::vector<std::vector<std::string>> xmlrpc_client_lists_;
00225 size_t file_close_threshold_bytes_;
00226 time_t file_close_timeout_secs_;
00227 size_t file_close_event_count_;
00228
00229 bool sendPauseAndResume_();
00230
00231 std::atomic<bool> system_pause_requested_;
00232 std::shared_ptr<std::thread> pause_thread_;
00233
00234 void logMessage_(std::string const& text);
00235
00236 artdaq::StatisticsHelper stats_helper_;
00237
00238 std::string buildStatisticsString_();
00239
00240 double previous_run_duration_;
00241 artdaq::MetricManager metricMan_;
00242
00243 void sendMetrics_();
00244
00245 std::unique_ptr<Fragment> init_fragment_ptr_;
00246
00247 std::mutex dispatcher_transfers_mutex_;
00248 std::deque<std::unique_ptr<TransferInterface>> dispatcher_transfers_;
00249 size_t new_transfers_;
00250 };
00251
00252 #endif
00253
00254