12#ifndef DFMODULES_SRC_DFMODULES_TRIGGERRECORDBUILDERDATA_HPP_
13#define DFMODULES_SRC_DFMODULES_TRIGGERRECORDBUILDERDATA_HPP_
20#include "nlohmann/json.hpp"
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,
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.",
54struct AssignedTriggerDecision
57 std::chrono::steady_clock::time_point assigned_time;
58 std::string connection_name;
62 , assigned_time(std::chrono::steady_clock::now())
63 , connection_name(conn_name)
70 TriggerRecordBuilderData() =
default;
71 TriggerRecordBuilderData(std::string connection_name,
size_t busy_threshold);
72 TriggerRecordBuilderData(std::string connection_name,
size_t busy_threshold,
size_t free_threshold);
74 TriggerRecordBuilderData(TriggerRecordBuilderData
const&) =
delete;
75 TriggerRecordBuilderData(TriggerRecordBuilderData&&) =
delete;
76 TriggerRecordBuilderData& operator=(TriggerRecordBuilderData
const&) =
delete;
77 TriggerRecordBuilderData& operator=(TriggerRecordBuilderData&&) =
delete;
79 ~TriggerRecordBuilderData() =
default;
81 bool is_busy()
const {
return m_in_error || m_is_busy; }
82 size_t used_slots()
const {
return m_assigned_trigger_decisions.size(); }
84 size_t busy_threshold()
const {
return m_busy_threshold.load(); }
85 size_t free_threshold()
const {
return m_free_threshold.load(); }
90 void add_assignment(std::shared_ptr<AssignedTriggerDecision> assignment);
91 std::shared_ptr<AssignedTriggerDecision> complete_assignment(
93 std::function<
void(nlohmann::json&)> metadata_fun =
nullptr);
94 std::list<std::shared_ptr<AssignedTriggerDecision>> flush();
96 void generate_opmon_data()
override;
98 std::chrono::microseconds average_latency(std::chrono::steady_clock::time_point since)
const;
100 bool is_in_error()
const {
return m_in_error.load(); }
101 void set_in_error(
bool err) { m_in_error = err; }
104 std::atomic<size_t> m_busy_threshold{ 0 };
105 std::atomic<size_t> m_free_threshold{ std::numeric_limits<size_t>::max() };
106 std::atomic<bool> m_is_busy{
false };
107 std::list<std::shared_ptr<AssignedTriggerDecision>> m_assigned_trigger_decisions;
108 mutable std::mutex m_assigned_trigger_decisions_mutex;
111 std::list<std::pair<std::chrono::steady_clock::time_point, std::chrono::microseconds>> m_latency_info;
112 mutable std::mutex m_latency_info_mutex;
114 std::atomic<bool> m_in_error{
true };
116 nlohmann::json m_metadata;
117 std::string m_connection_name{
"" };
121 using const_time_counter_t = std::invoke_result<
decltype(&metric_t::min_time_since_assignment),
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() }, m_max_complete_time{ 0 };
126 double m_last_average_time{0.};
#define ERS_DECLARE_ISSUE(namespace_name, class_name, message, attributes)
AssignedTriggerDecisionNotFound
A message containing information about a Trigger from Data Selection (or a TriggerDecisionEmulator)