1 #include "artdaq/DAQdata/Globals.hh"
2 #define TRACE_NAME (app_name + "_TokenSender").c_str()
10 #include "artdaq/DAQrate/detail/TokenSender.hh"
12 #include "artdaq-core/Core/StatisticsCollection.hh"
14 #include "artdaq/DAQrate/detail/RoutingPacket.hh"
15 #include "cetlib_except/exception.h"
20 , send_routing_tokens_(pset.get<bool>(
"use_routing_manager", false))
21 , token_port_(pset.get<int>(
"routing_token_port", 35555))
23 , token_address_(pset.get<std::string>(
"routing_manager_hostname",
"localhost"))
27 TLOG(TLVL_DEBUG + 32) <<
"TokenSender CONSTRUCTOR";
30 TLOG(TLVL_DEBUG + 35) <<
"artdaq::TokenSender::TokenSender ctor - reader_thread_ initialized";
36 TLOG(TLVL_INFO) <<
"Shutting down TokenSender, token_socket_: " << token_socket_;
38 if (token_socket_ != -1)
40 if (shutdown(token_socket_, 2) != 0 && errno == ENOTSOCK)
42 TLOG(TLVL_ERROR) <<
"Shutdown of token_socket_ resulted in ENOTSOCK. NOT Closing file descriptor!";
52 void TokenSender::setup_tokens_()
54 if (send_routing_tokens_)
56 TLOG(TLVL_DEBUG + 32) <<
"Creating Routing Token sending socket";
57 auto start_time = std::chrono::steady_clock::now();
58 while (token_socket_ < 0 && TimeUtils::GetElapsedTime(start_time) < 30)
61 if (token_socket_ < 0)
63 TLOG(TLVL_DEBUG + 33) <<
"Waited " << TimeUtils::GetElapsedTime(start_time) <<
" s for Routing Manager to open token socket";
67 if (token_socket_ < 0)
69 TLOG(TLVL_ERROR) <<
"I failed to create the socket for sending Routing Tokens! err=" << strerror(errno);
72 TLOG(TLVL_INFO) <<
"Routing Token sending socket created successfully for address " << token_address_;
76 void TokenSender::send_routing_token_(
int nSlots,
int run_number,
int rank)
78 TLOG(TLVL_DEBUG + 33) <<
"send_routing_token_ called, send_routing_tokens_=" << std::boolalpha << send_routing_tokens_;
79 if (!send_routing_tokens_)
83 if (token_socket_ == -1)
87 detail::RoutingToken token;
88 token.header = TOKEN_MAGIC;
90 token.new_slots_free = nSlots;
91 token.run_number = run_number;
93 TLOG(TLVL_DEBUG + 33) <<
"Sending RoutingToken to " << token_address_ <<
":" << token_port_;
95 while (sts <
sizeof(detail::RoutingToken))
97 auto res = send(token_socket_, reinterpret_cast<uint8_t*>(&token) + sts,
sizeof(detail::RoutingToken) - sts, 0);
100 TLOG(TLVL_WARNING) <<
"Error on token_socket, reconnecting";
101 close(token_socket_);
109 tokens_sent_ += nSlots;
110 TLOG(TLVL_DEBUG + 33) <<
"Done sending RoutingToken to " << token_address_ <<
":" << token_port_;
115 while (!initialized_)
119 if (!send_routing_tokens_)
123 boost::thread token([=] { send_routing_token_(nSlots, run_number, rank); });
int TCPConnect(char const *host_in, int dflt_port, int64_t flags=0, int sndbufsiz=0)
Connect to a host on a given port.
void SendRoutingToken(int nSlots, int run_number, int rank=my_rank)
Send a RoutingToken message indicating that slots are available.
The RoutingToken contains the magic bytes, the rank of the token sender, and the number of slots free...
virtual ~TokenSender()
TokenSender Destructor.
TokenSender()=delete
Default Constructor is deleted.