Line data Source code
1 : #define BOOST_TEST_MODULE PreferSameHost_policy_t
2 : #include <boost/test/unit_test.hpp>
3 :
4 : #include "TRACE/tracemf.h"
5 :
6 : #include "artdaq/RoutingPolicies/RoutingManagerPolicy.hh"
7 : #include "artdaq/RoutingPolicies/makeRoutingManagerPolicy.hh"
8 : #include "fhiclcpp/ParameterSet.h"
9 :
10 : BOOST_AUTO_TEST_SUITE(PreferSameHost_policy_t)
11 :
12 2 : BOOST_AUTO_TEST_CASE(Simple)
13 : {
14 2 : fhicl::ParameterSet ps = fhicl::ParameterSet::make("");
15 :
16 1 : auto psh = artdaq::makeRoutingManagerPolicy("PreferSameHost", ps);
17 :
18 1 : psh->Reset();
19 1 : psh->AddReceiverToken(1, 1);
20 1 : psh->AddReceiverToken(3, 1);
21 1 : psh->AddReceiverToken(2, 1);
22 1 : psh->AddReceiverToken(4, 1);
23 1 : psh->AddReceiverToken(2, 1);
24 1 : BOOST_REQUIRE_EQUAL(psh->GetReceiverCount(), 4);
25 1 : auto secondTable = psh->GetCurrentTable();
26 1 : BOOST_REQUIRE_EQUAL(secondTable.size(), 4);
27 1 : BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
28 1 : BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 2);
29 1 : BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 3);
30 1 : BOOST_REQUIRE_EQUAL(secondTable[3].destination_rank, 4);
31 1 : BOOST_REQUIRE_EQUAL(secondTable[0].sequence_id, 1);
32 1 : BOOST_REQUIRE_EQUAL(secondTable[1].sequence_id, 2);
33 1 : BOOST_REQUIRE_EQUAL(secondTable[2].sequence_id, 3);
34 1 : BOOST_REQUIRE_EQUAL(secondTable[3].sequence_id, 4);
35 :
36 1 : psh->AddReceiverToken(1, 0);
37 :
38 1 : auto thirdTable = psh->GetCurrentTable();
39 1 : BOOST_REQUIRE_EQUAL(thirdTable.size(), 0);
40 :
41 1 : psh->AddReceiverToken(1, 2);
42 1 : psh->AddReceiverToken(2, 1);
43 1 : psh->AddReceiverToken(3, 1);
44 1 : psh->AddReceiverToken(4, 2);
45 1 : auto fourthTable = psh->GetCurrentTable();
46 1 : BOOST_REQUIRE_EQUAL(fourthTable.size(), 4);
47 1 : BOOST_REQUIRE_EQUAL(fourthTable[0].destination_rank, 1);
48 :
49 1 : psh->AddReceiverToken(3, 1);
50 1 : auto fifthTable = psh->GetCurrentTable();
51 1 : BOOST_REQUIRE_EQUAL(fifthTable.size(), 4);
52 1 : BOOST_REQUIRE_EQUAL(fifthTable[0].destination_rank, 1);
53 1 : }
54 :
55 2 : BOOST_AUTO_TEST_CASE(MinimumParticipants)
56 : {
57 2 : fhicl::ParameterSet ps = fhicl::ParameterSet::make("minimum_participants: 2");
58 :
59 1 : auto psh = artdaq::makeRoutingManagerPolicy("PreferSameHost", ps);
60 :
61 1 : psh->Reset();
62 1 : psh->AddReceiverToken(1, 1);
63 1 : psh->AddReceiverToken(3, 1);
64 1 : psh->AddReceiverToken(2, 1);
65 1 : psh->AddReceiverToken(4, 1);
66 1 : psh->AddReceiverToken(2, 1);
67 1 : BOOST_REQUIRE_EQUAL(psh->GetReceiverCount(), 4);
68 1 : auto secondTable = psh->GetCurrentTable();
69 1 : BOOST_REQUIRE_EQUAL(secondTable.size(), 4);
70 1 : BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
71 1 : BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 2);
72 1 : BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 3);
73 1 : BOOST_REQUIRE_EQUAL(secondTable[3].destination_rank, 4);
74 1 : BOOST_REQUIRE_EQUAL(secondTable[0].sequence_id, 1);
75 1 : BOOST_REQUIRE_EQUAL(secondTable[1].sequence_id, 2);
76 1 : BOOST_REQUIRE_EQUAL(secondTable[2].sequence_id, 3);
77 1 : BOOST_REQUIRE_EQUAL(secondTable[3].sequence_id, 4);
78 :
79 1 : psh->AddReceiverToken(1, 0);
80 :
81 1 : auto thirdTable = psh->GetCurrentTable();
82 1 : BOOST_REQUIRE_EQUAL(thirdTable.size(), 0);
83 :
84 1 : psh->AddReceiverToken(1, 1);
85 1 : auto fourthTable = psh->GetCurrentTable();
86 1 : BOOST_REQUIRE_EQUAL(fourthTable.size(), 2);
87 :
88 1 : BOOST_REQUIRE_EQUAL(fourthTable[0].destination_rank, 1);
89 1 : BOOST_REQUIRE_EQUAL(fourthTable[1].destination_rank, 2);
90 1 : BOOST_REQUIRE_EQUAL(fourthTable[0].sequence_id, 5);
91 1 : BOOST_REQUIRE_EQUAL(fourthTable[1].sequence_id, 6);
92 :
93 1 : psh->AddReceiverToken(1, 2);
94 1 : psh->AddReceiverToken(2, 2);
95 1 : psh->AddReceiverToken(3, 1);
96 1 : psh->AddReceiverToken(4, 2);
97 1 : auto fifthTable = psh->GetCurrentTable();
98 1 : BOOST_REQUIRE_EQUAL(fifthTable.size(), 7);
99 1 : BOOST_REQUIRE_EQUAL(fifthTable[0].destination_rank, 1);
100 :
101 1 : psh->AddReceiverToken(3, 1);
102 1 : auto sixthTable = psh->GetCurrentTable();
103 1 : BOOST_REQUIRE_EQUAL(sixthTable.size(), 0);
104 1 : }
105 :
106 : // RECENT CHANGE IN BEHAVIOR! Since the number of receivers is now dynamic as tokens are added, RoundRobin_policy will ALWAYS wait for at least minimum_participants to be available when it is positive!
107 2 : BOOST_AUTO_TEST_CASE(LargeMinimumParticipants)
108 : {
109 3 : TLOG(TLVL_INFO) << "PreferSameHost_policy_t Test Case LargeMinimumParticipants BEGIN";
110 2 : fhicl::ParameterSet ps = fhicl::ParameterSet::make("minimum_participants: 5");
111 :
112 1 : auto rr = artdaq::makeRoutingManagerPolicy("PreferSameHost", ps);
113 :
114 1 : rr->Reset();
115 1 : rr->AddReceiverToken(1, 1);
116 1 : rr->AddReceiverToken(3, 1);
117 1 : rr->AddReceiverToken(2, 1);
118 1 : rr->AddReceiverToken(3, 1);
119 1 : rr->AddReceiverToken(2, 1);
120 1 : BOOST_REQUIRE_EQUAL(rr->GetReceiverCount(), 3);
121 1 : auto firstTable = rr->GetCurrentTable();
122 1 : BOOST_REQUIRE_EQUAL(firstTable.size(), 0);
123 :
124 1 : rr->AddReceiverToken(5, 1);
125 1 : rr->AddReceiverToken(6, 1);
126 :
127 1 : auto secondTable = rr->GetCurrentTable();
128 1 : BOOST_REQUIRE_EQUAL(secondTable.size(), 5);
129 1 : BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
130 1 : BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 2);
131 1 : BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 3);
132 1 : BOOST_REQUIRE_EQUAL(secondTable[3].destination_rank, 5);
133 1 : BOOST_REQUIRE_EQUAL(secondTable[4].destination_rank, 6);
134 :
135 1 : rr->AddReceiverToken(1, 1);
136 1 : auto thirdTable = rr->GetCurrentTable();
137 1 : BOOST_REQUIRE_EQUAL(thirdTable.size(), 0);
138 :
139 3 : TLOG(TLVL_INFO) << "PreferSameHost_policy_t Test Case LargeMinimumParticipants END";
140 1 : }
141 :
142 2 : BOOST_AUTO_TEST_CASE(ManyMissingParticipants)
143 : {
144 2 : fhicl::ParameterSet ps = fhicl::ParameterSet::make("minimum_participants: -5");
145 :
146 1 : auto psh = artdaq::makeRoutingManagerPolicy("PreferSameHost", ps);
147 :
148 1 : psh->Reset();
149 1 : psh->AddReceiverToken(1, 1);
150 1 : psh->AddReceiverToken(3, 1);
151 1 : psh->AddReceiverToken(2, 1);
152 1 : psh->AddReceiverToken(3, 1);
153 1 : psh->AddReceiverToken(2, 1);
154 1 : BOOST_REQUIRE_EQUAL(psh->GetReceiverCount(), 3);
155 1 : auto secondTable = psh->GetCurrentTable();
156 1 : BOOST_REQUIRE_EQUAL(secondTable.size(), 5);
157 1 : BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
158 :
159 1 : psh->AddReceiverToken(1, 1);
160 1 : auto thirdTable = psh->GetCurrentTable();
161 1 : BOOST_REQUIRE_EQUAL(thirdTable.size(), 1);
162 1 : }
163 :
164 2 : BOOST_AUTO_TEST_CASE(DataFlowMode)
165 : {
166 1 : fhicl::ParameterSet ps = fhicl::ParameterSet::make(
167 : "routing_manager_mode: DataFlow \
168 : host_map: [{rank: 1 host: \"testHost1\"}, \
169 : {rank: 2 host: \"testHost1\"}, \
170 : {rank: 3 host: \"testHost2\"}, \
171 : {rank: 4 host: \"testHost1\"}, \
172 : {rank: 5 host: \"testHost2\"}, \
173 2 : {rank: 6 host: \"testHost3\"}]");
174 :
175 1 : auto psh = artdaq::makeRoutingManagerPolicy("PreferSameHost", ps);
176 :
177 1 : psh->Reset();
178 1 : psh->AddReceiverToken(1, 1);
179 1 : psh->AddReceiverToken(3, 1);
180 1 : psh->AddReceiverToken(2, 1);
181 1 : psh->AddReceiverToken(3, 1);
182 1 : psh->AddReceiverToken(2, 1);
183 1 : BOOST_REQUIRE_EQUAL(psh->GetReceiverCount(), 3);
184 1 : auto route = psh->GetRouteForSequenceID(1, 4);
185 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
186 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
187 :
188 : // Multiple hits for the same sequence ID are allowed, and should receive different information
189 1 : route = psh->GetRouteForSequenceID(1, 5);
190 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
191 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
192 :
193 : // Except, that the same sequence ID from the same host should always get the same info
194 1 : route = psh->GetRouteForSequenceID(1, 5);
195 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
196 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
197 :
198 1 : route = psh->GetRouteForSequenceID(2, 4);
199 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
200 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 2);
201 :
202 1 : psh->AddReceiverToken(1, 1);
203 1 : route = psh->GetRouteForSequenceID(2, 5);
204 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
205 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 2);
206 :
207 : // Out-of-order sequence IDs are allowed
208 1 : route = psh->GetRouteForSequenceID(1, 6);
209 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
210 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
211 :
212 : // Arbitrary sequence IDs are allowed
213 1 : route = psh->GetRouteForSequenceID(10343, 4);
214 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
215 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 10343);
216 1 : }
217 :
218 2 : BOOST_AUTO_TEST_CASE(RequestBasedEventBuilding)
219 : {
220 1 : fhicl::ParameterSet ps = fhicl::ParameterSet::make(
221 : "routing_manager_mode: RequestBasedEventBuilding routing_cache_size: 2 \
222 : host_map: [{rank: 1 host: \"testHost1\"}, \
223 : {rank: 2 host: \"testHost1\"}, \
224 : {rank: 3 host: \"testHost2\"}, \
225 : {rank: 4 host: \"testHost1\"}, \
226 : {rank: 5 host: \"testHost2\"}, \
227 2 : {rank: 6 host: \"testHost3\"}]");
228 :
229 1 : auto psh = artdaq::makeRoutingManagerPolicy("PreferSameHost", ps);
230 :
231 1 : psh->Reset();
232 1 : psh->AddReceiverToken(1, 1);
233 1 : psh->AddReceiverToken(3, 1);
234 1 : psh->AddReceiverToken(2, 1);
235 1 : psh->AddReceiverToken(3, 1);
236 1 : psh->AddReceiverToken(2, 1);
237 1 : BOOST_REQUIRE_EQUAL(psh->GetReceiverCount(), 3);
238 :
239 1 : auto route = psh->GetRouteForSequenceID(1, 4);
240 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
241 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
242 :
243 : // Multiple hits for the same sequence ID should receive the same routing
244 1 : route = psh->GetRouteForSequenceID(1, 5);
245 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
246 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
247 :
248 : // Only events which have started routing should be in the table
249 1 : auto firstTable = psh->GetCurrentTable();
250 1 : BOOST_REQUIRE_EQUAL(firstTable.size(), 1);
251 1 : BOOST_REQUIRE_EQUAL(firstTable[0].destination_rank, 2);
252 :
253 : // Arbitrary Sequence IDs are allowed
254 1 : route = psh->GetRouteForSequenceID(12343, 4);
255 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
256 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 12343);
257 :
258 : // Out-of-order Sequence IDs are allowed
259 1 : route = psh->GetRouteForSequenceID(4, 5);
260 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
261 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 4);
262 :
263 : // Requests that arrive late still get the same info
264 1 : route = psh->GetRouteForSequenceID(1, 6);
265 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
266 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
267 :
268 : // Check that things behave when tokens are exhausted...
269 1 : route = psh->GetRouteForSequenceID(10, 6);
270 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
271 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 10);
272 1 : route = psh->GetRouteForSequenceID(11, 6);
273 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
274 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 11);
275 :
276 1 : route = psh->GetRouteForSequenceID(50, 4);
277 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, -1);
278 :
279 1 : psh->AddReceiverToken(1, 1);
280 1 : route = psh->GetRouteForSequenceID(50, 4);
281 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
282 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 50);
283 :
284 1 : route = psh->GetRouteForSequenceID(50, 5);
285 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
286 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 50);
287 :
288 : // Routing cache is sorted by sequence ID
289 1 : auto secondTable = psh->GetCurrentTable();
290 1 : BOOST_REQUIRE_EQUAL(secondTable.size(), 5);
291 1 : BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 3);
292 1 : BOOST_REQUIRE_EQUAL(secondTable[0].sequence_id, 4);
293 1 : BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 2);
294 1 : BOOST_REQUIRE_EQUAL(secondTable[1].sequence_id, 10);
295 1 : BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 3);
296 1 : BOOST_REQUIRE_EQUAL(secondTable[2].sequence_id, 11);
297 1 : BOOST_REQUIRE_EQUAL(secondTable[3].destination_rank, 1);
298 1 : BOOST_REQUIRE_EQUAL(secondTable[3].sequence_id, 50);
299 1 : BOOST_REQUIRE_EQUAL(secondTable[4].destination_rank, 1);
300 1 : BOOST_REQUIRE_EQUAL(secondTable[4].sequence_id, 12343);
301 :
302 : // Since the routing cache has been set to 2, only the highest two events routed are here, as the cache is checked when generating tables
303 1 : BOOST_REQUIRE_EQUAL(psh->GetCacheSize(), 2);
304 1 : auto thirdTable = psh->GetCurrentTable();
305 1 : BOOST_REQUIRE_EQUAL(thirdTable.size(), 0);
306 :
307 1 : BOOST_REQUIRE(psh->CacheHasRoute(50));
308 1 : BOOST_REQUIRE(!psh->CacheHasRoute(4));
309 1 : route = psh->GetRouteForSequenceID(50, 6);
310 1 : BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
311 1 : BOOST_REQUIRE_EQUAL(route.sequence_id, 50);
312 :
313 3 : TLOG(TLVL_INFO) << "RoundRobin_policy_t Test Case RequestBasedEventBuilding END";
314 1 : }
315 :
316 : BOOST_AUTO_TEST_SUITE_END()
|