artdaq  v3_12_02
TransferOutput_module.cc
1 #include "TRACE/tracemf.h"
2 #define TRACE_NAME "TransferOutput"
3 #include "artdaq/ArtModules/ArtdaqOutput.hh"
4 
5 #include <csignal>
6 #include "art/Framework/Core/ModuleMacros.h"
7 #include "artdaq/DAQdata/NetMonHeader.hh"
8 #include "artdaq/TransferPlugins/MakeTransferPlugin.hh"
9 #include "artdaq/TransferPlugins/TransferInterface.hh"
10 
11 namespace art {
12 class TransferOutput;
13 }
14 
21 {
22 public:
30  explicit TransferOutput(fhicl::ParameterSet const& ps);
31 
35  ~TransferOutput() override;
36 
37 protected:
42  void SendMessage(artdaq::FragmentPtr& fragment) override;
43 
44 private:
45  TransferOutput(TransferOutput const&) = delete;
46  TransferOutput(TransferOutput&&) = delete;
47  TransferOutput& operator=(TransferOutput const&) = delete;
48  TransferOutput& operator=(TransferOutput&&) = delete;
49 
50  size_t send_timeout_us_;
51  size_t send_retry_count_;
52  std::unique_ptr<artdaq::TransferInterface> transfer_;
53 };
54 
55 art::TransferOutput::TransferOutput(fhicl::ParameterSet const& ps)
56  : ArtdaqOutput(ps), send_timeout_us_(ps.get<size_t>("send_timeout_us", 5000000)), send_retry_count_(ps.get<size_t>("send_retry_count", 5))
57 {
58  TLOG(TLVL_DEBUG + 32) << "Begin: TransferOutput::TransferOutput(ParameterSet const& ps)";
59  transfer_ = artdaq::MakeTransferPlugin(ps, "transfer_plugin", artdaq::TransferInterface::Role::kSend);
60  TLOG(TLVL_DEBUG + 32) << "END: TransferOutput::TransferOutput";
61 }
62 
64 {
65  TLOG(TLVL_DEBUG + 32) << "Begin: TransferOutput::~TransferOutput()";
66 
67  auto sts = transfer_->transfer_fragment_min_blocking_mode(*artdaq::Fragment::eodFrag(0), 10000);
69  {
70  TLOG(TLVL_ERROR) << "Error sending EOD Fragment!";
71  }
72  transfer_.reset(nullptr);
73  TLOG(TLVL_DEBUG + 32) << "End: TransferOutput::~TransferOutput()";
74 }
75 
76 void art::TransferOutput::SendMessage(artdaq::FragmentPtr& fragment)
77 {
78  TLOG(TLVL_DEBUG + 32) << "Sending message with sequenceID=" << fragment->sequenceID() << ", type=" << static_cast<int>(fragment->type())
79  << ", length=" << fragment->dataSizeBytes();
81  size_t retries = 0;
82  while (sts != artdaq::TransferInterface::CopyStatus::kSuccess && retries <= send_retry_count_)
83  {
84  sts = transfer_->transfer_fragment_min_blocking_mode(*fragment, send_timeout_us_);
85  retries++;
86  }
87  if (retries > send_retry_count_)
88  {
89  TLOG(TLVL_ERROR) << "Error communicating with remote after " << retries << " tries. Closing art process";
90  kill(getpid(), SIGUSR2);
91  }
92 
93 #if 0
94  if (messageType == artdaq::Fragment::InitFragmentType)
95  {
96  std::fstream ostream("sendInitMessage_TransferOutput.bin", std::ios::out | std::ios::binary);
97  ostream.write(msg.Buffer(), msg.Length());
98  ostream.close();
99  }
100 #endif
101 }
102 
103 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...
Definition: ArtdaqOutput.hh:88
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.