artdaq  v3_09_01
TransferOutput_module.cc
1 #define TRACE_NAME "TransferOutput"
2 #include "artdaq/ArtModules/ArtdaqOutput.hh"
3 
4 #include <csignal>
5 #include "artdaq/DAQdata/NetMonHeader.hh"
6 #include "artdaq/TransferPlugins/MakeTransferPlugin.hh"
7 #include "artdaq/TransferPlugins/TransferInterface.hh"
8 
9 namespace art {
10 class TransferOutput;
11 }
12 
19 {
20 public:
28  explicit TransferOutput(fhicl::ParameterSet const& ps);
29 
33  ~TransferOutput() override;
34 
35 protected:
40  void SendMessage(artdaq::FragmentPtr& fragment) override;
41 
42 private:
43  TransferOutput(TransferOutput const&) = delete;
44  TransferOutput(TransferOutput&&) = delete;
45  TransferOutput& operator=(TransferOutput const&) = delete;
46  TransferOutput& operator=(TransferOutput&&) = delete;
47 
48  size_t send_timeout_us_;
49  size_t send_retry_count_;
50  std::unique_ptr<artdaq::TransferInterface> transfer_;
51 };
52 
53 art::TransferOutput::TransferOutput(fhicl::ParameterSet const& ps)
54  : ArtdaqOutput(ps), send_timeout_us_(ps.get<size_t>("send_timeout_us", 5000000)), send_retry_count_(ps.get<size_t>("send_retry_count", 5))
55 {
56  TLOG(TLVL_DEBUG) << "Begin: TransferOutput::TransferOutput(ParameterSet const& ps)";
57  transfer_ = artdaq::MakeTransferPlugin(ps, "transfer_plugin", artdaq::TransferInterface::Role::kSend);
58  TLOG(TLVL_DEBUG) << "END: TransferOutput::TransferOutput";
59 }
60 
62 {
63  TLOG(TLVL_DEBUG) << "Begin: TransferOutput::~TransferOutput()";
64 
65  auto sts = transfer_->transfer_fragment_min_blocking_mode(*artdaq::Fragment::eodFrag(0), 10000);
67  {
68  TLOG(TLVL_ERROR) << "Error sending EOD Fragment!";
69  }
70  transfer_.reset(nullptr);
71  TLOG(TLVL_DEBUG) << "End: TransferOutput::~TransferOutput()";
72 }
73 
74 void art::TransferOutput::SendMessage(artdaq::FragmentPtr& fragment)
75 {
76  TLOG(TLVL_DEBUG) << "Sending message with sequenceID=" << fragment->sequenceID() << ", type=" << fragment->type()
77  << ", length=" << fragment->dataSizeBytes();
79  size_t retries = 0;
80  while (sts != artdaq::TransferInterface::CopyStatus::kSuccess && retries <= send_retry_count_)
81  {
82  sts = transfer_->transfer_fragment_min_blocking_mode(*fragment, send_timeout_us_);
83  retries++;
84  }
85  if (retries > send_retry_count_)
86  {
87  TLOG(TLVL_ERROR) << "Error communicating with remote after " << retries << " tries. Closing art process";
88  kill(getpid(), SIGUSR2);
89  }
90 
91 #if 0
92  if (messageType == artdaq::Fragment::InitFragmentType)
93  {
94  std::fstream ostream("sendInitMessage_TransferOutput.bin", std::ios::out | std::ios::binary);
95  ostream.write(msg.Buffer(), msg.Length());
96  ostream.close();
97  }
98 #endif
99 }
100 
101 DEFINE_ART_MODULE(art::TransferOutput)// NOLINT(performance-unnecessary-value-param)
This is the base class for artdaq OutputModules, providing the serialization interface for art Events...
std::unique_ptr< artdaq::TransferInterface > MakeTransferPlugin(const fhicl::ParameterSet &pset, const std::string &plugin_label, TransferInterface::Role role)
Load a TransferInterface plugin.
TransferOutput(fhicl::ParameterSet const &ps)
TransferOutput Constructor.
An art::OutputModule which sends events using DataSenderManager. This module is designed for transpor...
void SendMessage(artdaq::FragmentPtr &fragment) override
Send a message using the Transfer Plugin
This TransferInterface is a Sender.
Some error occurred, but no exception was thrown.
The send operation completed successfully.
~TransferOutput() override
TransferOutput Destructor.