1 #ifndef artdaq_test_TransferPlugins_BrokenTransferTest_hh
2 #define artdaq_test_TransferPlugins_BrokenTransferTest_hh
4 #include "TRACE/tracemf.h"
5 #include "artdaq-core/Data/Fragment.hh"
7 #include "artdaq-core/Core/SharedMemoryManager.hh"
8 #include "artdaq/TransferPlugins/TransferInterface.hh"
10 #include <fhiclcpp/ParameterSet.h>
11 #include <fhiclcpp/types/Atom.h>
12 #include <fhiclcpp/types/Comment.h>
13 #include <fhiclcpp/types/ConfigurationTable.h>
14 #include <fhiclcpp/types/Name.h>
15 #include <fhiclcpp/types/Table.h>
17 #include <boost/thread.hpp>
19 #include <condition_variable>
21 #include <unordered_set>
23 namespace artdaqtest {
36 fhicl::Atom<size_t>
fragment_rate_hz{fhicl::Name{
"fragment_rate_hz"}, fhicl::Comment{
"The rate at which to generate Fragments, in Hz"}, 10};
38 fhicl::Atom<bool>
reliable_mode{fhicl::Name{
"reliable_mode"}, fhicl::Comment{
"Whether to use reliable-mode transfers (true) or min-blocking (false)"},
true};
40 fhicl::Atom<size_t>
fragment_size{fhicl::Name{
"fragment_size"}, fhicl::Comment{
"The size of generated Fragments, in Fragment words"}, 0x10000};
42 fhicl::Atom<size_t>
send_timeout_us{fhicl::Name{
"send_timeout_us"}, fhicl::Comment{
"The timeout for min-blocking mode sends"}, 100000};
44 fhicl::Atom<size_t>
transfer_buffer_count{fhicl::Name{
"transfer_buffer_count"}, fhicl::Comment{
"The number of buffers in the Transfer Plugins"}, 10};
46 fhicl::Atom<size_t>
event_buffer_count{fhicl::Name{
"event_buffer_count"}, fhicl::Comment{
"The number of \"EventBuilder\" buffers on the receiver end"}, 20};
48 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};
50 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"}};
52 fhicl::Atom<std::string>
transfer_to_use{fhicl::Name{
"transfer_to_use"}, fhicl::Comment{
"The name of the Transfer Plugin to use"},
"Shmem"};
82 artdaq::FragmentPtr first_frag;
83 artdaq::FragmentPtr second_frag;
84 std::chrono::steady_clock::time_point open_time;
87 fhicl::ParameterSet make_transfer_ps_(
int sender_rank,
int receiver_rank,
const std::string& name);
92 void do_sending_(
int sender_rank);
93 void do_receiving_(
int sender_rank,
int receiver_rank);
95 void throttle_sender_(
int sender_rank);
96 artdaq::Fragment::sequence_id_t sequence_id_target_();
97 void usleep_for_n_fragments_(
size_t n)
100 usleep(n * 1000000 / fragment_rate_hz_);
102 void usleep_for_n_buffer_epochs_(
size_t n)
104 usleep_for_n_fragments_(n * (event_buffer_count_ + transfer_buffer_count_));
107 std::string fm_(
double data,
const std::string& units,
int logt = 0);
109 boost::thread sender_threads_[2];
110 boost::thread receiver_threads_[2];
112 std::array<std::atomic<bool>, 2> sender_ready_;
113 std::array<std::atomic<bool>, 2> receiver_ready_;
115 std::array<std::atomic<artdaq::Fragment::sequence_id_t>, 2> sender_current_fragment_;
116 std::array<std::atomic<int>, 2> sender_tokens_;
118 fhicl::ParameterSet ps_;
120 std::chrono::steady_clock::time_point test_start_time_;
121 std::chrono::steady_clock::time_point test_end_time_;
122 std::atomic<bool> test_end_requested_;
123 std::atomic<size_t> fragment_rate_hz_;
124 std::atomic<bool> pause_first_sender_;
125 std::atomic<bool> pause_receiver_;
126 std::atomic<bool> kill_first_sender_;
127 std::atomic<bool> kill_receiver_;
129 std::atomic<bool> reliable_mode_;
130 size_t fragment_size_;
131 size_t send_timeout_us_;
133 std::map<artdaq::Fragment::sequence_id_t, received_event> event_buffer_;
134 std::set<artdaq::Fragment::sequence_id_t> timeout_events_;
135 std::set<artdaq::Fragment::sequence_id_t> complete_events_;
136 size_t transfer_buffer_count_;
137 size_t event_buffer_count_;
138 size_t event_buffer_timeout_us_;
139 int send_throttle_us_;
140 std::mutex event_buffer_mutex_;
141 std::condition_variable event_buffer_cv_;
145 #endif // artdaq_test_TransferPlugins_BrokenTransferTest_hh
fhicl::Atom< bool > reliable_mode
"reliable_mode" (Default: true): Whether to use reliable-mode transfers (true) or min-blocking (false...
BrokenTransferTest(const fhicl::ParameterSet &ps)
BrokenTransferTest Constructor
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 ...
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 TestReceiverReconnect(int send_throttle_factor=0)
Run the "Receiver Reconnect" test
void TestReceiverPause()
Run the "Receiver Paused" test