1 #ifndef artdaq_test_TransferPlugins_BrokenTransferTest_hh
2 #define artdaq_test_TransferPlugins_BrokenTransferTest_hh
4 #include "artdaq-core/Core/SharedMemoryManager.hh"
5 #include "artdaq-core/Data/Fragment.hh"
6 #include "artdaq/TransferPlugins/TransferInterface.hh"
8 #include <fhiclcpp/ParameterSet.h>
9 #include <fhiclcpp/types/Atom.h>
10 #include <fhiclcpp/types/Table.h>
11 #include <boost/thread.hpp>
12 #include <condition_variable>
14 #include <unordered_set>
16 namespace artdaqtest {
29 fhicl::Atom<size_t>
fragment_rate_hz{fhicl::Name{
"fragment_rate_hz"}, fhicl::Comment{
"The rate at which to generate Fragments, in Hz"}, 10};
31 fhicl::Atom<bool>
reliable_mode{fhicl::Name{
"reliable_mode"}, fhicl::Comment{
"Whether to use reliable-mode transfers (true) or min-blocking (false)"},
true};
33 fhicl::Atom<size_t>
fragment_size{fhicl::Name{
"fragment_size"}, fhicl::Comment{
"The size of generated Fragments, in Fragment words"}, 0x10000};
35 fhicl::Atom<size_t>
send_timeout_us{fhicl::Name{
"send_timeout_us"}, fhicl::Comment{
"The timeout for min-blocking mode sends"}, 100000};
37 fhicl::Atom<size_t>
transfer_buffer_count{fhicl::Name{
"transfer_buffer_count"}, fhicl::Comment{
"The number of buffers in the Transfer Plugins"}, 10};
39 fhicl::Atom<size_t>
event_buffer_count{fhicl::Name{
"event_buffer_count"}, fhicl::Comment{
"The number of \"EventBuilder\" buffers on the receiver end"}, 20};
41 fhicl::Atom<size_t>
event_buffer_timeout_us{fhicl::Name{
"event_buffer_timeout_us"}, fhicl::Comment{
"The timeout for \"EventBuilder\" buffers to be marked incomplete and abandoned"}, 1000000};
43 fhicl::Table<artdaq::TransferInterface::Config>
default_transfer_ps{fhicl::Name{
"default_transfer_ps"}, fhicl::Comment{
"The default ParameterSet to use for transfers. Will have transferPluginType, destination_rank, buffer_count and source_rank overridden. If max_fragment_size_words is unspecified, will be set using fragment_size"}};
45 fhicl::Atom<std::string>
transfer_to_use{fhicl::Name{
"transfer_to_use"}, fhicl::Comment{
"The name of the Transfer Plugin to use"},
"Shmem"};
75 artdaq::Fragment first_frag;
76 artdaq::Fragment second_frag;
77 std::chrono::steady_clock::time_point open_time;
80 fhicl::ParameterSet make_transfer_ps_(
int sender_rank,
int receiver_rank, std::string name);
85 void do_sending_(
int sender_rank);
86 void do_receiving_(
int sender_rank,
int receiver_rank);
88 artdaq::Fragment::sequence_id_t sequence_id_target_();
89 void usleep_for_n_fragments_(
size_t n)
92 usleep(n * 1000000 / fragment_rate_hz_);
94 void usleep_for_n_buffer_epochs_(
size_t n)
96 usleep_for_n_fragments_(n * (event_buffer_count_ + transfer_buffer_count_));
99 std::string fm_(
double data, std::string units,
int logt = 0);
101 boost::thread sender_threads_[2];
102 boost::thread receiver_threads_[2];
104 std::atomic<bool> sender_ready_[2];
105 std::atomic<bool> receiver_ready_[2];
107 std::atomic<artdaq::Fragment::sequence_id_t> sender_current_fragment_[2];
108 std::atomic<int> sender_tokens_[2];
110 fhicl::ParameterSet ps_;
112 std::chrono::steady_clock::time_point test_start_time_;
113 std::chrono::steady_clock::time_point test_end_time_;
114 std::atomic<bool> test_end_requested_;
115 std::atomic<size_t> fragment_rate_hz_;
116 std::atomic<bool> pause_first_sender_;
117 std::atomic<bool> pause_receiver_;
118 std::atomic<bool> kill_first_sender_;
119 std::atomic<bool> kill_receiver_;
121 std::atomic<bool> reliable_mode_;
122 size_t fragment_size_;
123 size_t send_timeout_us_;
125 std::map<artdaq::Fragment::sequence_id_t, received_event> event_buffer_;
126 std::set<artdaq::Fragment::sequence_id_t> timeout_events_;
127 std::set<artdaq::Fragment::sequence_id_t> complete_events_;
128 size_t transfer_buffer_count_;
129 size_t event_buffer_count_;
130 size_t event_buffer_timeout_us_;
131 int send_throttle_us_;
132 std::mutex event_buffer_mutex_;
133 std::condition_variable event_buffer_cv_;
137 #endif // artdaq_test_TransferPlugins_BrokenTransferTest_hh
BrokenTransferTest(fhicl::ParameterSet ps)
BrokenTransferTest Constructor
fhicl::Atom< bool > reliable_mode
"reliable_mode" (Default: true): Whether to use reliable-mode transfers (true) or min-blocking (false...
A class which simulates several failure modes for TransferPlugins such as sender pause/restart and re...
fhicl::Atom< size_t > transfer_buffer_count
"transfer_buffer_count" (Default: 10): The number of buffers in the Transfer Plugins ...
void TestReceiverReconnect(int send_throttle_us=0)
Run the "Receiver Reconnect" test
fhicl::Atom< size_t > event_buffer_timeout_us
"event_buffer_timeout_us" (Default: 1000000): The timeout for "EventBuilder" buffers to be marked inc...
fhicl::Atom< size_t > fragment_size
"fragment_size" (Default: 0x10000): The size of generated Fragments, in Fragment words ...
fhicl::Atom< size_t > event_buffer_count
"event_buffer_count" (Default: 20): The number of "EventBuilder" buffers on the receiver end ...
fhicl::Table< artdaq::TransferInterface::Config > default_transfer_ps
"default_transfer_ps" (Default: {}): The default ParameterSet to use for transfers. Will have transferPluginType, destination_rank, buffer_count and source_rank overridden. If max_fragment_size_words is unspecified, will be set using fragment_size
fhicl::Atom< size_t > fragment_rate_hz
"fragment_rate_hz" (Default: 10): The rate at which to generate Fragments, in Hz
fhicl::Atom< size_t > send_timeout_us
"send_timeout_us" (Default: 100000): The timeout for min-blocking mode sends
fhicl::Atom< std::string > transfer_to_use
"transfer_to_use" (Default: "Shmem"): The name of the Transfer Plugin to use
Configuration parameters for BrokenTransferTest
void TestSenderReconnect()
Run the "Sender Reconnect" test
void TestSenderPause()
Run the "Sender Paused" test
void TestReceiverPause()
Run the "Receiver Paused" test