1 /*
2 * Copyright 2004-2025 the Pacemaker project contributors
3 *
4 * The version control history for this file may have further details.
5 *
6 * This source code is licensed under the GNU Lesser General Public License
7 * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
8 */
9
10 #include <crm_internal.h>
11
12 #include <stdint.h> // uint64_t
13
14 #include <pacemaker-controld.h>
15
16 /*
17 * The state transition table. The rows are inputs, and
18 * the columns are states.
19 */
20 static const enum crmd_fsa_state fsa_next_states[MAXINPUT][MAXSTATE] = {
21 /* Got an I_NULL */
22 {
23 /* S_IDLE ==> */ S_IDLE,
24 /* S_ELECTION ==> */ S_ELECTION,
25 /* S_INTEGRATION ==> */ S_INTEGRATION,
26 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
27 /* S_NOT_DC ==> */ S_NOT_DC,
28 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
29 /* S_RECOVERY ==> */ S_RECOVERY,
30 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
31 /* S_STARTING ==> */ S_STARTING,
32 /* S_PENDING ==> */ S_PENDING,
33 /* S_STOPPING ==> */ S_STOPPING,
34 /* S_TERMINATE ==> */ S_TERMINATE,
35 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
36 /* S_HALT ==> */ S_HALT,
37 },
38
39 /* Got an I_CIB_UPDATE */
40 {
41 /* S_IDLE ==> */ S_IDLE,
42 /* S_ELECTION ==> */ S_ELECTION,
43 /* S_INTEGRATION ==> */ S_INTEGRATION,
44 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
45 /* S_NOT_DC ==> */ S_RECOVERY,
46 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
47 /* S_RECOVERY ==> */ S_RECOVERY,
48 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
49 /* S_STARTING ==> */ S_RECOVERY,
50 /* S_PENDING ==> */ S_RECOVERY,
51 /* S_STOPPING ==> */ S_STOPPING,
52 /* S_TERMINATE ==> */ S_TERMINATE,
53 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
54 /* S_HALT ==> */ S_HALT,
55 },
56
57 /* Got an I_DC_TIMEOUT */
58 {
59 /* S_IDLE ==> */ S_RECOVERY,
60 /* S_ELECTION ==> */ S_ELECTION,
61 /* S_INTEGRATION ==> */ S_RECOVERY,
62 /* S_FINALIZE_JOIN ==> */ S_RECOVERY,
63 /* S_NOT_DC ==> */ S_ELECTION,
64 /* S_POLICY_ENGINE ==> */ S_RECOVERY,
65 /* S_RECOVERY ==> */ S_RECOVERY,
66 /* S_RELEASE_DC ==> */ S_RECOVERY,
67 /* S_STARTING ==> */ S_STARTING,
68 /* S_PENDING ==> */ S_ELECTION,
69 /* S_STOPPING ==> */ S_STOPPING,
70 /* S_TERMINATE ==> */ S_TERMINATE,
71 /* S_TRANSITION_ENGINE ==> */ S_RECOVERY,
72 /* S_HALT ==> */ S_ELECTION,
73 },
74
75 /* Got an I_ELECTION */
76 {
77 /* S_IDLE ==> */ S_ELECTION,
78 /* S_ELECTION ==> */ S_ELECTION,
79 /* S_INTEGRATION ==> */ S_ELECTION,
80 /* S_FINALIZE_JOIN ==> */ S_ELECTION,
81 /* S_NOT_DC ==> */ S_ELECTION,
82 /* S_POLICY_ENGINE ==> */ S_ELECTION,
83 /* S_RECOVERY ==> */ S_RECOVERY,
84 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
85 /* S_STARTING ==> */ S_STARTING,
86 /* S_PENDING ==> */ S_ELECTION,
87 /* S_STOPPING ==> */ S_STOPPING,
88 /* S_TERMINATE ==> */ S_TERMINATE,
89 /* S_TRANSITION_ENGINE ==> */ S_ELECTION,
90 /* S_HALT ==> */ S_HALT,
91 },
92
93 /* Got an I_PE_CALC */
94 {
95 /* S_IDLE ==> */ S_POLICY_ENGINE,
96 /* S_ELECTION ==> */ S_ELECTION,
97 /* S_INTEGRATION ==> */ S_INTEGRATION,
98 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
99 /* S_NOT_DC ==> */ S_NOT_DC,
100 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
101 /* S_RECOVERY ==> */ S_RECOVERY,
102 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
103 /* S_STARTING ==> */ S_RECOVERY,
104 /* S_PENDING ==> */ S_PENDING,
105 /* S_STOPPING ==> */ S_STOPPING,
106 /* S_TERMINATE ==> */ S_TERMINATE,
107 /* S_TRANSITION_ENGINE ==> */ S_POLICY_ENGINE,
108 /* S_HALT ==> */ S_HALT,
109 },
110
111 /* Got an I_RELEASE_DC */
112 {
113 /* S_IDLE ==> */ S_RELEASE_DC,
114 /* S_ELECTION ==> */ S_RELEASE_DC,
115 /* S_INTEGRATION ==> */ S_RELEASE_DC,
116 /* S_FINALIZE_JOIN ==> */ S_RELEASE_DC,
117 /* S_NOT_DC ==> */ S_NOT_DC,
118 /* S_POLICY_ENGINE ==> */ S_RELEASE_DC,
119 /* S_RECOVERY ==> */ S_RECOVERY,
120 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
121 /* S_STARTING ==> */ S_RECOVERY,
122 /* S_PENDING ==> */ S_PENDING,
123 /* S_STOPPING ==> */ S_STOPPING,
124 /* S_TERMINATE ==> */ S_TERMINATE,
125 /* S_TRANSITION_ENGINE ==> */ S_RELEASE_DC,
126 /* S_HALT ==> */ S_HALT,
127 },
128
129 /* Got an I_ELECTION_DC */
130 {
131 /* S_IDLE ==> */ S_INTEGRATION,
132 /* S_ELECTION ==> */ S_INTEGRATION,
133 /* S_INTEGRATION ==> */ S_INTEGRATION,
134 /* S_FINALIZE_JOIN ==> */ S_INTEGRATION,
135 /* S_NOT_DC ==> */ S_INTEGRATION,
136 /* S_POLICY_ENGINE ==> */ S_INTEGRATION,
137 /* S_RECOVERY ==> */ S_RECOVERY,
138 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
139 /* S_STARTING ==> */ S_RECOVERY,
140 /* S_PENDING ==> */ S_PENDING,
141 /* S_STOPPING ==> */ S_STOPPING,
142 /* S_TERMINATE ==> */ S_TERMINATE,
143 /* S_TRANSITION_ENGINE ==> */ S_INTEGRATION,
144 /* S_HALT ==> */ S_HALT,
145 },
146
147 /* Got an I_ERROR */
148 {
149 /* S_IDLE ==> */ S_RECOVERY,
150 /* S_ELECTION ==> */ S_RECOVERY,
151 /* S_INTEGRATION ==> */ S_RECOVERY,
152 /* S_FINALIZE_JOIN ==> */ S_RECOVERY,
153 /* S_NOT_DC ==> */ S_RECOVERY,
154 /* S_POLICY_ENGINE ==> */ S_RECOVERY,
155 /* S_RECOVERY ==> */ S_RECOVERY,
156 /* S_RELEASE_DC ==> */ S_RECOVERY,
157 /* S_STARTING ==> */ S_RECOVERY,
158 /* S_PENDING ==> */ S_RECOVERY,
159 /* S_STOPPING ==> */ S_TERMINATE,
160 /* S_TERMINATE ==> */ S_TERMINATE,
161 /* S_TRANSITION_ENGINE ==> */ S_RECOVERY,
162 /* S_HALT ==> */ S_RECOVERY,
163 },
164
165 /* Got an I_FAIL */
166 {
167 /* S_IDLE ==> */ S_RECOVERY,
168 /* S_ELECTION ==> */ S_RELEASE_DC,
169 /* S_INTEGRATION ==> */ S_INTEGRATION,
170 /* S_FINALIZE_JOIN ==> */ S_INTEGRATION,
171 /* S_NOT_DC ==> */ S_RECOVERY,
172 /* S_POLICY_ENGINE ==> */ S_INTEGRATION,
173 /* S_RECOVERY ==> */ S_RECOVERY,
174 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
175 /* S_STARTING ==> */ S_STOPPING,
176 /* S_PENDING ==> */ S_STOPPING,
177 /* S_STOPPING ==> */ S_STOPPING,
178 /* S_TERMINATE ==> */ S_TERMINATE,
179 /* S_TRANSITION_ENGINE ==> */ S_POLICY_ENGINE,
180 /* S_HALT ==> */ S_RELEASE_DC,
181 },
182
183 /* Got an I_INTEGRATED */
184 {
185 /* S_IDLE ==> */ S_IDLE,
186 /* S_ELECTION ==> */ S_ELECTION,
187 /* S_INTEGRATION ==> */ S_FINALIZE_JOIN,
188 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
189 /* S_NOT_DC ==> */ S_NOT_DC,
190 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
191 /* S_RECOVERY ==> */ S_RECOVERY,
192 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
193 /* S_STARTING ==> */ S_RECOVERY,
194 /* S_PENDING ==> */ S_RECOVERY,
195 /* S_STOPPING ==> */ S_STOPPING,
196 /* S_TERMINATE ==> */ S_TERMINATE,
197 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
198 /* S_HALT ==> */ S_HALT,
199 },
200
201 /* Got an I_FINALIZED */
202 {
203 /* S_IDLE ==> */ S_IDLE,
204 /* S_ELECTION ==> */ S_ELECTION,
205 /* S_INTEGRATION ==> */ S_INTEGRATION,
206 /* S_FINALIZE_JOIN ==> */ S_POLICY_ENGINE,
207 /* S_NOT_DC ==> */ S_NOT_DC,
208 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
209 /* S_RECOVERY ==> */ S_RECOVERY,
210 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
211 /* S_STARTING ==> */ S_RECOVERY,
212 /* S_PENDING ==> */ S_RECOVERY,
213 /* S_STOPPING ==> */ S_STOPPING,
214 /* S_TERMINATE ==> */ S_TERMINATE,
215 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
216 /* S_HALT ==> */ S_HALT,
217 },
218
219 /* Got an I_NODE_JOIN */
220 {
221 /* S_IDLE ==> */ S_INTEGRATION,
222 /* S_ELECTION ==> */ S_ELECTION,
223 /* S_INTEGRATION ==> */ S_INTEGRATION,
224 /* S_FINALIZE_JOIN ==> */ S_INTEGRATION,
225 /* S_NOT_DC ==> */ S_NOT_DC,
226 /* S_POLICY_ENGINE ==> */ S_INTEGRATION,
227 /* S_RECOVERY ==> */ S_RECOVERY,
228 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
229 /* S_STARTING ==> */ S_RECOVERY,
230 /* S_PENDING ==> */ S_PENDING,
231 /* S_STOPPING ==> */ S_STOPPING,
232 /* S_TERMINATE ==> */ S_TERMINATE,
233 /* S_TRANSITION_ENGINE ==> */ S_INTEGRATION,
234 /* S_HALT ==> */ S_HALT,
235 },
236
237 /* Got an I_NOT_DC */
238 {
239 /* S_IDLE ==> */ S_RECOVERY,
240 /* S_ELECTION ==> */ S_ELECTION,
241 /* S_INTEGRATION ==> */ S_RECOVERY,
242 /* S_FINALIZE_JOIN ==> */ S_RECOVERY,
243 /* S_NOT_DC ==> */ S_NOT_DC,
244 /* S_POLICY_ENGINE ==> */ S_RECOVERY,
245 /* S_RECOVERY ==> */ S_RECOVERY,
246 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
247 /* S_STARTING ==> */ S_RECOVERY,
248 /* S_PENDING ==> */ S_NOT_DC,
249 /* S_STOPPING ==> */ S_STOPPING,
250 /* S_TERMINATE ==> */ S_TERMINATE,
251 /* S_TRANSITION_ENGINE ==> */ S_RECOVERY,
252 /* S_HALT ==> */ S_HALT,
253 },
254
255 /* Got an I_RECOVERED */
256 {
257 /* S_IDLE ==> */ S_IDLE,
258 /* S_ELECTION ==> */ S_ELECTION,
259 /* S_INTEGRATION ==> */ S_INTEGRATION,
260 /* S_FINALIZE_JOIN ==> */ S_INTEGRATION,
261 /* S_NOT_DC ==> */ S_NOT_DC,
262 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
263 /* S_RECOVERY ==> */ S_PENDING,
264 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
265 /* S_STARTING ==> */ S_STARTING,
266 /* S_PENDING ==> */ S_PENDING,
267 /* S_STOPPING ==> */ S_STOPPING,
268 /* S_TERMINATE ==> */ S_TERMINATE,
269 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
270 /* S_HALT ==> */ S_HALT,
271 },
272
273 /* Got an I_RELEASE_FAIL */
274 {
275 /* S_IDLE ==> */ S_STOPPING,
276 /* S_ELECTION ==> */ S_STOPPING,
277 /* S_INTEGRATION ==> */ S_STOPPING,
278 /* S_FINALIZE_JOIN ==> */ S_STOPPING,
279 /* S_NOT_DC ==> */ S_NOT_DC,
280 /* S_POLICY_ENGINE ==> */ S_STOPPING,
281 /* S_RECOVERY ==> */ S_STOPPING,
282 /* S_RELEASE_DC ==> */ S_STOPPING,
283 /* S_STARTING ==> */ S_RECOVERY,
284 /* S_PENDING ==> */ S_PENDING,
285 /* S_STOPPING ==> */ S_STOPPING,
286 /* S_TERMINATE ==> */ S_TERMINATE,
287 /* S_TRANSITION_ENGINE ==> */ S_STOPPING,
288 /* S_HALT ==> */ S_HALT,
289 },
290
291 /* Got an I_RELEASE_SUCCESS */
292 {
293 /* S_IDLE ==> */ S_RECOVERY,
294 /* S_ELECTION ==> */ S_ELECTION,
295 /* S_INTEGRATION ==> */ S_RECOVERY,
296 /* S_FINALIZE_JOIN ==> */ S_RECOVERY,
297 /* S_NOT_DC ==> */ S_NOT_DC,
298 /* S_POLICY_ENGINE ==> */ S_RECOVERY,
299 /* S_RECOVERY ==> */ S_RECOVERY,
300 /* S_RELEASE_DC ==> */ S_PENDING,
301 /* S_STARTING ==> */ S_RECOVERY,
302 /* S_PENDING ==> */ S_PENDING,
303 /* S_STOPPING ==> */ S_STOPPING,
304 /* S_TERMINATE ==> */ S_TERMINATE,
305 /* S_TRANSITION_ENGINE ==> */ S_RECOVERY,
306 /* S_HALT ==> */ S_HALT,
307 },
308
309 /* Got an I_RESTART */
310 {
311 /* S_IDLE ==> */ S_IDLE,
312 /* S_ELECTION ==> */ S_ELECTION,
313 /* S_INTEGRATION ==> */ S_INTEGRATION,
314 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
315 /* S_NOT_DC ==> */ S_NOT_DC,
316 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
317 /* S_RECOVERY ==> */ S_RECOVERY,
318 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
319 /* S_STARTING ==> */ S_STARTING,
320 /* S_PENDING ==> */ S_PENDING,
321 /* S_STOPPING ==> */ S_STOPPING,
322 /* S_TERMINATE ==> */ S_TERMINATE,
323 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
324 /* S_HALT ==> */ S_HALT,
325 },
326
327 /* Got an I_TE_SUCCESS */
328 {
329 /* S_IDLE ==> */ S_IDLE,
330 /* S_ELECTION ==> */ S_ELECTION,
331 /* S_INTEGRATION ==> */ S_INTEGRATION,
332 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
333 /* S_NOT_DC ==> */ S_NOT_DC,
334 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
335 /* S_RECOVERY ==> */ S_RECOVERY,
336 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
337 /* S_STARTING ==> */ S_RECOVERY,
338 /* S_PENDING ==> */ S_PENDING,
339 /* S_STOPPING ==> */ S_STOPPING,
340 /* S_TERMINATE ==> */ S_TERMINATE,
341 /* S_TRANSITION_ENGINE ==> */ S_IDLE,
342 /* S_HALT ==> */ S_HALT,
343 },
344
345 /* Got an I_ROUTER */
346 {
347 /* S_IDLE ==> */ S_IDLE,
348 /* S_ELECTION ==> */ S_ELECTION,
349 /* S_INTEGRATION ==> */ S_INTEGRATION,
350 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
351 /* S_NOT_DC ==> */ S_NOT_DC,
352 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
353 /* S_RECOVERY ==> */ S_RECOVERY,
354 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
355 /* S_STARTING ==> */ S_STARTING,
356 /* S_PENDING ==> */ S_PENDING,
357 /* S_STOPPING ==> */ S_STOPPING,
358 /* S_TERMINATE ==> */ S_TERMINATE,
359 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
360 /* S_HALT ==> */ S_HALT,
361 },
362
363 /* Got an I_SHUTDOWN */
364 {
365 /* S_IDLE ==> */ S_POLICY_ENGINE,
366 /* S_ELECTION ==> */ S_ELECTION,
367 /* S_INTEGRATION ==> */ S_INTEGRATION,
368 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
369 /* S_NOT_DC ==> */ S_NOT_DC,
370 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
371 /* S_RECOVERY ==> */ S_STOPPING,
372 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
373 /* S_STARTING ==> */ S_STOPPING,
374 /* S_PENDING ==> */ S_PENDING,
375 /* S_STOPPING ==> */ S_STOPPING,
376 /* S_TERMINATE ==> */ S_TERMINATE,
377 /* S_TRANSITION_ENGINE ==> */ S_POLICY_ENGINE,
378 /* S_HALT ==> */ S_ELECTION,
379 },
380
381 /* Got an I_STOP */
382 {
383 /* S_IDLE ==> */ S_STOPPING,
384 /* S_ELECTION ==> */ S_STOPPING,
385 /* S_INTEGRATION ==> */ S_STOPPING,
386 /* S_FINALIZE_JOIN ==> */ S_STOPPING,
387 /* S_NOT_DC ==> */ S_STOPPING,
388 /* S_POLICY_ENGINE ==> */ S_STOPPING,
389 /* S_RECOVERY ==> */ S_STOPPING,
390 /* S_RELEASE_DC ==> */ S_STOPPING,
391 /* S_STARTING ==> */ S_STOPPING,
392 /* S_PENDING ==> */ S_STOPPING,
393 /* S_STOPPING ==> */ S_STOPPING,
394 /* S_TERMINATE ==> */ S_TERMINATE,
395 /* S_TRANSITION_ENGINE ==> */ S_STOPPING,
396 /* S_HALT ==> */ S_STOPPING,
397 },
398
399 /* Got an I_TERMINATE */
400 {
401 /* S_IDLE ==> */ S_TERMINATE,
402 /* S_ELECTION ==> */ S_TERMINATE,
403 /* S_INTEGRATION ==> */ S_TERMINATE,
404 /* S_FINALIZE_JOIN ==> */ S_TERMINATE,
405 /* S_NOT_DC ==> */ S_TERMINATE,
406 /* S_POLICY_ENGINE ==> */ S_TERMINATE,
407 /* S_RECOVERY ==> */ S_TERMINATE,
408 /* S_RELEASE_DC ==> */ S_TERMINATE,
409 /* S_STARTING ==> */ S_TERMINATE,
410 /* S_PENDING ==> */ S_TERMINATE,
411 /* S_STOPPING ==> */ S_TERMINATE,
412 /* S_TERMINATE ==> */ S_TERMINATE,
413 /* S_TRANSITION_ENGINE ==> */ S_TERMINATE,
414 /* S_HALT ==> */ S_TERMINATE,
415 },
416
417 /* Got an I_STARTUP */
418 {
419 /* S_IDLE ==> */ S_RECOVERY,
420 /* S_ELECTION ==> */ S_RECOVERY,
421 /* S_INTEGRATION ==> */ S_RECOVERY,
422 /* S_FINALIZE_JOIN ==> */ S_RECOVERY,
423 /* S_NOT_DC ==> */ S_RECOVERY,
424 /* S_POLICY_ENGINE ==> */ S_RECOVERY,
425 /* S_RECOVERY ==> */ S_RECOVERY,
426 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
427 /* S_STARTING ==> */ S_STARTING,
428 /* S_PENDING ==> */ S_PENDING,
429 /* S_STOPPING ==> */ S_STOPPING,
430 /* S_TERMINATE ==> */ S_TERMINATE,
431 /* S_TRANSITION_ENGINE ==> */ S_RECOVERY,
432 /* S_HALT ==> */ S_HALT,
433 },
434
435 /* Got an I_PE_SUCCESS */
436 {
437 /* S_IDLE ==> */ S_IDLE,
438 /* S_ELECTION ==> */ S_ELECTION,
439 /* S_INTEGRATION ==> */ S_INTEGRATION,
440 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
441 /* S_NOT_DC ==> */ S_NOT_DC,
442 /* S_POLICY_ENGINE ==> */ S_TRANSITION_ENGINE,
443 /* S_RECOVERY ==> */ S_RECOVERY,
444 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
445 /* S_STARTING ==> */ S_RECOVERY,
446 /* S_PENDING ==> */ S_PENDING,
447 /* S_STOPPING ==> */ S_STOPPING,
448 /* S_TERMINATE ==> */ S_TERMINATE,
449 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
450 /* S_HALT ==> */ S_HALT,
451 },
452
453 /* Got an I_JOIN_OFFER */
454 {
455 /* S_IDLE ==> */ S_IDLE,
456 /* S_ELECTION ==> */ S_ELECTION,
457 /* S_INTEGRATION ==> */ S_INTEGRATION,
458 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
459 /* S_NOT_DC ==> */ S_PENDING,
460 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
461 /* S_RECOVERY ==> */ S_RECOVERY,
462 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
463 /* S_STARTING ==> */ S_STARTING,
464 /* S_PENDING ==> */ S_PENDING,
465 /* S_STOPPING ==> */ S_STOPPING,
466 /* S_TERMINATE ==> */ S_TERMINATE,
467 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
468 /* S_HALT ==> */ S_HALT,
469 },
470
471 /* Got an I_JOIN_REQUEST */
472 {
473 /* S_IDLE ==> */ S_INTEGRATION,
474 /* S_ELECTION ==> */ S_ELECTION,
475 /* S_INTEGRATION ==> */ S_INTEGRATION,
476 /* S_FINALIZE_JOIN ==> */ S_INTEGRATION,
477 /* S_NOT_DC ==> */ S_NOT_DC,
478 /* S_POLICY_ENGINE ==> */ S_INTEGRATION,
479 /* S_RECOVERY ==> */ S_RECOVERY,
480 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
481 /* S_STARTING ==> */ S_STARTING,
482 /* S_PENDING ==> */ S_PENDING,
483 /* S_STOPPING ==> */ S_STOPPING,
484 /* S_TERMINATE ==> */ S_TERMINATE,
485 /* S_TRANSITION_ENGINE ==> */ S_INTEGRATION,
486 /* S_HALT ==> */ S_HALT,
487 },
488
489 /* Got an I_JOIN_RESULT */
490 {
491 /* S_IDLE ==> */ S_INTEGRATION,
492 /* S_ELECTION ==> */ S_ELECTION,
493 /* S_INTEGRATION ==> */ S_INTEGRATION,
494 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
495 /* S_NOT_DC ==> */ S_PENDING,
496 /* S_POLICY_ENGINE ==> */ S_INTEGRATION,
497 /* S_RECOVERY ==> */ S_RECOVERY,
498 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
499 /* S_STARTING ==> */ S_RECOVERY,
500 /* S_PENDING ==> */ S_PENDING,
501 /* S_STOPPING ==> */ S_STOPPING,
502 /* S_TERMINATE ==> */ S_TERMINATE,
503 /* S_TRANSITION_ENGINE ==> */ S_INTEGRATION,
504 /* S_HALT ==> */ S_HALT,
505 },
506
507 /* Got an I_WAIT_FOR_EVENT */
508 {
509 /* S_IDLE ==> */ S_IDLE,
510 /* S_ELECTION ==> */ S_ELECTION,
511 /* S_INTEGRATION ==> */ S_INTEGRATION,
512 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
513 /* S_NOT_DC ==> */ S_NOT_DC,
514 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
515 /* S_RECOVERY ==> */ S_RECOVERY,
516 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
517 /* S_STARTING ==> */ S_STARTING,
518 /* S_PENDING ==> */ S_PENDING,
519 /* S_STOPPING ==> */ S_STOPPING,
520 /* S_TERMINATE ==> */ S_TERMINATE,
521 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
522 /* S_HALT ==> */ S_HALT,
523 },
524
525 /* Got an I_DC_HEARTBEAT */
526 {
527 /* S_IDLE ==> */ S_IDLE,
528 /* S_ELECTION ==> */ S_ELECTION,
529 /* S_INTEGRATION ==> */ S_INTEGRATION,
530 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
531 /* S_NOT_DC ==> */ S_NOT_DC,
532 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
533 /* S_RECOVERY ==> */ S_RECOVERY,
534 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
535 /* S_STARTING ==> */ S_STARTING,
536 /* S_PENDING ==> */ S_PENDING,
537 /* S_STOPPING ==> */ S_STOPPING,
538 /* S_TERMINATE ==> */ S_TERMINATE,
539 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
540 /* S_HALT ==> */ S_HALT,
541 },
542
543 /* Got an I_PENDING */
544 {
545 /* S_IDLE ==> */ S_PENDING,
546 /* S_ELECTION ==> */ S_PENDING,
547 /* S_INTEGRATION ==> */ S_PENDING,
548 /* S_FINALIZE_JOIN ==> */ S_PENDING,
549 /* S_NOT_DC ==> */ S_PENDING,
550 /* S_POLICY_ENGINE ==> */ S_PENDING,
551 /* S_RECOVERY ==> */ S_RECOVERY,
552 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
553 /* S_STARTING ==> */ S_PENDING,
554 /* S_PENDING ==> */ S_PENDING,
555 /* S_STOPPING ==> */ S_STOPPING,
556 /* S_TERMINATE ==> */ S_TERMINATE,
557 /* S_TRANSITION_ENGINE ==> */ S_PENDING,
558 /* S_HALT ==> */ S_HALT,
559 },
560
561 /* Got an I_HALT */
562 {
563 /* S_IDLE ==> */ S_HALT,
564 /* S_ELECTION ==> */ S_HALT,
565 /* S_INTEGRATION ==> */ S_HALT,
566 /* S_FINALIZE_JOIN ==> */ S_HALT,
567 /* S_NOT_DC ==> */ S_HALT,
568 /* S_POLICY_ENGINE ==> */ S_HALT,
569 /* S_RECOVERY ==> */ S_RECOVERY,
570 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
571 /* S_STARTING ==> */ S_STARTING,
572 /* S_PENDING ==> */ S_HALT,
573 /* S_STOPPING ==> */ S_STOPPING,
574 /* S_TERMINATE ==> */ S_TERMINATE,
575 /* S_TRANSITION_ENGINE ==> */ S_HALT,
576 /* S_HALT ==> */ S_HALT,
577 },
578 };
579
580 /*
581 * The action table. Each entry is a set of actions to take or-ed
582 * together. Like the state table, the rows are inputs, and
583 * the columns are states.
584 */
585
586 /* NOTE: In the fsa, the actions are extracted then state is updated. */
587
588 static const uint64_t fsa_actions[MAXINPUT][MAXSTATE] = {
589
590 /* Got an I_NULL */
591 {
592 /* S_IDLE ==> */ A_NOTHING,
593 /* S_ELECTION ==> */ A_NOTHING,
594 /* S_INTEGRATION ==> */ A_NOTHING,
595 /* S_FINALIZE_JOIN ==> */ A_NOTHING,
596 /* S_NOT_DC ==> */ A_NOTHING,
597 /* S_POLICY_ENGINE ==> */ A_NOTHING,
598 /* S_RECOVERY ==> */ A_NOTHING,
599 /* S_RELEASE_DC ==> */ A_NOTHING,
600 /* S_STARTING ==> */ A_NOTHING,
601 /* S_PENDING ==> */ A_NOTHING,
602 /* S_STOPPING ==> */ A_NOTHING,
603 /* S_TERMINATE ==> */ A_NOTHING,
604 /* S_TRANSITION_ENGINE ==> */ A_NOTHING,
605 /* S_HALT ==> */ A_NOTHING,
606 },
607
608 /* Got an I_CIB_UPDATE */
609 {
610 /* S_IDLE ==> */ A_LOG,
611 /* S_ELECTION ==> */ A_LOG,
612 /* S_INTEGRATION ==> */ A_WARN,
613 /* S_FINALIZE_JOIN ==> */ A_WARN,
614 /* S_NOT_DC ==> */ A_WARN,
615 /* S_POLICY_ENGINE ==> */ A_LOG,
616 /* S_RECOVERY ==> */ A_WARN,
617 /* S_RELEASE_DC ==> */ A_WARN,
618 /* S_STARTING ==> */ A_WARN,
619 /* S_PENDING ==> */ A_WARN,
620 /* S_STOPPING ==> */ A_WARN,
621 /* S_TERMINATE ==> */ A_WARN,
622 /* S_TRANSITION_ENGINE ==> */ A_LOG,
623 /* S_HALT ==> */ A_WARN,
624 },
625
626 /* Got an I_DC_TIMEOUT */
627 {
628 /* S_IDLE ==> */ A_WARN,
629 /* S_ELECTION ==> */ A_ELECTION_VOTE,
630 /* S_INTEGRATION ==> */ A_WARN,
631 /* S_FINALIZE_JOIN ==> */ A_WARN,
632 /* S_NOT_DC ==> */ A_ELECTION_VOTE | A_WARN,
633 /* S_POLICY_ENGINE ==> */ A_WARN,
634 /* S_RECOVERY ==> */ A_NOTHING,
635 /* S_RELEASE_DC ==> */ A_WARN,
636 /* S_STARTING ==> */ A_WARN,
637 /* S_PENDING ==> */ A_ELECTION_VOTE | A_WARN,
638 /* S_STOPPING ==> */ A_NOTHING,
639 /* S_TERMINATE ==> */ A_NOTHING,
640 /* S_TRANSITION_ENGINE ==> */ A_TE_CANCEL | A_WARN,
641 /* S_HALT ==> */ A_WARN,
642 },
643
644 /* Got an I_ELECTION */
645 {
646 /* S_IDLE ==> */ A_ELECTION_VOTE,
647 /* S_ELECTION ==> */ A_ELECTION_VOTE,
648 /* S_INTEGRATION ==> */ A_ELECTION_VOTE,
649 /* S_FINALIZE_JOIN ==> */ A_ELECTION_VOTE,
650 /* S_NOT_DC ==> */ A_ELECTION_VOTE,
651 /* S_POLICY_ENGINE ==> */ A_ELECTION_VOTE,
652 /* S_RECOVERY ==> */ A_LOG,
653 /* S_RELEASE_DC ==> */ A_LOG,
654 /* S_STARTING ==> */ A_WARN,
655 /* S_PENDING ==> */ A_ELECTION_VOTE,
656 /* S_STOPPING ==> */ A_LOG,
657 /* S_TERMINATE ==> */ A_LOG,
658 /* S_TRANSITION_ENGINE ==> */ A_ELECTION_VOTE,
659 /* S_HALT ==> */ A_ELECTION_VOTE,
660 },
661
662 /* Got an I_PE_CALC */
663 {
664 /* S_IDLE ==> */ A_PE_INVOKE,
665 /* S_ELECTION ==> */ A_NOTHING,
666 /* S_INTEGRATION ==> */ A_NOTHING,
667 /* S_FINALIZE_JOIN ==> */ A_NOTHING,
668 /* S_NOT_DC ==> */ A_WARN,
669 /* S_POLICY_ENGINE ==> */ A_PE_INVOKE,
670 /* S_RECOVERY ==> */ A_NOTHING,
671 /* S_RELEASE_DC ==> */ A_NOTHING,
672 /* S_STARTING ==> */ A_ERROR,
673 /* S_PENDING ==> */ A_WARN,
674 /* S_STOPPING ==> */ A_WARN,
675 /* S_TERMINATE ==> */ A_ERROR,
676 /* S_TRANSITION_ENGINE ==> */ A_PE_INVOKE,
677 /* S_HALT ==> */ A_ERROR,
678 },
679
680 /* Got an I_RELEASE_DC */
681 {
682 /* S_IDLE ==> */ O_RELEASE,
683 /* S_ELECTION ==> */ O_RELEASE,
684 /* S_INTEGRATION ==> */ O_RELEASE | A_WARN,
685 /* S_FINALIZE_JOIN ==> */ O_RELEASE | A_WARN,
686 /* S_NOT_DC ==> */ A_WARN,
687 /* S_POLICY_ENGINE ==> */ O_RELEASE | A_WARN,
688 /* S_RECOVERY ==> */ O_RELEASE,
689 /* S_RELEASE_DC ==> */ O_RELEASE | A_WARN,
690 /* S_STARTING ==> */ A_ERROR,
691 /* S_PENDING ==> */ A_WARN,
692 /* S_STOPPING ==> */ A_WARN,
693 /* S_TERMINATE ==> */ A_WARN,
694 /* S_TRANSITION_ENGINE ==> */ O_RELEASE | A_WARN,
695 /* S_HALT ==> */ A_WARN,
696 },
697
698 /* Got an I_ELECTION_DC */
699 {
700 /* S_IDLE ==> */ A_WARN | A_ELECTION_VOTE,
701 /* S_ELECTION ==> */
702 A_LOG | A_DC_TAKEOVER | A_PE_START | A_TE_START | A_DC_JOIN_OFFER_ALL | A_DC_TIMER_STOP,
703 /* S_INTEGRATION ==> */ A_WARN | A_ELECTION_VOTE | A_DC_JOIN_OFFER_ALL,
704 /* S_FINALIZE_JOIN ==> */ A_WARN | A_ELECTION_VOTE | A_DC_JOIN_OFFER_ALL,
705 /* S_NOT_DC ==> */ A_LOG | A_ELECTION_VOTE,
706 /* S_POLICY_ENGINE ==> */ A_WARN | A_ELECTION_VOTE,
707 /* S_RECOVERY ==> */ A_WARN,
708 /* S_RELEASE_DC ==> */ A_WARN | A_ELECTION_VOTE,
709 /* S_STARTING ==> */ A_LOG | A_WARN,
710 /* S_PENDING ==> */ A_LOG | A_WARN,
711 /* S_STOPPING ==> */ A_WARN,
712 /* S_TERMINATE ==> */ A_WARN,
713 /* S_TRANSITION_ENGINE ==> */ A_WARN | A_ELECTION_VOTE,
714 /* S_HALT ==> */ A_WARN,
715 },
716
717 /* Got an I_ERROR */
718 {
719 /* S_IDLE ==> */ A_ERROR | A_RECOVER | O_RELEASE | A_ELECTION_START,
720 /* S_ELECTION ==> */ A_ERROR | A_RECOVER | O_RELEASE,
721 /* S_INTEGRATION ==> */ A_ERROR | A_RECOVER | O_RELEASE | A_ELECTION_START,
722 /* S_FINALIZE_JOIN ==> */ A_ERROR | A_RECOVER | O_RELEASE | A_ELECTION_START,
723 /* S_NOT_DC ==> */ A_ERROR | A_RECOVER,
724 /* S_POLICY_ENGINE ==> */ A_ERROR | A_RECOVER | O_RELEASE | A_ELECTION_START,
725 /* S_RECOVERY ==> */ A_ERROR | O_RELEASE,
726 /* S_RELEASE_DC ==> */ A_ERROR | A_RECOVER,
727 /* S_STARTING ==> */ A_ERROR | A_RECOVER,
728 /* S_PENDING ==> */ A_ERROR | A_RECOVER,
729 /* S_STOPPING ==> */ A_ERROR | A_EXIT_1,
730 /* S_TERMINATE ==> */ A_ERROR | A_EXIT_1,
731 /* S_TRANSITION_ENGINE ==> */ A_ERROR | A_RECOVER | O_RELEASE | A_ELECTION_START,
732 /* S_HALT ==> */ A_ERROR | A_RECOVER | O_RELEASE | A_ELECTION_START,
733 },
734
735 /* Got an I_FAIL */
736 {
737 /* S_IDLE ==> */ A_WARN,
738 /* S_ELECTION ==> */ A_WARN,
739 /* S_INTEGRATION ==> */ A_WARN | A_DC_JOIN_OFFER_ALL,
740 /* S_FINALIZE_JOIN ==> */ A_WARN | A_DC_JOIN_OFFER_ALL,
741 /* S_NOT_DC ==> */ A_WARN,
742 /* S_POLICY_ENGINE ==> */ A_WARN | A_DC_JOIN_OFFER_ALL | A_TE_CANCEL,
743 /* S_RECOVERY ==> */ A_WARN | O_RELEASE,
744 /* S_RELEASE_DC ==> */ A_WARN,
745 /* S_STARTING ==> */ A_WARN,
746 /* S_PENDING ==> */ A_WARN,
747 /* S_STOPPING ==> */ A_WARN,
748 /* S_TERMINATE ==> */ A_WARN | A_EXIT_1,
749 /* S_TRANSITION_ENGINE ==> */ A_WARN | O_LRM_RECONNECT | A_PE_INVOKE | A_TE_CANCEL,
750 /* S_HALT ==> */ A_WARN,
751 },
752
753 /* Got an I_INTEGRATED */
754 {
755 /* S_IDLE ==> */ A_NOTHING,
756 /* S_ELECTION ==> */ A_WARN,
757 /* S_INTEGRATION ==> */ A_DC_JOIN_FINALIZE,
758 /* S_FINALIZE_JOIN ==> */ A_WARN,
759 /* S_NOT_DC ==> */ A_WARN,
760 /* S_POLICY_ENGINE ==> */ A_NOTHING,
761 /* S_RECOVERY ==> */ A_WARN,
762 /* S_RELEASE_DC ==> */ A_WARN,
763 /* S_STARTING ==> */ A_WARN,
764 /* S_PENDING ==> */ A_WARN,
765 /* S_STOPPING ==> */ A_WARN,
766 /* S_TERMINATE ==> */ A_WARN,
767 /* S_TRANSITION_ENGINE ==> */ A_NOTHING,
768 /* S_HALT ==> */ A_WARN,
769 },
770
771 /* Got an I_FINALIZED */
772 {
773 /* S_IDLE ==> */ A_NOTHING,
774 /* S_ELECTION ==> */ A_WARN,
775 /* S_INTEGRATION ==> */ A_WARN,
776 /* S_FINALIZE_JOIN ==> */ A_DC_JOIN_FINAL | A_TE_CANCEL,
777 /* S_NOT_DC ==> */ A_WARN,
778 /* S_POLICY_ENGINE ==> */ A_NOTHING,
779 /* S_RECOVERY ==> */ A_WARN,
780 /* S_RELEASE_DC ==> */ A_WARN,
781 /* S_STARTING ==> */ A_WARN,
782 /* S_PENDING ==> */ A_WARN,
783 /* S_STOPPING ==> */ A_WARN,
784 /* S_TERMINATE ==> */ A_WARN,
785 /* S_TRANSITION_ENGINE ==> */ A_NOTHING,
786 /* S_HALT ==> */ A_WARN,
787 },
788
789 /* Got an I_NODE_JOIN */
790 {
791 /* S_IDLE ==> */ A_TE_HALT | A_DC_JOIN_OFFER_ONE,
792 /* S_ELECTION ==> */ A_WARN,
793 /* S_INTEGRATION ==> */ A_DC_JOIN_OFFER_ONE,
794 /* S_FINALIZE_JOIN ==> */ A_DC_JOIN_OFFER_ONE,
795 /* S_NOT_DC ==> */ A_WARN,
796 /* S_POLICY_ENGINE ==> */ A_DC_JOIN_OFFER_ONE,
797 /* S_RECOVERY ==> */ A_WARN,
798 /* S_RELEASE_DC ==> */ A_WARN,
799 /* S_STARTING ==> */ A_WARN,
800 /* S_PENDING ==> */ A_WARN,
801 /* S_STOPPING ==> */ A_WARN,
802 /* S_TERMINATE ==> */ A_WARN,
803 /* S_TRANSITION_ENGINE ==> */ A_TE_HALT | A_DC_JOIN_OFFER_ONE,
804 /* S_HALT ==> */ A_WARN,
805 },
806
807 /* Got an I_NOT_DC */
808 {
809 /* S_IDLE ==> */ A_WARN | O_RELEASE,
810 /* S_ELECTION ==> */ A_ERROR | A_ELECTION_START | A_DC_TIMER_STOP,
811 /* S_INTEGRATION ==> */ A_ERROR | O_RELEASE,
812 /* S_FINALIZE_JOIN ==> */ A_ERROR | O_RELEASE,
813 /* S_NOT_DC ==> */ A_LOG,
814 /* S_POLICY_ENGINE ==> */ A_ERROR | O_RELEASE,
815 /* S_RECOVERY ==> */ A_ERROR | O_RELEASE,
816 /* S_RELEASE_DC ==> */ A_ERROR | O_RELEASE,
817 /* S_STARTING ==> */ A_WARN,
818 /* S_PENDING ==> */ A_LOG | A_DC_TIMER_STOP,
819 /* S_STOPPING ==> */ A_WARN,
820 /* S_TERMINATE ==> */ A_WARN,
821 /* S_TRANSITION_ENGINE ==> */ A_ERROR | O_RELEASE,
822 /* S_HALT ==> */ A_WARN,
823 },
824
825 /* Got an I_RECOVERED */
826 {
827 /* S_IDLE ==> */ A_WARN,
828 /* S_ELECTION ==> */ A_ELECTION_VOTE,
829 /* S_INTEGRATION ==> */ A_WARN,
830 /* S_FINALIZE_JOIN ==> */ A_WARN,
831 /* S_NOT_DC ==> */ A_WARN,
832 /* S_POLICY_ENGINE ==> */ A_WARN,
833 /* S_RECOVERY ==> */ A_LOG,
834 /* S_RELEASE_DC ==> */ A_WARN,
835 /* S_STARTING ==> */ A_WARN,
836 /* S_PENDING ==> */ A_WARN,
837 /* S_STOPPING ==> */ A_WARN,
838 /* S_TERMINATE ==> */ A_WARN,
839 /* S_TRANSITION_ENGINE ==> */ A_WARN,
840 /* S_HALT ==> */ A_WARN,
841 },
842
843 /* Got an I_RELEASE_FAIL */
844 {
845 /* S_IDLE ==> */ A_WARN,
846 /* S_ELECTION ==> */ A_WARN,
847 /* S_INTEGRATION ==> */ A_WARN,
848 /* S_FINALIZE_JOIN ==> */ A_WARN,
849 /* S_NOT_DC ==> */ A_WARN,
850 /* S_POLICY_ENGINE ==> */ A_NOTHING,
851 /* S_RECOVERY ==> */ A_WARN | A_SHUTDOWN_REQ,
852 /* S_RELEASE_DC ==> */ A_NOTHING,
853 /* S_STARTING ==> */ A_WARN,
854 /* S_PENDING ==> */ A_WARN,
855 /* S_STOPPING ==> */ A_WARN,
856 /* S_TERMINATE ==> */ A_WARN,
857 /* S_TRANSITION_ENGINE ==> */ A_WARN,
858 /* S_HALT ==> */ A_WARN,
859 },
860
861 /* Got an I_RELEASE_SUCCESS */
862 {
863 /* S_IDLE ==> */ A_WARN,
864 /* S_ELECTION ==> */ A_WARN,
865 /* S_INTEGRATION ==> */ A_WARN,
866 /* S_FINALIZE_JOIN ==> */ A_WARN,
867 /* S_NOT_DC ==> */ A_WARN,
868 /* S_POLICY_ENGINE ==> */ A_WARN,
869 /* S_RECOVERY ==> */ A_WARN,
870 /* S_RELEASE_DC ==> */ A_LOG,
871 /* S_STARTING ==> */ A_WARN,
872 /* S_PENDING ==> */ A_LOG,
873 /* S_STOPPING ==> */ A_WARN,
874 /* S_TERMINATE ==> */ A_WARN,
875 /* S_TRANSITION_ENGINE ==> */ A_WARN,
876 /* S_HALT ==> */ A_WARN,
877 },
878
879 /* Got an I_RESTART */
880 {
881 /* S_IDLE ==> */ A_NOTHING,
882 /* S_ELECTION ==> */ A_LOG | A_ELECTION_VOTE,
883 /* S_INTEGRATION ==> */ A_LOG | A_DC_JOIN_OFFER_ALL,
884 /* S_FINALIZE_JOIN ==> */ A_LOG | A_DC_JOIN_FINALIZE,
885 /* S_NOT_DC ==> */ A_LOG | A_NOTHING,
886 /* S_POLICY_ENGINE ==> */ A_LOG | A_PE_INVOKE,
887 /* S_RECOVERY ==> */ A_LOG | A_RECOVER | O_RELEASE,
888 /* S_RELEASE_DC ==> */ A_LOG | O_RELEASE,
889 /* S_STARTING ==> */ A_LOG,
890 /* S_PENDING ==> */ A_LOG,
891 /* S_STOPPING ==> */ A_LOG,
892 /* S_TERMINATE ==> */ A_LOG,
893 /* S_TRANSITION_ENGINE ==> */ A_LOG | A_TE_INVOKE,
894 /* S_HALT ==> */ A_WARN,
895 },
896
897 /* Got an I_TE_SUCCESS */
898 {
899 /* S_IDLE ==> */ A_LOG,
900 /* S_ELECTION ==> */ A_WARN,
901 /* S_INTEGRATION ==> */ A_WARN,
902 /* S_FINALIZE_JOIN ==> */ A_WARN,
903 /* S_NOT_DC ==> */ A_ERROR,
904 /* S_POLICY_ENGINE ==> */ A_WARN,
905 /* S_RECOVERY ==> */ A_RECOVER | A_WARN,
906 /* S_RELEASE_DC ==> */ A_WARN,
907 /* S_STARTING ==> */ A_ERROR,
908 /* S_PENDING ==> */ A_ERROR,
909 /* S_STOPPING ==> */ A_WARN,
910 /* S_TERMINATE ==> */ A_WARN,
911 /* S_TRANSITION_ENGINE ==> */ A_LOG,
912 /* S_HALT ==> */ A_WARN,
913 },
914
915 /* Got an I_ROUTER */
916 {
917 /* S_IDLE ==> */ A_MSG_ROUTE,
918 /* S_ELECTION ==> */ A_MSG_ROUTE,
919 /* S_INTEGRATION ==> */ A_MSG_ROUTE,
920 /* S_FINALIZE_JOIN ==> */ A_MSG_ROUTE,
921 /* S_NOT_DC ==> */ A_MSG_ROUTE,
922 /* S_POLICY_ENGINE ==> */ A_MSG_ROUTE,
923 /* S_RECOVERY ==> */ A_MSG_ROUTE,
924 /* S_RELEASE_DC ==> */ A_MSG_ROUTE,
925 /* S_STARTING ==> */ A_MSG_ROUTE,
926 /* S_PENDING ==> */ A_MSG_ROUTE,
927 /* S_STOPPING ==> */ A_MSG_ROUTE,
928 /* S_TERMINATE ==> */ A_MSG_ROUTE,
929 /* S_TRANSITION_ENGINE ==> */ A_MSG_ROUTE,
930 /* S_HALT ==> */ A_WARN | A_MSG_ROUTE,
931 },
932
933 /* Got an I_SHUTDOWN */
934 {
935 /* S_IDLE ==> */ A_LOG | A_SHUTDOWN_REQ,
936 /* S_ELECTION ==> */ A_LOG | A_SHUTDOWN_REQ | A_ELECTION_VOTE,
937 /* S_INTEGRATION ==> */ A_LOG | A_SHUTDOWN_REQ,
938 /* S_FINALIZE_JOIN ==> */ A_LOG | A_SHUTDOWN_REQ,
939 /* S_NOT_DC ==> */ A_SHUTDOWN_REQ,
940 /* S_POLICY_ENGINE ==> */ A_LOG | A_SHUTDOWN_REQ,
941 /* S_RECOVERY ==> */ A_WARN | O_EXIT | O_RELEASE,
942 /* S_RELEASE_DC ==> */ A_WARN | A_SHUTDOWN_REQ,
943 /* S_STARTING ==> */ A_WARN | O_EXIT,
944 /* S_PENDING ==> */ A_SHUTDOWN_REQ,
945 /* S_STOPPING ==> */ A_LOG,
946 /* S_TERMINATE ==> */ A_LOG,
947 /* S_TRANSITION_ENGINE ==> */ A_WARN | A_SHUTDOWN_REQ,
948 /* S_HALT ==> */ A_WARN | A_ELECTION_START | A_SHUTDOWN_REQ,
949 },
950
951 /* Got an I_STOP */
952 {
953 /* S_IDLE ==> */ A_ERROR | O_RELEASE | O_EXIT,
954 /* S_ELECTION ==> */ O_RELEASE | O_EXIT,
955 /* S_INTEGRATION ==> */ A_WARN | O_RELEASE | O_EXIT,
956 /* S_FINALIZE_JOIN ==> */ A_ERROR | O_RELEASE | O_EXIT,
957 /* S_NOT_DC ==> */ O_EXIT,
958 /* S_POLICY_ENGINE ==> */ A_WARN | O_RELEASE | O_EXIT,
959 /* S_RECOVERY ==> */ A_ERROR | O_RELEASE | O_EXIT,
960 /* S_RELEASE_DC ==> */ A_ERROR | O_RELEASE | O_EXIT,
961 /* S_STARTING ==> */ O_EXIT,
962 /* S_PENDING ==> */ O_EXIT,
963 /* S_STOPPING ==> */ O_EXIT,
964 /* S_TERMINATE ==> */ A_ERROR | A_EXIT_1,
965 /* S_TRANSITION_ENGINE ==> */ A_LOG | O_RELEASE | O_EXIT,
966 /* S_HALT ==> */ O_RELEASE | O_EXIT | A_WARN,
967 },
968
969 /* Got an I_TERMINATE */
970 {
971 /* S_IDLE ==> */ A_ERROR | O_EXIT,
972 /* S_ELECTION ==> */ A_ERROR | O_EXIT,
973 /* S_INTEGRATION ==> */ A_ERROR | O_EXIT,
974 /* S_FINALIZE_JOIN ==> */ A_ERROR | O_EXIT,
975 /* S_NOT_DC ==> */ A_ERROR | O_EXIT,
976 /* S_POLICY_ENGINE ==> */ A_ERROR | O_EXIT,
977 /* S_RECOVERY ==> */ A_ERROR | O_EXIT,
978 /* S_RELEASE_DC ==> */ A_ERROR | O_EXIT,
979 /* S_STARTING ==> */ O_EXIT,
980 /* S_PENDING ==> */ A_ERROR | O_EXIT,
981 /* S_STOPPING ==> */ O_EXIT,
982 /* S_TERMINATE ==> */ O_EXIT,
983 /* S_TRANSITION_ENGINE ==> */ A_ERROR | O_EXIT,
984 /* S_HALT ==> */ A_ERROR | O_EXIT,
985 },
986
987 /* Got an I_STARTUP */
988 {
989 /* S_IDLE ==> */ A_WARN,
990 /* S_ELECTION ==> */ A_WARN,
991 /* S_INTEGRATION ==> */ A_WARN,
992 /* S_FINALIZE_JOIN ==> */ A_WARN,
993 /* S_NOT_DC ==> */ A_WARN,
994 /* S_POLICY_ENGINE ==> */ A_WARN,
995 /* S_RECOVERY ==> */ A_WARN,
996 /* S_RELEASE_DC ==> */ A_WARN,
997 /* S_STARTING ==> */
998 A_LOG | A_STARTUP | A_CIB_START | A_LRM_CONNECT | A_HA_CONNECT | A_READCONFIG | A_STARTED,
999 /* S_PENDING ==> */ A_LOG,
1000 /* S_STOPPING ==> */ A_WARN,
1001 /* S_TERMINATE ==> */ A_WARN,
1002 /* S_TRANSITION_ENGINE ==> */ A_WARN,
1003 /* S_HALT ==> */ A_WARN,
1004 },
1005
1006 /* Got an I_PE_SUCCESS */
1007 {
1008 /* S_IDLE ==> */ A_LOG,
1009 /* S_ELECTION ==> */ A_WARN,
1010 /* S_INTEGRATION ==> */ A_WARN,
1011 /* S_FINALIZE_JOIN ==> */ A_WARN,
1012 /* S_NOT_DC ==> */ A_NOTHING,
1013 /* S_POLICY_ENGINE ==> */ A_TE_INVOKE,
1014 /* S_RECOVERY ==> */ A_RECOVER | A_LOG,
1015 /* S_RELEASE_DC ==> */ A_LOG,
1016 /* S_STARTING ==> */ A_ERROR,
1017 /* S_PENDING ==> */ A_LOG,
1018 /* S_STOPPING ==> */ A_ERROR,
1019 /* S_TERMINATE ==> */ A_ERROR,
1020 /* S_TRANSITION_ENGINE ==> */ A_LOG,
1021 /* S_HALT ==> */ A_WARN,
1022 },
1023
1024 /* Got an I_JOIN_OFFER */
1025 {
1026 /* S_IDLE ==> */ A_WARN | A_CL_JOIN_REQUEST,
1027 /* S_ELECTION ==> */ A_WARN | A_ELECTION_VOTE,
1028 /* S_INTEGRATION ==> */ A_CL_JOIN_REQUEST,
1029 /* S_FINALIZE_JOIN ==> */ A_CL_JOIN_REQUEST,
1030 /* S_NOT_DC ==> */ A_CL_JOIN_REQUEST | A_DC_TIMER_STOP,
1031 /* S_POLICY_ENGINE ==> */ A_WARN | A_CL_JOIN_REQUEST,
1032 /* S_RECOVERY ==> */ A_WARN | A_CL_JOIN_REQUEST | A_DC_TIMER_STOP,
1033 /* S_RELEASE_DC ==> */ A_WARN | A_CL_JOIN_REQUEST | A_DC_TIMER_STOP,
1034 /* S_STARTING ==> */ A_LOG,
1035 /* S_PENDING ==> */ A_CL_JOIN_REQUEST | A_DC_TIMER_STOP,
1036 /* S_STOPPING ==> */ A_LOG,
1037 /* S_TERMINATE ==> */ A_LOG,
1038 /* S_TRANSITION_ENGINE ==> */ A_WARN | A_CL_JOIN_REQUEST,
1039 /* S_HALT ==> */ A_WARN,
1040 },
1041
1042 /* Got an I_JOIN_REQUEST */
1043 {
1044 /* S_IDLE ==> */ A_DC_JOIN_OFFER_ONE,
1045 /* S_ELECTION ==> */ A_WARN,
1046 /* S_INTEGRATION ==> */ A_DC_JOIN_PROCESS_REQ,
1047 /* S_FINALIZE_JOIN ==> */ A_DC_JOIN_OFFER_ONE,
1048 /* S_NOT_DC ==> */ A_WARN,
1049 /* S_POLICY_ENGINE ==> */ A_DC_JOIN_OFFER_ONE,
1050 /* S_RECOVERY ==> */ A_WARN,
1051 /* S_RELEASE_DC ==> */ A_WARN,
1052 /* S_STARTING ==> */ A_WARN,
1053 /* S_PENDING ==> */ A_WARN,
1054 /* S_STOPPING ==> */ A_WARN,
1055 /* S_TERMINATE ==> */ A_WARN,
1056 /* S_TRANSITION_ENGINE ==> */ A_DC_JOIN_OFFER_ONE,
1057 /* S_HALT ==> */ A_WARN,
1058 },
1059
1060 /* Got an I_JOIN_RESULT */
1061 {
1062 /* S_IDLE ==> */ A_ERROR | A_TE_HALT | A_DC_JOIN_OFFER_ALL,
1063 /* S_ELECTION ==> */ A_LOG,
1064 /* S_INTEGRATION ==> */ A_LOG | A_CL_JOIN_RESULT | A_DC_JOIN_PROCESS_ACK,
1065 /* S_FINALIZE_JOIN ==> */ A_CL_JOIN_RESULT | A_DC_JOIN_PROCESS_ACK,
1066 /* S_NOT_DC ==> */ A_ERROR | A_CL_JOIN_ANNOUNCE,
1067 /* S_POLICY_ENGINE ==> */ A_ERROR | A_TE_HALT | A_DC_JOIN_OFFER_ALL,
1068 /* S_RECOVERY ==> */ A_LOG,
1069 /* S_RELEASE_DC ==> */ A_LOG,
1070 /* S_STARTING ==> */ A_ERROR,
1071 /* S_PENDING ==> */ A_CL_JOIN_RESULT,
1072 /* S_STOPPING ==> */ A_ERROR,
1073 /* S_TERMINATE ==> */ A_ERROR,
1074 /* S_TRANSITION_ENGINE ==> */ A_ERROR | A_TE_HALT | A_DC_JOIN_OFFER_ALL,
1075 /* S_HALT ==> */ A_WARN,
1076 },
1077
1078 /* Got an I_WAIT_FOR_EVENT */
1079 {
1080 /* S_IDLE ==> */ A_LOG,
1081 /* S_ELECTION ==> */ A_LOG,
1082 /* S_INTEGRATION ==> */ A_LOG,
1083 /* S_FINALIZE_JOIN ==> */ A_LOG,
1084 /* S_NOT_DC ==> */ A_LOG,
1085 /* S_POLICY_ENGINE ==> */ A_LOG,
1086 /* S_RECOVERY ==> */ A_LOG,
1087 /* S_RELEASE_DC ==> */ A_LOG,
1088 /* S_STARTING ==> */ A_LOG,
1089 /* S_PENDING ==> */ A_LOG,
1090 /* S_STOPPING ==> */ A_LOG,
1091 /* S_TERMINATE ==> */ A_LOG,
1092 /* S_TRANSITION_ENGINE ==> */ A_LOG,
1093 /* S_HALT ==> */ A_WARN,
1094 },
1095
1096 /* Got an I_DC_HEARTBEAT */
1097 {
1098 /* S_IDLE ==> */ A_ERROR,
1099 /* S_ELECTION ==> */ A_WARN | A_ELECTION_VOTE,
1100 /* S_INTEGRATION ==> */ A_ERROR,
1101 /* S_FINALIZE_JOIN ==> */ A_ERROR,
1102 /* S_NOT_DC ==> */ A_NOTHING,
1103 /* S_POLICY_ENGINE ==> */ A_ERROR,
1104 /* S_RECOVERY ==> */ A_NOTHING,
1105 /* S_RELEASE_DC ==> */ A_LOG,
1106 /* S_STARTING ==> */ A_LOG,
1107 /* S_PENDING ==> */ A_LOG | A_CL_JOIN_ANNOUNCE,
1108 /* S_STOPPING ==> */ A_NOTHING,
1109 /* S_TERMINATE ==> */ A_NOTHING,
1110 /* S_TRANSITION_ENGINE ==> */ A_ERROR,
1111 /* S_HALT ==> */ A_WARN,
1112 },
1113
1114 /* For everyone ending up in S_PENDING, (re)start the DC timer and wait for I_JOIN_OFFER or I_NOT_DC */
1115 /* Got an I_PENDING */
1116 {
1117 /* S_IDLE ==> */ O_RELEASE | O_DC_TIMER_RESTART,
1118 /* S_ELECTION ==> */ O_RELEASE | O_DC_TIMER_RESTART,
1119 /* S_INTEGRATION ==> */ O_RELEASE | O_DC_TIMER_RESTART,
1120 /* S_FINALIZE_JOIN ==> */ O_RELEASE | O_DC_TIMER_RESTART,
1121 /* S_NOT_DC ==> */ A_LOG | O_DC_TIMER_RESTART,
1122 /* S_POLICY_ENGINE ==> */ O_RELEASE | O_DC_TIMER_RESTART,
1123 /* S_RECOVERY ==> */ A_WARN,
1124 /* S_RELEASE_DC ==> */ A_WARN | O_DC_TIMER_RESTART,
1125 /* S_STARTING ==> */ A_LOG | A_DC_TIMER_START | A_CL_JOIN_QUERY,
1126 /* S_PENDING ==> */ A_LOG | O_DC_TIMER_RESTART,
1127 /* S_STOPPING ==> */ A_WARN,
1128 /* S_TERMINATE ==> */ A_WARN,
1129 /* S_TRANSITION_ENGINE ==> */ O_RELEASE | O_DC_TIMER_RESTART,
1130 /* S_HALT ==> */ A_WARN,
1131 },
1132
1133 /* Got an I_HALT */
1134 {
1135 /* S_IDLE ==> */ A_WARN,
1136 /* S_ELECTION ==> */ A_WARN,
1137 /* S_INTEGRATION ==> */ A_WARN,
1138 /* S_FINALIZE_JOIN ==> */ A_WARN,
1139 /* S_NOT_DC ==> */ A_WARN,
1140 /* S_POLICY_ENGINE ==> */ A_WARN,
1141 /* S_RECOVERY ==> */ A_WARN,
1142 /* S_RELEASE_DC ==> */ A_WARN,
1143 /* S_STARTING ==> */ A_WARN,
1144 /* S_PENDING ==> */ A_WARN,
1145 /* S_STOPPING ==> */ A_WARN,
1146 /* S_TERMINATE ==> */ A_WARN,
1147 /* S_TRANSITION_ENGINE ==> */ A_WARN,
1148 /* S_HALT ==> */ A_WARN,
1149 },
1150 };
1151
1152 /*!
1153 * \internal
1154 * \brief Get the next FSA state given an input and the current state
1155 *
1156 * \param[in] input FSA input
1157 *
1158 * \return The next FSA state
1159 */
1160 enum crmd_fsa_state
1161 controld_fsa_get_next_state(enum crmd_fsa_input input)
/* ![[previous]](../icons/n_left.png)
![[next]](../icons/right.png)
![[first]](../icons/n_first.png)
![[last]](../icons/last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
1162 {
1163 return fsa_next_states[input][controld_globals.fsa_state];
1164 }
1165
1166 /*!
1167 * \internal
1168 * \brief Get the appropriate FSA action given an input and the current state
1169 *
1170 * \param[in] input FSA input
1171 *
1172 * \return The appropriate FSA action
1173 */
1174 uint64_t
1175 controld_fsa_get_action(enum crmd_fsa_input input)
/* ![[previous]](../icons/left.png)
![[next]](../icons/n_right.png)
![[first]](../icons/first.png)
![[last]](../icons/n_last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
1176 {
1177 return fsa_actions[input][controld_globals.fsa_state];
1178 }