artdaq  v3_06_00
RequestSender.hh
1 #ifndef artdaq_DAQrate_RequestSender_hh
2 #define artdaq_DAQrate_RequestSender_hh
3 
4 #include "artdaq/DAQdata/Globals.hh" // Before trace.h gets included in ConcurrentQueue (from GlobalQueue)
5 #include "artdaq-core/Data/RawEvent.hh"
6 #include "artdaq-utilities/Plugins/MetricManager.hh"
7 #include "artdaq/DAQrate/detail/RequestMessage.hh"
8 #include "fhiclcpp/ParameterSet.h"
9 #include "fhiclcpp/types/Table.h"
10 
11 #include <map>
12 #include <memory>
13 #include <chrono>
14 #include <future>
15 #include <stdint.h>
16 #include <arpa/inet.h>
17 #include <netinet/in.h>
18 #include <sys/types.h>
19 #include <sys/socket.h>
20 
21 namespace artdaq
22 {
23 
28  {
29  public:
36  {
38  fhicl::Atom<bool> use_routing_master{ fhicl::Name{ "use_routing_master" }, fhicl::Comment{ "True if using the Routing Master" }, false };
40  fhicl::Atom<int> routing_token_port{ fhicl::Name{ "routing_token_port" },fhicl::Comment{ "Port to send tokens on" },35555 };
42  fhicl::Atom<std::string> routing_token_host{ fhicl::Name{ "routing_master_hostname" }, fhicl::Comment{ "Hostname or IP of RoutingMaster" },"localhost" };
43  };
44 
48  struct Config
49  {
51  fhicl::Atom<bool> send_requests{ fhicl::Name{ "send_requests" }, fhicl::Comment{ "Enable sending Data Request messages" }, false };
53  fhicl::Atom<int> request_port{ fhicl::Name{"request_port"}, fhicl::Comment{"Port to send DataRequests on"},3001 };
55  fhicl::Atom<size_t> request_delay_ms{ fhicl::Name{"request_delay_ms"}, fhicl::Comment{"How long to wait before sending new DataRequests"}, 10 };
57  fhicl::Atom<size_t> request_shutdown_timeout_us{ fhicl::Name{ "request_shutdown_timeout_us"},fhicl::Comment{"How long to wait for pending requests to be sent at shutdown"}, 100000 };
59  fhicl::Atom<std::string> output_address{ fhicl::Name{ "multicast_interface_ip"}, fhicl::Comment{"Use this hostname for multicast output(to assign to the proper NIC)" }, "0.0.0.0" };
61  fhicl::Atom<std::string> request_address{ fhicl::Name{"request_address"}, fhicl::Comment{ "Multicast address to send DataRequests to" }, "227.128.12.26" };
62  fhicl::Table<RoutingTokenConfig> routing_token_config{ fhicl::Name{"routing_token_config"}, fhicl::Comment{"FHiCL table containing RoutingToken configuration"} };
63  };
65  using Parameters = fhicl::WrappedTable<Config>;
66 
70  RequestSender() = delete;
71 
75  RequestSender(RequestSender const&) = delete;
76 
81  RequestSender& operator=(RequestSender const&) = delete;
82 
87  RequestSender(const fhicl::ParameterSet& pset);
91  virtual ~RequestSender();
92 
93 
99 
104  detail::RequestMessageMode GetRequestMode() const { return request_mode_; }
105 
110  void SendRequest(bool endOfRunOnly = false);
111 
117  void AddRequest(Fragment::sequence_id_t seqID, Fragment::timestamp_t timestamp);
118 
123  void RemoveRequest(Fragment::sequence_id_t seqID);
124 
130  void SendRoutingToken(int nSlots, int run_number);
131 
136  size_t GetSentTokenCount() const { return tokens_sent_.load(); }
137 
142  void SetRunNumber(uint32_t run) { run_number_ = run; }
143  private:
144 
145  // Request stuff
146  bool send_requests_;
147  std::atomic<bool> initialized_;
148  mutable std::mutex request_mutex_;
149  mutable std::mutex request_send_mutex_;
150  std::map<Fragment::sequence_id_t, Fragment::timestamp_t> active_requests_;
151  std::string request_address_;
152  int request_port_;
153  size_t request_delay_;
154  size_t request_shutdown_timeout_us_;
155  int request_socket_;
156  struct sockaddr_in request_addr_;
157  std::string multicast_out_addr_;
158  detail::RequestMessageMode request_mode_;
159 
160  bool send_routing_tokens_;
161  int token_port_;
162  int token_socket_;
163  std::string token_address_;
164  std::atomic<int> request_sending_;
165  std::atomic<size_t> tokens_sent_;
166  uint32_t run_number_;
167 
168  private:
169  void setup_requests_();
170 
171  void do_send_request_();
172 
173  void setup_tokens_();
174 
175  void send_routing_token_(int nSlots, int run_number);
176  };
177 }
178 #endif /* artdaq_DAQrate_RequestSender_hh */
void RemoveRequest(Fragment::sequence_id_t seqID)
Remove a request from the request list.
size_t GetSentTokenCount() const
Get the count of number of tokens sent.
fhicl::Atom< bool > use_routing_master
&quot;use_routing_master&quot; (Default: false) : Whether to send tokens to a RoutingMaster ...
detail::RequestMessageMode GetRequestMode() const
Get the mode for RequestMessages.
fhicl::Atom< int > request_port
&quot;request_port&quot; (Default: 3001): Port to send DataRequests on
The RequestSender contains methods used to send data requests and Routing tokens. ...
void SendRoutingToken(int nSlots, int run_number)
Send a RoutingToken message indicating that slots are available.
virtual ~RequestSender()
RequestSender Destructor.
void SendRequest(bool endOfRunOnly=false)
Send a request message containing all current requests.
fhicl::Atom< bool > send_requests
&quot;send_requests&quot; (Default: false): Whether to send DataRequests when new sequence IDs are seen ...
Configuration for Routing token sending
RequestSender()=delete
Default Constructor is deleted.
void SetRunNumber(uint32_t run)
Set the run number to be used in request messages.
fhicl::WrappedTable< Config > Parameters
Used for ParameterSet validation (if desired)
fhicl::Atom< std::string > output_address
&quot;multicast_interface_ip&quot; (Default: &quot;0.0.0.0&quot;): Use this hostname for multicast output (to assign to t...
void SetRequestMode(detail::RequestMessageMode mode)
Set the mode for RequestMessages. Used to indicate when RequestSender should enter &quot;EndOfRun&quot; mode...
RequestMessageMode
Mode used to indicate current run conditions to the request receiver.
fhicl::Atom< size_t > request_shutdown_timeout_us
&quot;request_shutdown_timeout_us&quot; (Default: 100000 us): How long to wait for pending requests to be sent ...
fhicl::Table< RoutingTokenConfig > routing_token_config
Configuration for sending RoutingTokens. See artdaq::RequestSender::RoutingTokenConfig.
fhicl::Atom< std::string > routing_token_host
&quot;routing_master_hostname&quot; (Default: &quot;localhost&quot;) : Hostname or IP of RoutingMaster ...
RequestSender & operator=(RequestSender const &)=delete
Copy Assignment operator is deleted.
fhicl::Atom< size_t > request_delay_ms
&quot;request_delay_ms&quot; (Default: 10): How long to wait before sending new DataRequests ...
fhicl::Atom< int > routing_token_port
&quot;routing_token_port&quot; (Default: 35555) : Port to send tokens on
fhicl::Atom< std::string > request_address
&quot;request_address&quot; (Default: &quot;227.128.12.26&quot;): Multicast address to send DataRequests to ...
void AddRequest(Fragment::sequence_id_t seqID, Fragment::timestamp_t timestamp)
Add a request to the request list.
Configuration of the RequestSender. May be used for parameter validation