artdaq  v3_12_02
RoutingManagerPolicy.hh
1 #ifndef artdaq_Application_Routing_RoutingManagerPolicy_hh
2 #define artdaq_Application_Routing_RoutingManagerPolicy_hh
3 
4 #include "TRACE/tracemf.h" // Pre-empt TRACE/trace.h from Fragment.hh.
5 #include "artdaq-core/Data/Fragment.hh"
6 
7 #include "artdaq/DAQrate/detail/RoutingPacket.hh" // No library dependence.
8 
9 namespace fhicl {
10 class ParameterSet;
11 }
12 
13 #include <deque>
14 #include <mutex>
15 #include <unordered_set>
16 
17 namespace artdaq {
22 {
23 public:
32  explicit RoutingManagerPolicy(const fhicl::ParameterSet& ps);
33 
37  virtual ~RoutingManagerPolicy() = default;
38 
43  size_t GetReceiverCount() const { return receiver_ranks_.size(); }
44 
49  size_t GetMaxNumberOfTokens() const { return max_token_count_; }
50 
60 
66  void AddReceiverToken(int rank, unsigned new_slots_free);
67 
71  void Reset();
72 
77  Fragment::sequence_id_t GetNextSequenceID() const { return next_sequence_id_; }
78 
83  size_t GetHeldTokenCount() const
84  {
85  std::unique_lock<std::mutex> lk(tokens_mutex_);
86  return tokens_.size();
87  }
88 
94 
101  detail::RoutingPacketEntry GetRouteForSequenceID(artdaq::Fragment::sequence_id_t seq, int requesting_rank);
102 
108 
109  // For tests
114  size_t GetCacheSize() const { return routing_cache_.size(); }
120  bool CacheHasRoute(artdaq::Fragment::sequence_id_t seq) const { return routing_cache_.count(seq) != 0; }
121 
122 protected:
127  virtual void CreateRoutingTable(detail::RoutingPacket& tables) = 0;
128 
135  virtual detail::RoutingPacketEntry CreateRouteForSequenceID(artdaq::Fragment::sequence_id_t seq, int requesting_rank) = 0;
136 
137  // Tokens
138  std::deque<int> tokens_;
139  std::atomic<size_t> tokens_used_since_last_update_;
140 
141  // Routing Information
142  Fragment::sequence_id_t next_sequence_id_;
143  std::unordered_set<int> receiver_ranks_;
145 
146 private:
149  RoutingManagerPolicy& operator=(RoutingManagerPolicy const&) = delete;
150  RoutingManagerPolicy& operator=(RoutingManagerPolicy&&) = delete;
151 
152  void CreateRoutingTableFromCache(detail::RoutingPacket& table);
153 
154  void TrimRoutingCache();
155  void UpdateCache(detail::RoutingPacket& table);
156 
157  struct RoutingCacheEntry
158  {
159  bool is_valid{false};
160  int destination_rank{-1};
161  Fragment::sequence_id_t sequence_id{artdaq::Fragment::InvalidSequenceID};
162  int requesting_rank{-1};
163  bool included_in_table{false};
164 
165  RoutingCacheEntry() {}
166  RoutingCacheEntry(Fragment::sequence_id_t seq, int dest, int source)
167  : is_valid(true), destination_rank(dest), sequence_id(seq), requesting_rank(source) {}
168  };
169  std::map<Fragment::sequence_id_t, std::vector<RoutingCacheEntry>> routing_cache_;
170  size_t routing_cache_max_size_;
171  mutable std::mutex routing_cache_mutex_;
172  std::atomic<size_t> max_token_count_;
173  mutable std::mutex tokens_mutex_;
174 };
175 } // namespace artdaq
176 
177 #endif // artdaq_Application_Routing_RoutingManagerPolicy_hh
void AddReceiverToken(int rank, unsigned new_slots_free)
Add a token to the token list.
A row of the Routing Table.
void Reset()
Reset the policy, setting the next sequence ID to be used to 1, and removing any tokens.
size_t GetHeldTokenCount() const
Get the number of tokens that are waiting to be used.
void ResetTokensUsedSinceLastUpdate()
Reset the number of tokens used.
size_t GetMaxNumberOfTokens() const
Get the largest number of tokens that the RoutingManagerPolicy has seen at any one time...
Fragment::sequence_id_t next_sequence_id_
The next sequence ID to be assigned.
The interface through which RoutingManagerCore obtains Routing Tables using received Routing Tokens...
RoutingManagerMode
Mode indicating whether the RoutingManager is routing events by Sequence ID or by Send Count...
virtual ~RoutingManagerPolicy()=default
Default virtual Destructor.
virtual detail::RoutingPacketEntry CreateRouteForSequenceID(artdaq::Fragment::sequence_id_t seq, int requesting_rank)=0
Generate a route for the given sequence ID and source rank.
detail::RoutingPacketEntry GetRouteForSequenceID(artdaq::Fragment::sequence_id_t seq, int requesting_rank)
Get an artdaq::detail::RoutingPacketEntry for a given sequence ID and rank. Used by RequestBasedEvent...
Fragment::sequence_id_t GetNextSequenceID() const
Get the next sequence ID to be routed.
size_t GetCacheSize() const
Get the size of the routing cache. For testing.
std::vector< RoutingPacketEntry > RoutingPacket
A RoutingPacket is simply a vector of RoutingPacketEntry objects. It is not suitable for network tran...
virtual void CreateRoutingTable(detail::RoutingPacket &tables)=0
Generate entries to add to the given table.
size_t GetTokensUsedSinceLastUpdate() const
Get the number of tokens that have been used since the last update.
RoutingManagerPolicy(const fhicl::ParameterSet &ps)
RoutingManagerPolicy Constructor.
bool CacheHasRoute(artdaq::Fragment::sequence_id_t seq) const
Determine whether the routing cache has a route for the given sequence ID. For testing.
detail::RoutingManagerMode routing_mode_
Current routing mode.
size_t GetReceiverCount() const
Get the number of configured receivers.
std::deque< int > tokens_
The list of tokens which are available for use.
detail::RoutingPacket GetCurrentTable()
Create a RoutingPacket from currently-owned tokens. Used by EventBuilder and RequestBasedEventBuilder...
std::unordered_set< int > receiver_ranks_
Configured receiver (e.g. EventBuilder for BR-&gt;EB routing) ranks.
std::atomic< size_t > tokens_used_since_last_update_
Number of tokens consumed since last metric update.
detail::RoutingManagerMode GetRoutingMode() const
Get the current RoutingManagerMode of this RoutingManager.