artdaq  v3_03_00
RoutingMasterCore.hh
1 #ifndef artdaq_Application_MPI2_RoutingMasterCore_hh
2 #define artdaq_Application_MPI2_RoutingMasterCore_hh
3 
4 #include <string>
5 #include <vector>
6 
7 // Socket Includes
8 #include <netinet/in.h>
9 #include <sys/epoll.h>
10 
11 #include "fhiclcpp/ParameterSet.h"
12 #include "canvas/Persistency/Provenance/RunID.h"
13 
14 #include "artdaq-utilities/Plugins/MetricManager.hh"
15 
16 #include "artdaq/Application/StatisticsHelper.hh"
17 #include "artdaq/DAQrate/detail/RoutingPacket.hh"
18 #include "artdaq/Application/Routing/RoutingMasterPolicy.hh"
19 #include "artdaq/DAQrate/detail/FragCounter.hh"
20 
21 namespace artdaq
22 {
23  class RoutingMasterCore;
24 }
25 
32 {
33 public:
34  static const std::string TABLE_UPDATES_STAT_KEY;
35  static const std::string TOKENS_RECEIVED_STAT_KEY;
36 
41 
45  RoutingMasterCore(RoutingMasterCore const&) = delete;
46 
51 
57 
81  bool initialize(fhicl::ParameterSet const& pset, uint64_t, uint64_t);
82 
88  bool start(art::RunID id, uint64_t, uint64_t);
89 
94  bool stop(uint64_t, uint64_t);
95 
100  bool pause(uint64_t, uint64_t);
101 
106  bool resume(uint64_t, uint64_t);
107 
112  bool shutdown(uint64_t);
113 
121  bool soft_initialize(fhicl::ParameterSet const& pset, uint64_t timeout, uint64_t timestamp);
122 
130  bool reinitialize(fhicl::ParameterSet const& pset, uint64_t timeout, uint64_t timestamp);
131 
136  void process_event_table();
137 
149 
155  std::string report(std::string const&) const;
156 
161  size_t get_update_count() const { return table_update_count_; }
162 
163 private:
164  void receive_tokens_();
165  void start_recieve_token_thread_();
166 
167  art::RunID run_id_;
168 
169  fhicl::ParameterSet policy_pset_;
170  int rt_priority_;
171 
172  size_t max_table_update_interval_ms_;
173  size_t max_ack_cycle_count_;
174  detail::RoutingMasterMode routing_mode_;
175  std::atomic<size_t> current_table_interval_ms_;
176  std::atomic<size_t> table_update_count_;
177  std::atomic<size_t> received_token_count_;
178  std::unordered_map<int, size_t> received_token_counter_;
179 
180  std::vector<int> sender_ranks_;
181  size_t num_receivers_;
182 
183  std::unique_ptr<RoutingMasterPolicy> policy_;
184 
185  std::atomic<bool> shutdown_requested_;
186  std::atomic<bool> stop_requested_;
187  std::atomic<bool> pause_requested_;
188 
189  // attributes and methods for statistics gathering & reporting
190  artdaq::StatisticsHelper statsHelper_;
191 
192  std::string buildStatisticsString_() const;
193 
194  void sendMetrics_();
195 
196 
197  // FHiCL-configurable variables. Note that the C++ variable names
198  // are the FHiCL variable names with a "_" appended
199  int receive_token_port_;
200  int send_tables_port_;
201  int receive_acks_port_;
202  std::string send_tables_address_;
203  std::string receive_address_;
204  struct sockaddr_in send_tables_addr_;
205  std::vector<epoll_event> receive_ack_events_;
206  std::vector<epoll_event> receive_token_events_;
207  std::unordered_map<int, std::string> receive_token_addrs_;
208  int token_epoll_fd_;
209 
210  //Socket parameters
211  int token_socket_;
212  int table_socket_;
213  int ack_socket_;
214  mutable std::mutex request_mutex_;
215  boost::thread ev_token_receive_thread_;
216 
217 };
218 
219 #endif /* artdaq_Application_MPI2_RoutingMasterCore_hh */
This class manages MonitoredQuantity instances for the *Core classes.
bool resume(uint64_t, uint64_t)
Resumes the RoutingMasterCore.
RoutingMasterMode
Mode indicating whether the RoutingMaster is routing events by Sequence ID or by Send Count...
bool soft_initialize(fhicl::ParameterSet const &pset, uint64_t timeout, uint64_t timestamp)
Soft-Initializes the RoutingMasterCore.
static const std::string TOKENS_RECEIVED_STAT_KEY
Key for the Tokens Received MonitoredQuantity.
bool reinitialize(fhicl::ParameterSet const &pset, uint64_t timeout, uint64_t timestamp)
Reinitializes the RoutingMasterCore.
RoutingMasterCore & operator=(RoutingMasterCore const &)=delete
Copy Assignment operator is deleted.
bool start(art::RunID id, uint64_t, uint64_t)
Start the RoutingMasterCore.
RoutingMasterCore()
RoutingMasterCore Constructor.
bool initialize(fhicl::ParameterSet const &pset, uint64_t, uint64_t)
Processes the initialize request.
size_t get_update_count() const
Get the number of table updates sent by this RoutingMaster this run.
bool pause(uint64_t, uint64_t)
Pauses the RoutingMasterCore.
std::vector< RoutingPacketEntry > RoutingPacket
A RoutingPacket is simply a vector of RoutingPacketEntry objects. It is not suitable for network tran...
bool stop(uint64_t, uint64_t)
Stops the RoutingMasterCore.
std::string report(std::string const &) const
Send a report on the current status of the RoutingMasterCore.
static const std::string TABLE_UPDATES_STAT_KEY
Key for Table Update count MonnitoredQuantity.
bool shutdown(uint64_t)
Shuts Down the RoutingMasterCore.
RoutingMasterCore implements the state machine for the RoutingMaster artdaq application. RoutingMasterCore collects tokens from receivers, and at regular intervals uses these tokens to build Routing Tables that are sent to the senders.
void process_event_table()
Main loop of the RoutingMasterCore. Determines when to send the next table update, asks the RoutingMasterPolicy for the table to send, and sends it.
void send_event_table(detail::RoutingPacket table)
Sends a detail::RoutingPacket to the table receivers.