00001 #ifndef artdaq_DAQrate_EventStore_hh
00002 #define artdaq_DAQrate_EventStore_hh
00003
00004 #include "artdaq/DAQdata/Globals.hh"
00005 #include "artdaq-core/Data/RawEvent.hh"
00006 #include "artdaq-core/Core/GlobalQueue.hh"
00007 #include "artdaq-utilities/Plugins/MetricManager.hh"
00008 #include <fhiclcpp/ParameterSet.h>
00009
00010 #include <map>
00011 #include <memory>
00012 #include <chrono>
00013
00014 #include <future>
00015 #include <stdint.h>
00016 #include <arpa/inet.h>
00017 #include <netinet/in.h>
00018 #include <sys/types.h>
00019 #include <sys/socket.h>
00020
00021 namespace artdaq
00022 {
00023
00048 class EventStore
00049 {
00050 public:
00055 typedef int (ART_CMDLINE_FCN)(int, char**);
00056
00061 typedef int (ART_CFGSTRING_FCN)(const std::string&);
00062
00063 typedef RawEvent::run_id_t run_id_t;
00064 typedef RawEvent::subrun_id_t subrun_id_t;
00065 typedef Fragment::sequence_id_t sequence_id_t;
00066 typedef std::map<sequence_id_t, RawEvent_ptr> EventMap;
00067
00068 static const std::string EVENT_RATE_STAT_KEY;
00069 static const std::string INCOMPLETE_EVENT_STAT_KEY;
00070
00074 enum class EventStoreInsertResult : int
00075 {
00076 REJECT_QUEUEFULL,
00077 SUCCESS,
00078 SUCCESS_STOREFULL,
00079 REJECT_STOREFULL
00080 };
00081
00085 EventStore() = delete;
00086
00090 EventStore(EventStore const&) = delete;
00091
00096 EventStore& operator=(EventStore const&) = delete;
00097
00129 EventStore(const fhicl::ParameterSet& pset,
00130 size_t num_fragments_per_event, run_id_t run,
00131 size_t event_queue_depth, size_t max_incomplete_events);
00132
00144 EventStore(const fhicl::ParameterSet& pset,
00145 size_t num_fragments_per_event, run_id_t run,
00146 int argc, char* argv[],
00147 ART_CMDLINE_FCN* reader);
00148
00159 EventStore(const fhicl::ParameterSet& pset,
00160 size_t num_fragments_per_event, run_id_t run,
00161 const std::string& configString,
00162 ART_CFGSTRING_FCN* reader);
00163
00167 virtual ~EventStore();
00168
00183 void insert(FragmentPtr pfrag,
00184 bool printWarningWhenFragmentIsDropped = true);
00185
00201 EventStoreInsertResult insert(FragmentPtr pfrag, FragmentPtr& rejectedFragment);
00202
00213 bool endOfData(int& readerReturnValue);
00214
00226 void setSeqIDModulus(unsigned int seqIDModulus);
00227
00233 bool flushData();
00234
00239 void startRun(run_id_t runID);
00240
00244 void startSubrun();
00245
00250 subrun_id_t subrunID() const { return subrun_id_; }
00251
00256 bool endRun();
00257
00262 bool endSubrun();
00263
00267 void sendMetrics();
00268
00273 size_t incompleteEventCount() const { return events_.size(); }
00274
00275 private:
00276
00277
00278 size_t const num_fragments_per_event_;
00279 size_t const max_queue_size_;
00280 size_t const max_incomplete_count_;
00281 run_id_t run_id_;
00282 subrun_id_t subrun_id_;
00283 EventMap events_;
00284 RawEventQueue& queue_;
00285 std::chrono::steady_clock::time_point reader_thread_launch_time_;
00286 std::future<int> reader_thread_;
00287
00288 bool send_requests_;
00289 std::mutex request_mutex_;
00290 std::map<Fragment::sequence_id_t, Fragment::timestamp_t> active_requests_;
00291 int request_port_;
00292 size_t request_delay_;
00293 int request_socket_;
00294 struct sockaddr_in request_addr_;
00295 std::string multicast_out_addr_;
00296
00297 unsigned int seqIDModulus_;
00298 sequence_id_t lastFlushedSeqID_;
00299 sequence_id_t highestSeqIDSeen_;
00300
00301 artdaq::detail::seconds const enq_timeout_;
00302 size_t enq_check_count_;
00303 bool const printSummaryStats_;
00304
00305 int incomplete_event_report_interval_ms_;
00306 std::chrono::steady_clock::time_point last_incomplete_event_report_time_;
00307
00308 bool send_routing_tokens_;
00309 int token_port_;
00310 int token_socket_;
00311 struct sockaddr_in token_addr_;
00312 std::string token_address_;
00313
00314 int art_thread_wait_ms_;
00315
00316 private:
00317 void initStatistics_();
00318
00319 void reportStatistics_();
00320
00321 void setup_requests_(std::string trigger_addr);
00322
00323 void send_request_();
00324
00325 void do_send_request_();
00326
00327 void setup_tokens_();
00328
00329 void send_routing_token_(int nSlots);
00330 };
00331 }
00332 #endif