DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
TriggerRecordBuilderData.hpp
Go to the documentation of this file.
1
11
12#ifndef DFMODULES_SRC_DFMODULES_TRIGGERRECORDBUILDERDATA_HPP_
13#define DFMODULES_SRC_DFMODULES_TRIGGERRECORDBUILDERDATA_HPP_
14
18
19#include "ers/Issue.hpp"
20#include "logging/Logging.hpp" // NOTE: if ISSUES ARE DECLARED BEFORE include logging/Logging.hpp, TLOG_DEBUG<<issue wont work.
21#include "nlohmann/json.hpp"
23
24#include <atomic>
25#include <chrono>
26#include <functional>
27#include <limits>
28#include <list>
29#include <memory>
30#include <mutex>
31#include <string>
32#include <utility>
33
34namespace dunedaq {
35// Disable coverage checking LCOV_EXCL_START
37 DFOThresholdsNotConsistent,
38 "Busy threshold (" << busy << ") is smaller than free threshold (" << free << ')',
39 ((size_t)busy)((size_t)free))
42 "The Trigger Decision with trigger number "
43 << trigger_number << " was not found for dataflow application at " << connection_name,
44 ((daqdataformats::trigger_number_t)trigger_number)((std::string)connection_name))
46 NoSlotsAvailable,
47 "The Trigger Decision with trigger number "
48 << trigger_number << " could not be assigned to the dataflow application at " << connection_name
49 << " because no slots were available.",
50 ((daqdataformats::trigger_number_t)trigger_number)((std::string)connection_name))
51// Re-enable coverage checking LCOV_EXCL_STOP
52
53namespace dfmodules {
54struct AssignedTriggerDecision
55{
57 std::chrono::steady_clock::time_point assigned_time;
58 std::string connection_name;
59
60 AssignedTriggerDecision(dfmessages::TriggerDecision dec, std::string conn_name)
61 : decision(dec)
62 , assigned_time(std::chrono::steady_clock::now())
63 , connection_name(conn_name)
64 {
65 }
66};
67
68class TriggerRecordBuilderData : public opmonlib::MonitorableObject
69{
70public:
71 TriggerRecordBuilderData() = default;
72 TriggerRecordBuilderData(std::string connection_name, size_t busy_threshold);
73 TriggerRecordBuilderData(std::string connection_name, size_t busy_threshold, size_t free_threshold);
74
75 TriggerRecordBuilderData(TriggerRecordBuilderData const&) = delete;
76 TriggerRecordBuilderData(TriggerRecordBuilderData&&) = delete;
77 TriggerRecordBuilderData& operator=(TriggerRecordBuilderData const&) = delete;
78 TriggerRecordBuilderData& operator=(TriggerRecordBuilderData&&) = delete;
79
80 ~TriggerRecordBuilderData() = default;
81
82 bool is_busy() const { return m_in_error || m_is_busy; }
83 size_t used_slots() const { return m_assigned_trigger_decisions.size(); }
84
85 size_t busy_threshold() const { return m_busy_threshold.load(); }
86 size_t free_threshold() const { return m_free_threshold.load(); }
87
88 std::shared_ptr<AssignedTriggerDecision> get_assignment(daqdataformats::trigger_number_t trigger_number) const;
89 std::shared_ptr<AssignedTriggerDecision> extract_assignment(daqdataformats::trigger_number_t trigger_number);
90 std::shared_ptr<AssignedTriggerDecision> make_assignment(dfmessages::TriggerDecision decision);
91 void add_assignment(std::shared_ptr<AssignedTriggerDecision> assignment);
92 std::shared_ptr<AssignedTriggerDecision> complete_assignment(
94 std::function<void(nlohmann::json&)> metadata_fun = nullptr);
95 std::list<std::shared_ptr<AssignedTriggerDecision>> flush();
96
97 void generate_opmon_data() override;
98
99 std::chrono::microseconds average_latency(std::chrono::steady_clock::time_point since) const;
100
101 bool is_in_error() const { return m_in_error.load(); }
102 void set_in_error(bool err) { m_in_error = err; }
103
104private:
105 std::atomic<size_t> m_busy_threshold{ 0 };
106 std::atomic<size_t> m_free_threshold{ std::numeric_limits<size_t>::max() };
107 std::atomic<bool> m_is_busy{ false };
108 std::list<std::shared_ptr<AssignedTriggerDecision>> m_assigned_trigger_decisions;
109 mutable std::mutex m_assigned_trigger_decisions_mutex;
110
111 // TODO: Eric Flumerfelt <eflumerf@github.com> Dec-03-2021: Replace with circular buffer
112 std::list<std::pair<std::chrono::steady_clock::time_point, std::chrono::microseconds>> m_latency_info;
113 mutable std::mutex m_latency_info_mutex;
114
115 std::atomic<bool> m_in_error{ true };
116
117 nlohmann::json m_metadata;
118 std::string m_connection_name{ "" };
119
120 // monitoring
122 using const_time_counter_t = std::invoke_result<decltype(&metric_t::min_time_since_assignment), metric_t>::type;
123 using time_counter_t = std::remove_const<const_time_counter_t>::type;
124 std::atomic<uint32_t> m_complete_counter{ 0 };
125 std::atomic<time_counter_t> m_min_complete_time{ std::numeric_limits<time_counter_t>::max() },
126 m_max_complete_time{ 0 }; // in us
127 double m_last_average_time{ 0. };
128};
129} // namespace dfmodules
130} // namespace dunedaq
131
132#endif // DFMODULES_SRC_DFMODULES_TRIGGERRECORDBUILDERDATA_HPP_
uint64_t trigger_number_t
Definition Types.hpp:18
An ERS Issue for DataStore creation failure.
Definition DataStore.hpp:91
The DUNE-DAQ namespace.
ERS_DECLARE_ISSUE(cibmodules, CIBCommunicationError, " CIB Hardware Communication Error: "<< descriptor,((std::string) descriptor)) ERS_DECLARE_ISSUE(cibmodules
A message containing information about a Trigger from Data Selection (or a TriggerDecisionEmulator).