artdaq  v3_02_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 
137  size_t process_event_table();
138 
150 
156  std::string report(std::string const&) const;
157 
158 private:
159  void receive_tokens_();
160  void start_recieve_token_thread_();
161 
162  art::RunID run_id_;
163 
164  fhicl::ParameterSet policy_pset_;
165  int rt_priority_;
166 
167  size_t max_table_update_interval_ms_;
168  size_t max_ack_cycle_count_;
169  detail::RoutingMasterMode routing_mode_;
170  size_t current_table_interval_ms_;
171  std::atomic<size_t> table_update_count_;
172  std::atomic<size_t> received_token_count_;
173  std::unordered_map<int,size_t> received_token_counter_;
174 
175  std::vector<int> sender_ranks_;
176  size_t num_receivers_;
177 
178  std::unique_ptr<RoutingMasterPolicy> policy_;
179 
180  std::atomic<bool> shutdown_requested_;
181  std::atomic<bool> stop_requested_;
182  std::atomic<bool> pause_requested_;
183 
184  // attributes and methods for statistics gathering & reporting
185  artdaq::StatisticsHelper statsHelper_;
186 
187  std::string buildStatisticsString_() const;
188 
189  artdaq::MetricManager metricMan_;
190 
191  void sendMetrics_();
192 
193 
194  // FHiCL-configurable variables. Note that the C++ variable names
195  // are the FHiCL variable names with a "_" appended
196  int receive_token_port_;
197  int send_tables_port_;
198  int receive_acks_port_;
199  std::string send_tables_address_;
200  std::string receive_address_;
201  struct sockaddr_in send_tables_addr_;
202  std::vector<epoll_event> receive_ack_events_;
203  std::vector<epoll_event> receive_token_events_;
204  std::unordered_map<int, std::string> receive_token_addrs_;
205  int token_epoll_fd_;
206 
207  //Socket parameters
208  int token_socket_;
209  int table_socket_;
210  int ack_socket_;
211  mutable std::mutex request_mutex_;
212  boost::thread ev_token_receive_thread_;
213 
214 };
215 
216 #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...
size_t 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.
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.
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 send_event_table(detail::RoutingPacket table)
Sends a detail::RoutingPacket to the table receivers.