artdaq  v3_06_00
TransferOutput_module.cc
1 #define TRACE_NAME "TransferOutput"
2 #include "artdaq/ArtModules/ArtdaqOutput.hh"
3 
4 #include "artdaq/DAQdata/NetMonHeader.hh"
5 #include "artdaq/TransferPlugins/MakeTransferPlugin.hh"
6 #include "artdaq/TransferPlugins/TransferInterface.hh"
7 
8 
9 namespace art {
10 class TransferOutput;
11 }
12 
19  public:
27  explicit TransferOutput(fhicl::ParameterSet const& ps);
28 
33 
34  protected:
35 
42  virtual void SendMessage(artdaq::Fragment::sequence_id_t sequenceId, artdaq::Fragment::type_t messageType, TBufferFile & msg);
43 
44  private:
45  size_t send_timeout_us_;
46  size_t send_retry_count_;
47  std::unique_ptr<artdaq::TransferInterface> transfer_;
48 
49 };
50 
51 art::TransferOutput::TransferOutput(fhicl::ParameterSet const& ps)
52  : ArtdaqOutput(ps),
53  send_timeout_us_(ps.get<size_t>("send_timeout_us", 5000000)),
54  send_retry_count_(ps.get<size_t>("send_retry_count", 5)) {
55  TLOG(TLVL_DEBUG) << "Begin: TransferOutput::TransferOutput(ParameterSet const& ps)";
56  transfer_ = artdaq::MakeTransferPlugin(ps, "transfer_plugin", artdaq::TransferInterface::Role::kSend);
57  TLOG(TLVL_DEBUG) << "END: TransferOutput::TransferOutput";
58 }
59 
61  TLOG(TLVL_DEBUG) << "Begin: TransferOutput::~TransferOutput()";
62 
63  auto sts = transfer_->transfer_fragment_reliable_mode(std::move(*artdaq::Fragment::eodFrag(0)));
64  if (sts != artdaq::TransferInterface::CopyStatus::kSuccess) TLOG(TLVL_ERROR) << "Error sending EOD Fragment!";
65  transfer_.reset(nullptr);
66  TLOG(TLVL_DEBUG) << "End: TransferOutput::~TransferOutput()";
67 }
68 
69 void art::TransferOutput::SendMessage(artdaq::Fragment::sequence_id_t sequenceId, artdaq::Fragment::type_t messageType, TBufferFile & msg) {
70  TLOG(TLVL_DEBUG) << "Sending message with sequenceID=" << sequenceId << ", type=" << (int)messageType
71  << ", length=" << msg.Length();
72  artdaq::NetMonHeader header;
73  header.data_length = static_cast<uint64_t>(msg.Length());
74  artdaq::Fragment fragment(std::ceil(msg.Length() / static_cast<double>(sizeof(artdaq::RawDataType))), sequenceId, 0,
75  messageType, header);
76 
77  memcpy(&*fragment.dataBegin(), msg.Buffer(), msg.Length());
79  size_t retries = 0;
80  while (sts != artdaq::TransferInterface::CopyStatus::kSuccess && retries <= send_retry_count_) {
81  sts = transfer_->transfer_fragment_min_blocking_mode(fragment, send_timeout_us_);
82  retries++;
83  }
84 
85 #if 0
86  if (messageType == artdaq::Fragment::InitFragmentType)
87  {
88  std::fstream ostream("sendInitMessage_TransferOutput.bin", std::ios::out | std::ios::binary);
89  ostream.write(msg.Buffer(), msg.Length());
90  ostream.close();
91  }
92 #endif
93 }
94 
95 DEFINE_ART_MODULE(art::TransferOutput)
This is the base class for artdaq OutputModules, providing the serialization interface for art Events...
Definition: ArtdaqOutput.hh:99
~TransferOutput()
TransferOutput Destructor.
std::unique_ptr< artdaq::TransferInterface > MakeTransferPlugin(const fhicl::ParameterSet &pset, std::string plugin_label, TransferInterface::Role role)
Load a TransferInterface plugin.
TransferOutput(fhicl::ParameterSet const &ps)
TransferOutput Constructor.
virtual void SendMessage(artdaq::Fragment::sequence_id_t sequenceId, artdaq::Fragment::type_t messageType, TBufferFile &msg)
Send a message using the Transfer Plugin
Header with length information for NetMonTransport messages.
Definition: NetMonHeader.hh:14
An art::OutputModule which sends events using DataSenderManager. This module is designed for transpor...
This TransferInterface is a Sender.
Some error occurred, but no exception was thrown.
The send operation completed successfully.
uint64_t data_length
The length of the message.
Definition: NetMonHeader.hh:16