artdaq  v3_09_01
BrokenTransferTest.hh
1 #ifndef artdaq_test_TransferPlugins_BrokenTransferTest_hh
2 #define artdaq_test_TransferPlugins_BrokenTransferTest_hh
3 
4 #include "artdaq-core/Core/SharedMemoryManager.hh"
5 #include "artdaq-core/Data/Fragment.hh"
6 #include "artdaq/TransferPlugins/TransferInterface.hh"
7 
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>
13 #include <mutex>
14 #include <unordered_set>
15 
16 namespace artdaqtest {
21 {
22 public:
26  struct Config
27  {
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"};
46  };
47 
52  BrokenTransferTest(const fhicl::ParameterSet& ps);
53 
57  void TestSenderPause();
61  void TestReceiverPause();
65  void TestSenderReconnect();
70  void TestReceiverReconnect(int send_throttle_us = 0);
71 
72 private:
73  struct received_event
74  {
75  artdaq::Fragment first_frag;
76  artdaq::Fragment second_frag;
77  std::chrono::steady_clock::time_point open_time;
78  };
79 
80  fhicl::ParameterSet make_transfer_ps_(int sender_rank, int receiver_rank, const std::string& name);
81 
82  void start_test_();
83  void stop_test_();
84 
85  void do_sending_(int sender_rank);
86  void do_receiving_(int sender_rank, int receiver_rank);
87 
88  artdaq::Fragment::sequence_id_t sequence_id_target_();
89  void usleep_for_n_fragments_(size_t n)
90  {
91  // n Fragments * 1000000 us/s / fragment_rate_hz_ fragments/s ==> usecs for n Fragments
92  usleep(n * 1000000 / fragment_rate_hz_);
93  }
94  void usleep_for_n_buffer_epochs_(size_t n)
95  {
96  usleep_for_n_fragments_(n * (event_buffer_count_ + transfer_buffer_count_));
97  }
98 
99  std::string fm_(double data, const std::string& units, int logt = 0);
100 
101  boost::thread sender_threads_[2];
102  boost::thread receiver_threads_[2];
103 
104  std::unordered_map<size_t, std::atomic<bool>> sender_ready_;
105  std::unordered_map<size_t, std::atomic<bool>> receiver_ready_;
106 
107  std::unordered_map<size_t, std::atomic<artdaq::Fragment::sequence_id_t>> sender_current_fragment_;
108  std::unordered_map<size_t, std::atomic<int>> sender_tokens_;
109 
110  fhicl::ParameterSet ps_;
111 
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_;
120 
121  std::atomic<bool> reliable_mode_;
122  size_t fragment_size_;
123  size_t send_timeout_us_;
124 
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_;
134 };
135 } // namespace artdaqtest
136 
137 #endif // artdaq_test_TransferPlugins_BrokenTransferTest_hh
fhicl::Atom< bool > reliable_mode
&quot;reliable_mode&quot; (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
&quot;transfer_buffer_count&quot; (Default: 10): The number of buffers in the Transfer Plugins ...
void TestReceiverReconnect(int send_throttle_us=0)
Run the &quot;Receiver Reconnect&quot; test
fhicl::Atom< size_t > event_buffer_timeout_us
&quot;event_buffer_timeout_us&quot; (Default: 1000000): The timeout for &quot;EventBuilder&quot; buffers to be marked inc...
fhicl::Atom< size_t > fragment_size
&quot;fragment_size&quot; (Default: 0x10000): The size of generated Fragments, in Fragment words ...
fhicl::Atom< size_t > event_buffer_count
&quot;event_buffer_count&quot; (Default: 20): The number of &quot;EventBuilder&quot; buffers on the receiver end ...
fhicl::Table< artdaq::TransferInterface::Config > default_transfer_ps
&quot;default_transfer_ps&quot; (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
&quot;fragment_rate_hz&quot; (Default: 10): The rate at which to generate Fragments, in Hz
fhicl::Atom< size_t > send_timeout_us
&quot;send_timeout_us&quot; (Default: 100000): The timeout for min-blocking mode sends
fhicl::Atom< std::string > transfer_to_use
&quot;transfer_to_use&quot; (Default: &quot;Shmem&quot;): The name of the Transfer Plugin to use
Configuration parameters for BrokenTransferTest
void TestSenderReconnect()
Run the &quot;Sender Reconnect&quot; test
void TestSenderPause()
Run the &quot;Sender Paused&quot; test
void TestReceiverPause()
Run the &quot;Receiver Paused&quot; test