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 "artdaq/DAQrate/detail/RequestMessage.hh"
00009 #include "fhiclcpp/ParameterSet.h"
00010
00011 #include <map>
00012 #include <memory>
00013 #include <chrono>
00014
00015 #include <future>
00016 #include <stdint.h>
00017 #include <arpa/inet.h>
00018 #include <netinet/in.h>
00019 #include <sys/types.h>
00020 #include <sys/socket.h>
00021
00022 namespace artdaq
00023 {
00024
00049 class EventStore
00050 {
00051 public:
00056 typedef int (ART_CMDLINE_FCN)(int, char**);
00057
00062 typedef int (ART_CFGSTRING_FCN)(const std::string&);
00063
00064 typedef RawEvent::run_id_t run_id_t;
00065 typedef RawEvent::subrun_id_t subrun_id_t;
00066 typedef Fragment::sequence_id_t sequence_id_t;
00067 typedef std::map<sequence_id_t, RawEvent_ptr> EventMap;
00068
00069 static const std::string EVENT_RATE_STAT_KEY;
00070 static const std::string INCOMPLETE_EVENT_STAT_KEY;
00071
00075 enum class EventStoreInsertResult : int
00076 {
00077 REJECT_QUEUEFULL,
00078 SUCCESS,
00079 SUCCESS_STOREFULL,
00080 REJECT_STOREFULL
00081 };
00082
00086 EventStore() = delete;
00087
00091 EventStore(EventStore const&) = delete;
00092
00097 EventStore& operator=(EventStore const&) = delete;
00098
00130 EventStore(const fhicl::ParameterSet& pset,
00131 size_t num_fragments_per_event, run_id_t run,
00132 size_t event_queue_depth, size_t max_incomplete_events);
00133
00145 EventStore(const fhicl::ParameterSet& pset,
00146 size_t num_fragments_per_event, run_id_t run,
00147 int argc, char* argv[],
00148 ART_CMDLINE_FCN* reader);
00149
00160 EventStore(const fhicl::ParameterSet& pset,
00161 size_t num_fragments_per_event, run_id_t run,
00162 const std::string& configString,
00163 ART_CFGSTRING_FCN* reader);
00164
00168 virtual ~EventStore();
00169
00184 void insert(FragmentPtr pfrag,
00185 bool printWarningWhenFragmentIsDropped = true);
00186
00202 EventStoreInsertResult insert(FragmentPtr pfrag, FragmentPtr& rejectedFragment);
00203
00214 bool endOfData(int& readerReturnValue);
00215
00227 void setSeqIDModulus(unsigned int seqIDModulus);
00228
00234 bool flushData();
00235
00240 void startRun(run_id_t runID);
00241
00245 void startSubrun();
00246
00251 subrun_id_t subrunID() const { return subrun_id_; }
00252
00257 bool endRun();
00258
00263 bool endSubrun();
00264
00268 void sendMetrics();
00269
00274 size_t incompleteEventCount() const { return events_.size(); }
00275
00280 void setRequestMode(detail::RequestMessageMode mode) { request_mode_ = mode; }
00281
00282 private:
00283
00284
00285 size_t const num_fragments_per_event_;
00286 size_t const max_queue_size_;
00287 size_t const max_incomplete_count_;
00288 run_id_t run_id_;
00289 subrun_id_t subrun_id_;
00290 EventMap events_;
00291 RawEventQueue& queue_;
00292 std::chrono::steady_clock::time_point reader_thread_launch_time_;
00293 std::future<int> reader_thread_;
00294
00295 bool send_requests_;
00296 std::mutex request_mutex_;
00297 std::map<Fragment::sequence_id_t, Fragment::timestamp_t> active_requests_;
00298 int request_port_;
00299 size_t request_delay_;
00300 int request_socket_;
00301 struct sockaddr_in request_addr_;
00302 std::string multicast_out_addr_;
00303 detail::RequestMessageMode request_mode_;
00304
00305 unsigned int seqIDModulus_;
00306 sequence_id_t lastFlushedSeqID_;
00307 sequence_id_t highestSeqIDSeen_;
00308
00309 artdaq::detail::seconds const enq_timeout_;
00310 size_t enq_check_count_;
00311 bool const printSummaryStats_;
00312
00313 int incomplete_event_report_interval_ms_;
00314 std::chrono::steady_clock::time_point last_incomplete_event_report_time_;
00315
00316 bool send_routing_tokens_;
00317 int token_port_;
00318 int token_socket_;
00319 struct sockaddr_in token_addr_;
00320 std::string token_address_;
00321
00322 int art_thread_wait_ms_;
00323
00324 private:
00325 void initStatistics_();
00326
00327 void reportStatistics_();
00328
00329 void setup_requests_(std::string trigger_addr);
00330
00331 void send_request_();
00332
00333 void do_send_request_();
00334
00335 void setup_tokens_();
00336
00337 void send_routing_token_(int nSlots);
00338 };
00339 }
00340 #endif