1 /*
2 * Copyright 2004-2022 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_OP */
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_NOT_DC,
46 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
47 /* S_RECOVERY ==> */ S_RECOVERY,
48 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
49 /* S_STARTING ==> */ S_STARTING,
50 /* S_PENDING ==> */ S_PENDING,
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_CIB_UPDATE */
58 {
59 /* S_IDLE ==> */ S_IDLE,
60 /* S_ELECTION ==> */ S_ELECTION,
61 /* S_INTEGRATION ==> */ S_INTEGRATION,
62 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
63 /* S_NOT_DC ==> */ S_RECOVERY,
64 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
65 /* S_RECOVERY ==> */ S_RECOVERY,
66 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
67 /* S_STARTING ==> */ S_RECOVERY,
68 /* S_PENDING ==> */ S_RECOVERY,
69 /* S_STOPPING ==> */ S_STOPPING,
70 /* S_TERMINATE ==> */ S_TERMINATE,
71 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
72 /* S_HALT ==> */ S_HALT,
73 },
74
75 /* Got an I_DC_TIMEOUT */
76 {
77 /* S_IDLE ==> */ S_RECOVERY,
78 /* S_ELECTION ==> */ S_ELECTION,
79 /* S_INTEGRATION ==> */ S_RECOVERY,
80 /* S_FINALIZE_JOIN ==> */ S_RECOVERY,
81 /* S_NOT_DC ==> */ S_ELECTION,
82 /* S_POLICY_ENGINE ==> */ S_RECOVERY,
83 /* S_RECOVERY ==> */ S_RECOVERY,
84 /* S_RELEASE_DC ==> */ S_RECOVERY,
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_RECOVERY,
90 /* S_HALT ==> */ S_ELECTION,
91 },
92
93 /* Got an I_ELECTION */
94 {
95 /* S_IDLE ==> */ S_ELECTION,
96 /* S_ELECTION ==> */ S_ELECTION,
97 /* S_INTEGRATION ==> */ S_ELECTION,
98 /* S_FINALIZE_JOIN ==> */ S_ELECTION,
99 /* S_NOT_DC ==> */ S_ELECTION,
100 /* S_POLICY_ENGINE ==> */ S_ELECTION,
101 /* S_RECOVERY ==> */ S_RECOVERY,
102 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
103 /* S_STARTING ==> */ S_STARTING,
104 /* S_PENDING ==> */ S_ELECTION,
105 /* S_STOPPING ==> */ S_STOPPING,
106 /* S_TERMINATE ==> */ S_TERMINATE,
107 /* S_TRANSITION_ENGINE ==> */ S_ELECTION,
108 /* S_HALT ==> */ S_HALT,
109 },
110
111 /* Got an I_PE_CALC */
112 {
113 /* S_IDLE ==> */ S_POLICY_ENGINE,
114 /* S_ELECTION ==> */ S_ELECTION,
115 /* S_INTEGRATION ==> */ S_INTEGRATION,
116 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
117 /* S_NOT_DC ==> */ S_NOT_DC,
118 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
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_POLICY_ENGINE,
126 /* S_HALT ==> */ S_HALT,
127 },
128
129 /* Got an I_RELEASE_DC */
130 {
131 /* S_IDLE ==> */ S_RELEASE_DC,
132 /* S_ELECTION ==> */ S_RELEASE_DC,
133 /* S_INTEGRATION ==> */ S_RELEASE_DC,
134 /* S_FINALIZE_JOIN ==> */ S_RELEASE_DC,
135 /* S_NOT_DC ==> */ S_NOT_DC,
136 /* S_POLICY_ENGINE ==> */ S_RELEASE_DC,
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_RELEASE_DC,
144 /* S_HALT ==> */ S_HALT,
145 },
146
147 /* Got an I_ELECTION_DC */
148 {
149 /* S_IDLE ==> */ S_INTEGRATION,
150 /* S_ELECTION ==> */ S_INTEGRATION,
151 /* S_INTEGRATION ==> */ S_INTEGRATION,
152 /* S_FINALIZE_JOIN ==> */ S_INTEGRATION,
153 /* S_NOT_DC ==> */ S_INTEGRATION,
154 /* S_POLICY_ENGINE ==> */ S_INTEGRATION,
155 /* S_RECOVERY ==> */ S_RECOVERY,
156 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
157 /* S_STARTING ==> */ S_RECOVERY,
158 /* S_PENDING ==> */ S_PENDING,
159 /* S_STOPPING ==> */ S_STOPPING,
160 /* S_TERMINATE ==> */ S_TERMINATE,
161 /* S_TRANSITION_ENGINE ==> */ S_INTEGRATION,
162 /* S_HALT ==> */ S_HALT,
163 },
164
165 /* Got an I_ERROR */
166 {
167 /* S_IDLE ==> */ S_RECOVERY,
168 /* S_ELECTION ==> */ S_RECOVERY,
169 /* S_INTEGRATION ==> */ S_RECOVERY,
170 /* S_FINALIZE_JOIN ==> */ S_RECOVERY,
171 /* S_NOT_DC ==> */ S_RECOVERY,
172 /* S_POLICY_ENGINE ==> */ S_RECOVERY,
173 /* S_RECOVERY ==> */ S_RECOVERY,
174 /* S_RELEASE_DC ==> */ S_RECOVERY,
175 /* S_STARTING ==> */ S_RECOVERY,
176 /* S_PENDING ==> */ S_RECOVERY,
177 /* S_STOPPING ==> */ S_TERMINATE,
178 /* S_TERMINATE ==> */ S_TERMINATE,
179 /* S_TRANSITION_ENGINE ==> */ S_RECOVERY,
180 /* S_HALT ==> */ S_RECOVERY,
181 },
182
183 /* Got an I_FAIL */
184 {
185 /* S_IDLE ==> */ S_RECOVERY,
186 /* S_ELECTION ==> */ S_RELEASE_DC,
187 /* S_INTEGRATION ==> */ S_INTEGRATION,
188 /* S_FINALIZE_JOIN ==> */ S_INTEGRATION,
189 /* S_NOT_DC ==> */ S_RECOVERY,
190 /* S_POLICY_ENGINE ==> */ S_INTEGRATION,
191 /* S_RECOVERY ==> */ S_RECOVERY,
192 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
193 /* S_STARTING ==> */ S_STOPPING,
194 /* S_PENDING ==> */ S_STOPPING,
195 /* S_STOPPING ==> */ S_STOPPING,
196 /* S_TERMINATE ==> */ S_TERMINATE,
197 /* S_TRANSITION_ENGINE ==> */ S_POLICY_ENGINE,
198 /* S_HALT ==> */ S_RELEASE_DC,
199 },
200
201 /* Got an I_INTEGRATED */
202 {
203 /* S_IDLE ==> */ S_IDLE,
204 /* S_ELECTION ==> */ S_ELECTION,
205 /* S_INTEGRATION ==> */ S_FINALIZE_JOIN,
206 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
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_FINALIZED */
220 {
221 /* S_IDLE ==> */ S_IDLE,
222 /* S_ELECTION ==> */ S_ELECTION,
223 /* S_INTEGRATION ==> */ S_INTEGRATION,
224 /* S_FINALIZE_JOIN ==> */ S_POLICY_ENGINE,
225 /* S_NOT_DC ==> */ S_NOT_DC,
226 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
227 /* S_RECOVERY ==> */ S_RECOVERY,
228 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
229 /* S_STARTING ==> */ S_RECOVERY,
230 /* S_PENDING ==> */ S_RECOVERY,
231 /* S_STOPPING ==> */ S_STOPPING,
232 /* S_TERMINATE ==> */ S_TERMINATE,
233 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
234 /* S_HALT ==> */ S_HALT,
235 },
236
237 /* Got an I_NODE_JOIN */
238 {
239 /* S_IDLE ==> */ S_INTEGRATION,
240 /* S_ELECTION ==> */ S_ELECTION,
241 /* S_INTEGRATION ==> */ S_INTEGRATION,
242 /* S_FINALIZE_JOIN ==> */ S_INTEGRATION,
243 /* S_NOT_DC ==> */ S_NOT_DC,
244 /* S_POLICY_ENGINE ==> */ S_INTEGRATION,
245 /* S_RECOVERY ==> */ S_RECOVERY,
246 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
247 /* S_STARTING ==> */ S_RECOVERY,
248 /* S_PENDING ==> */ S_PENDING,
249 /* S_STOPPING ==> */ S_STOPPING,
250 /* S_TERMINATE ==> */ S_TERMINATE,
251 /* S_TRANSITION_ENGINE ==> */ S_INTEGRATION,
252 /* S_HALT ==> */ S_HALT,
253 },
254
255 /* Got an I_NOT_DC */
256 {
257 /* S_IDLE ==> */ S_RECOVERY,
258 /* S_ELECTION ==> */ S_ELECTION,
259 /* S_INTEGRATION ==> */ S_RECOVERY,
260 /* S_FINALIZE_JOIN ==> */ S_RECOVERY,
261 /* S_NOT_DC ==> */ S_NOT_DC,
262 /* S_POLICY_ENGINE ==> */ S_RECOVERY,
263 /* S_RECOVERY ==> */ S_RECOVERY,
264 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
265 /* S_STARTING ==> */ S_RECOVERY,
266 /* S_PENDING ==> */ S_NOT_DC,
267 /* S_STOPPING ==> */ S_STOPPING,
268 /* S_TERMINATE ==> */ S_TERMINATE,
269 /* S_TRANSITION_ENGINE ==> */ S_RECOVERY,
270 /* S_HALT ==> */ S_HALT,
271 },
272
273 /* Got an I_RECOVERED */
274 {
275 /* S_IDLE ==> */ S_IDLE,
276 /* S_ELECTION ==> */ S_ELECTION,
277 /* S_INTEGRATION ==> */ S_INTEGRATION,
278 /* S_FINALIZE_JOIN ==> */ S_INTEGRATION,
279 /* S_NOT_DC ==> */ S_NOT_DC,
280 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
281 /* S_RECOVERY ==> */ S_PENDING,
282 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
283 /* S_STARTING ==> */ S_STARTING,
284 /* S_PENDING ==> */ S_PENDING,
285 /* S_STOPPING ==> */ S_STOPPING,
286 /* S_TERMINATE ==> */ S_TERMINATE,
287 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
288 /* S_HALT ==> */ S_HALT,
289 },
290
291 /* Got an I_RELEASE_FAIL */
292 {
293 /* S_IDLE ==> */ S_STOPPING,
294 /* S_ELECTION ==> */ S_STOPPING,
295 /* S_INTEGRATION ==> */ S_STOPPING,
296 /* S_FINALIZE_JOIN ==> */ S_STOPPING,
297 /* S_NOT_DC ==> */ S_NOT_DC,
298 /* S_POLICY_ENGINE ==> */ S_STOPPING,
299 /* S_RECOVERY ==> */ S_STOPPING,
300 /* S_RELEASE_DC ==> */ S_STOPPING,
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_STOPPING,
306 /* S_HALT ==> */ S_HALT,
307 },
308
309 /* Got an I_RELEASE_SUCCESS */
310 {
311 /* S_IDLE ==> */ S_RECOVERY,
312 /* S_ELECTION ==> */ S_ELECTION,
313 /* S_INTEGRATION ==> */ S_RECOVERY,
314 /* S_FINALIZE_JOIN ==> */ S_RECOVERY,
315 /* S_NOT_DC ==> */ S_NOT_DC,
316 /* S_POLICY_ENGINE ==> */ S_RECOVERY,
317 /* S_RECOVERY ==> */ S_RECOVERY,
318 /* S_RELEASE_DC ==> */ S_PENDING,
319 /* S_STARTING ==> */ S_RECOVERY,
320 /* S_PENDING ==> */ S_PENDING,
321 /* S_STOPPING ==> */ S_STOPPING,
322 /* S_TERMINATE ==> */ S_TERMINATE,
323 /* S_TRANSITION_ENGINE ==> */ S_RECOVERY,
324 /* S_HALT ==> */ S_HALT,
325 },
326
327 /* Got an I_RESTART */
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_STARTING,
338 /* S_PENDING ==> */ S_PENDING,
339 /* S_STOPPING ==> */ S_STOPPING,
340 /* S_TERMINATE ==> */ S_TERMINATE,
341 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
342 /* S_HALT ==> */ S_HALT,
343 },
344
345 /* Got an I_TE_SUCCESS */
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_RECOVERY,
356 /* S_PENDING ==> */ S_PENDING,
357 /* S_STOPPING ==> */ S_STOPPING,
358 /* S_TERMINATE ==> */ S_TERMINATE,
359 /* S_TRANSITION_ENGINE ==> */ S_IDLE,
360 /* S_HALT ==> */ S_HALT,
361 },
362
363 /* Got an I_ROUTER */
364 {
365 /* S_IDLE ==> */ S_IDLE,
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_RECOVERY,
372 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
373 /* S_STARTING ==> */ S_STARTING,
374 /* S_PENDING ==> */ S_PENDING,
375 /* S_STOPPING ==> */ S_STOPPING,
376 /* S_TERMINATE ==> */ S_TERMINATE,
377 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
378 /* S_HALT ==> */ S_HALT,
379 },
380
381 /* Got an I_SHUTDOWN */
382 {
383 /* S_IDLE ==> */ S_POLICY_ENGINE,
384 /* S_ELECTION ==> */ S_ELECTION,
385 /* S_INTEGRATION ==> */ S_INTEGRATION,
386 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
387 /* S_NOT_DC ==> */ S_NOT_DC,
388 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
389 /* S_RECOVERY ==> */ S_STOPPING,
390 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
391 /* S_STARTING ==> */ S_STOPPING,
392 /* S_PENDING ==> */ S_PENDING,
393 /* S_STOPPING ==> */ S_STOPPING,
394 /* S_TERMINATE ==> */ S_TERMINATE,
395 /* S_TRANSITION_ENGINE ==> */ S_POLICY_ENGINE,
396 /* S_HALT ==> */ S_ELECTION,
397 },
398
399 /* Got an I_STOP */
400 {
401 /* S_IDLE ==> */ S_STOPPING,
402 /* S_ELECTION ==> */ S_STOPPING,
403 /* S_INTEGRATION ==> */ S_STOPPING,
404 /* S_FINALIZE_JOIN ==> */ S_STOPPING,
405 /* S_NOT_DC ==> */ S_STOPPING,
406 /* S_POLICY_ENGINE ==> */ S_STOPPING,
407 /* S_RECOVERY ==> */ S_STOPPING,
408 /* S_RELEASE_DC ==> */ S_STOPPING,
409 /* S_STARTING ==> */ S_STOPPING,
410 /* S_PENDING ==> */ S_STOPPING,
411 /* S_STOPPING ==> */ S_STOPPING,
412 /* S_TERMINATE ==> */ S_TERMINATE,
413 /* S_TRANSITION_ENGINE ==> */ S_STOPPING,
414 /* S_HALT ==> */ S_STOPPING,
415 },
416
417 /* Got an I_TERMINATE */
418 {
419 /* S_IDLE ==> */ S_TERMINATE,
420 /* S_ELECTION ==> */ S_TERMINATE,
421 /* S_INTEGRATION ==> */ S_TERMINATE,
422 /* S_FINALIZE_JOIN ==> */ S_TERMINATE,
423 /* S_NOT_DC ==> */ S_TERMINATE,
424 /* S_POLICY_ENGINE ==> */ S_TERMINATE,
425 /* S_RECOVERY ==> */ S_TERMINATE,
426 /* S_RELEASE_DC ==> */ S_TERMINATE,
427 /* S_STARTING ==> */ S_TERMINATE,
428 /* S_PENDING ==> */ S_TERMINATE,
429 /* S_STOPPING ==> */ S_TERMINATE,
430 /* S_TERMINATE ==> */ S_TERMINATE,
431 /* S_TRANSITION_ENGINE ==> */ S_TERMINATE,
432 /* S_HALT ==> */ S_TERMINATE,
433 },
434
435 /* Got an I_STARTUP */
436 {
437 /* S_IDLE ==> */ S_RECOVERY,
438 /* S_ELECTION ==> */ S_RECOVERY,
439 /* S_INTEGRATION ==> */ S_RECOVERY,
440 /* S_FINALIZE_JOIN ==> */ S_RECOVERY,
441 /* S_NOT_DC ==> */ S_RECOVERY,
442 /* S_POLICY_ENGINE ==> */ S_RECOVERY,
443 /* S_RECOVERY ==> */ S_RECOVERY,
444 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
445 /* S_STARTING ==> */ S_STARTING,
446 /* S_PENDING ==> */ S_PENDING,
447 /* S_STOPPING ==> */ S_STOPPING,
448 /* S_TERMINATE ==> */ S_TERMINATE,
449 /* S_TRANSITION_ENGINE ==> */ S_RECOVERY,
450 /* S_HALT ==> */ S_HALT,
451 },
452
453 /* Got an I_PE_SUCCESS */
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_NOT_DC,
460 /* S_POLICY_ENGINE ==> */ S_TRANSITION_ENGINE,
461 /* S_RECOVERY ==> */ S_RECOVERY,
462 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
463 /* S_STARTING ==> */ S_RECOVERY,
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_OFFER */
472 {
473 /* S_IDLE ==> */ S_IDLE,
474 /* S_ELECTION ==> */ S_ELECTION,
475 /* S_INTEGRATION ==> */ S_INTEGRATION,
476 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
477 /* S_NOT_DC ==> */ S_PENDING,
478 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
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_TRANSITION_ENGINE,
486 /* S_HALT ==> */ S_HALT,
487 },
488
489 /* Got an I_JOIN_REQUEST */
490 {
491 /* S_IDLE ==> */ S_INTEGRATION,
492 /* S_ELECTION ==> */ S_ELECTION,
493 /* S_INTEGRATION ==> */ S_INTEGRATION,
494 /* S_FINALIZE_JOIN ==> */ S_INTEGRATION,
495 /* S_NOT_DC ==> */ S_NOT_DC,
496 /* S_POLICY_ENGINE ==> */ S_INTEGRATION,
497 /* S_RECOVERY ==> */ S_RECOVERY,
498 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
499 /* S_STARTING ==> */ S_STARTING,
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_JOIN_RESULT */
508 {
509 /* S_IDLE ==> */ S_INTEGRATION,
510 /* S_ELECTION ==> */ S_ELECTION,
511 /* S_INTEGRATION ==> */ S_INTEGRATION,
512 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
513 /* S_NOT_DC ==> */ S_PENDING,
514 /* S_POLICY_ENGINE ==> */ S_INTEGRATION,
515 /* S_RECOVERY ==> */ S_RECOVERY,
516 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
517 /* S_STARTING ==> */ S_RECOVERY,
518 /* S_PENDING ==> */ S_PENDING,
519 /* S_STOPPING ==> */ S_STOPPING,
520 /* S_TERMINATE ==> */ S_TERMINATE,
521 /* S_TRANSITION_ENGINE ==> */ S_INTEGRATION,
522 /* S_HALT ==> */ S_HALT,
523 },
524
525 /* Got an I_WAIT_FOR_EVENT */
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_DC_HEARTBEAT */
544 {
545 /* S_IDLE ==> */ S_IDLE,
546 /* S_ELECTION ==> */ S_ELECTION,
547 /* S_INTEGRATION ==> */ S_INTEGRATION,
548 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
549 /* S_NOT_DC ==> */ S_NOT_DC,
550 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
551 /* S_RECOVERY ==> */ S_RECOVERY,
552 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
553 /* S_STARTING ==> */ S_STARTING,
554 /* S_PENDING ==> */ S_PENDING,
555 /* S_STOPPING ==> */ S_STOPPING,
556 /* S_TERMINATE ==> */ S_TERMINATE,
557 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
558 /* S_HALT ==> */ S_HALT,
559 },
560
561 /* Got an I_LRM_EVENT */
562 {
563 /* S_IDLE ==> */ S_IDLE,
564 /* S_ELECTION ==> */ S_ELECTION,
565 /* S_INTEGRATION ==> */ S_INTEGRATION,
566 /* S_FINALIZE_JOIN ==> */ S_FINALIZE_JOIN,
567 /* S_NOT_DC ==> */ S_NOT_DC,
568 /* S_POLICY_ENGINE ==> */ S_POLICY_ENGINE,
569 /* S_RECOVERY ==> */ S_RECOVERY,
570 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
571 /* S_STARTING ==> */ S_STARTING,
572 /* S_PENDING ==> */ S_PENDING,
573 /* S_STOPPING ==> */ S_STOPPING,
574 /* S_TERMINATE ==> */ S_TERMINATE,
575 /* S_TRANSITION_ENGINE ==> */ S_TRANSITION_ENGINE,
576 /* S_HALT ==> */ S_HALT,
577 },
578
579 /* Got an I_PENDING */
580 {
581 /* S_IDLE ==> */ S_PENDING,
582 /* S_ELECTION ==> */ S_PENDING,
583 /* S_INTEGRATION ==> */ S_PENDING,
584 /* S_FINALIZE_JOIN ==> */ S_PENDING,
585 /* S_NOT_DC ==> */ S_PENDING,
586 /* S_POLICY_ENGINE ==> */ S_PENDING,
587 /* S_RECOVERY ==> */ S_RECOVERY,
588 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
589 /* S_STARTING ==> */ S_PENDING,
590 /* S_PENDING ==> */ S_PENDING,
591 /* S_STOPPING ==> */ S_STOPPING,
592 /* S_TERMINATE ==> */ S_TERMINATE,
593 /* S_TRANSITION_ENGINE ==> */ S_PENDING,
594 /* S_HALT ==> */ S_HALT,
595 },
596
597 /* Got an I_HALT */
598 {
599 /* S_IDLE ==> */ S_HALT,
600 /* S_ELECTION ==> */ S_HALT,
601 /* S_INTEGRATION ==> */ S_HALT,
602 /* S_FINALIZE_JOIN ==> */ S_HALT,
603 /* S_NOT_DC ==> */ S_HALT,
604 /* S_POLICY_ENGINE ==> */ S_HALT,
605 /* S_RECOVERY ==> */ S_RECOVERY,
606 /* S_RELEASE_DC ==> */ S_RELEASE_DC,
607 /* S_STARTING ==> */ S_STARTING,
608 /* S_PENDING ==> */ S_HALT,
609 /* S_STOPPING ==> */ S_STOPPING,
610 /* S_TERMINATE ==> */ S_TERMINATE,
611 /* S_TRANSITION_ENGINE ==> */ S_HALT,
612 /* S_HALT ==> */ S_HALT,
613 },
614 };
615
616 /*
617 * The action table. Each entry is a set of actions to take or-ed
618 * together. Like the state table, the rows are inputs, and
619 * the columns are states.
620 */
621
622 /* NOTE: In the fsa, the actions are extracted then state is updated. */
623
624 static const uint64_t fsa_actions[MAXINPUT][MAXSTATE] = {
625
626 /* Got an I_NULL */
627 {
628 /* S_IDLE ==> */ A_NOTHING,
629 /* S_ELECTION ==> */ A_NOTHING,
630 /* S_INTEGRATION ==> */ A_NOTHING,
631 /* S_FINALIZE_JOIN ==> */ A_NOTHING,
632 /* S_NOT_DC ==> */ A_NOTHING,
633 /* S_POLICY_ENGINE ==> */ A_NOTHING,
634 /* S_RECOVERY ==> */ A_NOTHING,
635 /* S_RELEASE_DC ==> */ A_NOTHING,
636 /* S_STARTING ==> */ A_NOTHING,
637 /* S_PENDING ==> */ A_NOTHING,
638 /* S_STOPPING ==> */ A_NOTHING,
639 /* S_TERMINATE ==> */ A_NOTHING,
640 /* S_TRANSITION_ENGINE ==> */ A_NOTHING,
641 /* S_HALT ==> */ A_NOTHING,
642 },
643
644 /* Got an I_CIB_OP */
645 {
646 /* S_IDLE ==> */ A_ERROR,
647 /* S_ELECTION ==> */ A_ERROR,
648 /* S_INTEGRATION ==> */ A_ERROR,
649 /* S_FINALIZE_JOIN ==> */ A_ERROR,
650 /* S_NOT_DC ==> */ A_ERROR,
651 /* S_POLICY_ENGINE ==> */ A_ERROR,
652 /* S_RECOVERY ==> */ A_ERROR,
653 /* S_RELEASE_DC ==> */ A_ERROR,
654 /* S_STARTING ==> */ A_ERROR,
655 /* S_PENDING ==> */ A_ERROR,
656 /* S_STOPPING ==> */ A_ERROR,
657 /* S_TERMINATE ==> */ A_ERROR,
658 /* S_TRANSITION_ENGINE ==> */ A_ERROR,
659 /* S_HALT ==> */ A_ERROR,
660 },
661
662 /* Got an I_CIB_UPDATE */
663 {
664 /* S_IDLE ==> */ A_LOG,
665 /* S_ELECTION ==> */ A_LOG,
666 /* S_INTEGRATION ==> */ A_WARN,
667 /* S_FINALIZE_JOIN ==> */ A_WARN,
668 /* S_NOT_DC ==> */ A_WARN,
669 /* S_POLICY_ENGINE ==> */ A_LOG,
670 /* S_RECOVERY ==> */ A_WARN,
671 /* S_RELEASE_DC ==> */ A_WARN,
672 /* S_STARTING ==> */ A_WARN,
673 /* S_PENDING ==> */ A_WARN,
674 /* S_STOPPING ==> */ A_WARN,
675 /* S_TERMINATE ==> */ A_WARN,
676 /* S_TRANSITION_ENGINE ==> */ A_LOG,
677 /* S_HALT ==> */ A_WARN,
678 },
679
680 /* Got an I_DC_TIMEOUT */
681 {
682 /* S_IDLE ==> */ A_WARN,
683 /* S_ELECTION ==> */ A_ELECTION_VOTE,
684 /* S_INTEGRATION ==> */ A_WARN,
685 /* S_FINALIZE_JOIN ==> */ A_WARN,
686 /* S_NOT_DC ==> */ A_ELECTION_VOTE | A_WARN,
687 /* S_POLICY_ENGINE ==> */ A_WARN,
688 /* S_RECOVERY ==> */ A_NOTHING,
689 /* S_RELEASE_DC ==> */ A_WARN,
690 /* S_STARTING ==> */ A_WARN,
691 /* S_PENDING ==> */ A_ELECTION_VOTE | A_WARN,
692 /* S_STOPPING ==> */ A_NOTHING,
693 /* S_TERMINATE ==> */ A_NOTHING,
694 /* S_TRANSITION_ENGINE ==> */ A_TE_CANCEL | A_WARN,
695 /* S_HALT ==> */ A_WARN,
696 },
697
698 /* Got an I_ELECTION */
699 {
700 /* S_IDLE ==> */ A_ELECTION_VOTE,
701 /* S_ELECTION ==> */ A_ELECTION_VOTE,
702 /* S_INTEGRATION ==> */ A_ELECTION_VOTE,
703 /* S_FINALIZE_JOIN ==> */ A_ELECTION_VOTE,
704 /* S_NOT_DC ==> */ A_ELECTION_VOTE,
705 /* S_POLICY_ENGINE ==> */ A_ELECTION_VOTE,
706 /* S_RECOVERY ==> */ A_LOG,
707 /* S_RELEASE_DC ==> */ A_LOG,
708 /* S_STARTING ==> */ A_WARN,
709 /* S_PENDING ==> */ A_ELECTION_VOTE,
710 /* S_STOPPING ==> */ A_LOG,
711 /* S_TERMINATE ==> */ A_LOG,
712 /* S_TRANSITION_ENGINE ==> */ A_ELECTION_VOTE,
713 /* S_HALT ==> */ A_ELECTION_VOTE,
714 },
715
716 /* Got an I_PE_CALC */
717 {
718 /* S_IDLE ==> */ A_PE_INVOKE,
719 /* S_ELECTION ==> */ A_NOTHING,
720 /* S_INTEGRATION ==> */ A_NOTHING,
721 /* S_FINALIZE_JOIN ==> */ A_NOTHING,
722 /* S_NOT_DC ==> */ A_WARN,
723 /* S_POLICY_ENGINE ==> */ A_PE_INVOKE,
724 /* S_RECOVERY ==> */ A_NOTHING,
725 /* S_RELEASE_DC ==> */ A_NOTHING,
726 /* S_STARTING ==> */ A_ERROR,
727 /* S_PENDING ==> */ A_WARN,
728 /* S_STOPPING ==> */ A_WARN,
729 /* S_TERMINATE ==> */ A_ERROR,
730 /* S_TRANSITION_ENGINE ==> */ A_PE_INVOKE,
731 /* S_HALT ==> */ A_ERROR,
732 },
733
734 /* Got an I_RELEASE_DC */
735 {
736 /* S_IDLE ==> */ O_RELEASE,
737 /* S_ELECTION ==> */ O_RELEASE,
738 /* S_INTEGRATION ==> */ O_RELEASE | A_WARN,
739 /* S_FINALIZE_JOIN ==> */ O_RELEASE | A_WARN,
740 /* S_NOT_DC ==> */ A_WARN,
741 /* S_POLICY_ENGINE ==> */ O_RELEASE | A_WARN,
742 /* S_RECOVERY ==> */ O_RELEASE,
743 /* S_RELEASE_DC ==> */ O_RELEASE | A_WARN,
744 /* S_STARTING ==> */ A_ERROR,
745 /* S_PENDING ==> */ A_WARN,
746 /* S_STOPPING ==> */ A_WARN,
747 /* S_TERMINATE ==> */ A_WARN,
748 /* S_TRANSITION_ENGINE ==> */ O_RELEASE | A_WARN,
749 /* S_HALT ==> */ A_WARN,
750 },
751
752 /* Got an I_ELECTION_DC */
753 {
754 /* S_IDLE ==> */ A_WARN | A_ELECTION_VOTE,
755 /* S_ELECTION ==> */
756 A_LOG | A_DC_TAKEOVER | A_PE_START | A_TE_START | A_DC_JOIN_OFFER_ALL | A_DC_TIMER_STOP,
757 /* S_INTEGRATION ==> */ A_WARN | A_ELECTION_VOTE | A_DC_JOIN_OFFER_ALL,
758 /* S_FINALIZE_JOIN ==> */ A_WARN | A_ELECTION_VOTE | A_DC_JOIN_OFFER_ALL,
759 /* S_NOT_DC ==> */ A_LOG | A_ELECTION_VOTE,
760 /* S_POLICY_ENGINE ==> */ A_WARN | A_ELECTION_VOTE,
761 /* S_RECOVERY ==> */ A_WARN,
762 /* S_RELEASE_DC ==> */ A_WARN | A_ELECTION_VOTE,
763 /* S_STARTING ==> */ A_LOG | A_WARN,
764 /* S_PENDING ==> */ A_LOG | A_WARN,
765 /* S_STOPPING ==> */ A_WARN,
766 /* S_TERMINATE ==> */ A_WARN,
767 /* S_TRANSITION_ENGINE ==> */ A_WARN | A_ELECTION_VOTE,
768 /* S_HALT ==> */ A_WARN,
769 },
770
771 /* Got an I_ERROR */
772 {
773 /* S_IDLE ==> */ A_ERROR | A_RECOVER | O_RELEASE | A_ELECTION_START,
774 /* S_ELECTION ==> */ A_ERROR | A_RECOVER | O_RELEASE,
775 /* S_INTEGRATION ==> */ A_ERROR | A_RECOVER | O_RELEASE | A_ELECTION_START,
776 /* S_FINALIZE_JOIN ==> */ A_ERROR | A_RECOVER | O_RELEASE | A_ELECTION_START,
777 /* S_NOT_DC ==> */ A_ERROR | A_RECOVER,
778 /* S_POLICY_ENGINE ==> */ A_ERROR | A_RECOVER | O_RELEASE | A_ELECTION_START,
779 /* S_RECOVERY ==> */ A_ERROR | O_RELEASE,
780 /* S_RELEASE_DC ==> */ A_ERROR | A_RECOVER,
781 /* S_STARTING ==> */ A_ERROR | A_RECOVER,
782 /* S_PENDING ==> */ A_ERROR | A_RECOVER,
783 /* S_STOPPING ==> */ A_ERROR | A_EXIT_1,
784 /* S_TERMINATE ==> */ A_ERROR | A_EXIT_1,
785 /* S_TRANSITION_ENGINE ==> */ A_ERROR | A_RECOVER | O_RELEASE | A_ELECTION_START,
786 /* S_HALT ==> */ A_ERROR | A_RECOVER | O_RELEASE | A_ELECTION_START,
787 },
788
789 /* Got an I_FAIL */
790 {
791 /* S_IDLE ==> */ A_WARN,
792 /* S_ELECTION ==> */ A_WARN,
793 /* S_INTEGRATION ==> */ A_WARN | A_DC_JOIN_OFFER_ALL,
794 /* S_FINALIZE_JOIN ==> */ A_WARN | A_DC_JOIN_OFFER_ALL,
795 /* S_NOT_DC ==> */ A_WARN,
796 /* S_POLICY_ENGINE ==> */ A_WARN | A_DC_JOIN_OFFER_ALL | A_TE_CANCEL,
797 /* S_RECOVERY ==> */ A_WARN | O_RELEASE,
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 | A_EXIT_1,
803 /* S_TRANSITION_ENGINE ==> */ A_WARN | O_LRM_RECONNECT | A_PE_INVOKE | A_TE_CANCEL,
804 /* S_HALT ==> */ A_WARN,
805 },
806
807 /* Got an I_INTEGRATED */
808 {
809 /* S_IDLE ==> */ A_NOTHING,
810 /* S_ELECTION ==> */ A_WARN,
811 /* S_INTEGRATION ==> */ A_DC_JOIN_FINALIZE,
812 /* S_FINALIZE_JOIN ==> */ A_WARN,
813 /* S_NOT_DC ==> */ A_WARN,
814 /* S_POLICY_ENGINE ==> */ A_NOTHING,
815 /* S_RECOVERY ==> */ A_WARN,
816 /* S_RELEASE_DC ==> */ A_WARN,
817 /* S_STARTING ==> */ A_WARN,
818 /* S_PENDING ==> */ A_WARN,
819 /* S_STOPPING ==> */ A_WARN,
820 /* S_TERMINATE ==> */ A_WARN,
821 /* S_TRANSITION_ENGINE ==> */ A_NOTHING,
822 /* S_HALT ==> */ A_WARN,
823 },
824
825 /* Got an I_FINALIZED */
826 {
827 /* S_IDLE ==> */ A_NOTHING,
828 /* S_ELECTION ==> */ A_WARN,
829 /* S_INTEGRATION ==> */ A_WARN,
830 /* S_FINALIZE_JOIN ==> */ A_DC_JOIN_FINAL | A_TE_CANCEL,
831 /* S_NOT_DC ==> */ A_WARN,
832 /* S_POLICY_ENGINE ==> */ A_NOTHING,
833 /* S_RECOVERY ==> */ A_WARN,
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_NOTHING,
840 /* S_HALT ==> */ A_WARN,
841 },
842
843 /* Got an I_NODE_JOIN */
844 {
845 /* S_IDLE ==> */ A_TE_HALT | A_DC_JOIN_OFFER_ONE,
846 /* S_ELECTION ==> */ A_WARN,
847 /* S_INTEGRATION ==> */ A_DC_JOIN_OFFER_ONE,
848 /* S_FINALIZE_JOIN ==> */ A_DC_JOIN_OFFER_ONE,
849 /* S_NOT_DC ==> */ A_WARN,
850 /* S_POLICY_ENGINE ==> */ A_DC_JOIN_OFFER_ONE,
851 /* S_RECOVERY ==> */ A_WARN,
852 /* S_RELEASE_DC ==> */ A_WARN,
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_TE_HALT | A_DC_JOIN_OFFER_ONE,
858 /* S_HALT ==> */ A_WARN,
859 },
860
861 /* Got an I_NOT_DC */
862 {
863 /* S_IDLE ==> */ A_WARN | O_RELEASE,
864 /* S_ELECTION ==> */ A_ERROR | A_ELECTION_START | A_DC_TIMER_STOP,
865 /* S_INTEGRATION ==> */ A_ERROR | O_RELEASE,
866 /* S_FINALIZE_JOIN ==> */ A_ERROR | O_RELEASE,
867 /* S_NOT_DC ==> */ A_LOG,
868 /* S_POLICY_ENGINE ==> */ A_ERROR | O_RELEASE,
869 /* S_RECOVERY ==> */ A_ERROR | O_RELEASE,
870 /* S_RELEASE_DC ==> */ A_ERROR | O_RELEASE,
871 /* S_STARTING ==> */ A_WARN,
872 /* S_PENDING ==> */ A_LOG | A_DC_TIMER_STOP,
873 /* S_STOPPING ==> */ A_WARN,
874 /* S_TERMINATE ==> */ A_WARN,
875 /* S_TRANSITION_ENGINE ==> */ A_ERROR | O_RELEASE,
876 /* S_HALT ==> */ A_WARN,
877 },
878
879 /* Got an I_RECOVERED */
880 {
881 /* S_IDLE ==> */ A_WARN,
882 /* S_ELECTION ==> */ A_ELECTION_VOTE,
883 /* S_INTEGRATION ==> */ A_WARN,
884 /* S_FINALIZE_JOIN ==> */ A_WARN,
885 /* S_NOT_DC ==> */ A_WARN,
886 /* S_POLICY_ENGINE ==> */ A_WARN,
887 /* S_RECOVERY ==> */ A_LOG,
888 /* S_RELEASE_DC ==> */ A_WARN,
889 /* S_STARTING ==> */ A_WARN,
890 /* S_PENDING ==> */ A_WARN,
891 /* S_STOPPING ==> */ A_WARN,
892 /* S_TERMINATE ==> */ A_WARN,
893 /* S_TRANSITION_ENGINE ==> */ A_WARN,
894 /* S_HALT ==> */ A_WARN,
895 },
896
897 /* Got an I_RELEASE_FAIL */
898 {
899 /* S_IDLE ==> */ A_WARN,
900 /* S_ELECTION ==> */ A_WARN,
901 /* S_INTEGRATION ==> */ A_WARN,
902 /* S_FINALIZE_JOIN ==> */ A_WARN,
903 /* S_NOT_DC ==> */ A_WARN,
904 /* S_POLICY_ENGINE ==> */ A_NOTHING,
905 /* S_RECOVERY ==> */ A_WARN | A_SHUTDOWN_REQ,
906 /* S_RELEASE_DC ==> */ A_NOTHING,
907 /* S_STARTING ==> */ A_WARN,
908 /* S_PENDING ==> */ A_WARN,
909 /* S_STOPPING ==> */ A_WARN,
910 /* S_TERMINATE ==> */ A_WARN,
911 /* S_TRANSITION_ENGINE ==> */ A_WARN,
912 /* S_HALT ==> */ A_WARN,
913 },
914
915 /* Got an I_RELEASE_SUCCESS */
916 {
917 /* S_IDLE ==> */ A_WARN,
918 /* S_ELECTION ==> */ A_WARN,
919 /* S_INTEGRATION ==> */ A_WARN,
920 /* S_FINALIZE_JOIN ==> */ A_WARN,
921 /* S_NOT_DC ==> */ A_WARN,
922 /* S_POLICY_ENGINE ==> */ A_WARN,
923 /* S_RECOVERY ==> */ A_WARN,
924 /* S_RELEASE_DC ==> */ A_LOG,
925 /* S_STARTING ==> */ A_WARN,
926 /* S_PENDING ==> */ A_LOG,
927 /* S_STOPPING ==> */ A_WARN,
928 /* S_TERMINATE ==> */ A_WARN,
929 /* S_TRANSITION_ENGINE ==> */ A_WARN,
930 /* S_HALT ==> */ A_WARN,
931 },
932
933 /* Got an I_RESTART */
934 {
935 /* S_IDLE ==> */ A_NOTHING,
936 /* S_ELECTION ==> */ A_LOG | A_ELECTION_VOTE,
937 /* S_INTEGRATION ==> */ A_LOG | A_DC_JOIN_OFFER_ALL,
938 /* S_FINALIZE_JOIN ==> */ A_LOG | A_DC_JOIN_FINALIZE,
939 /* S_NOT_DC ==> */ A_LOG | A_NOTHING,
940 /* S_POLICY_ENGINE ==> */ A_LOG | A_PE_INVOKE,
941 /* S_RECOVERY ==> */ A_LOG | A_RECOVER | O_RELEASE,
942 /* S_RELEASE_DC ==> */ A_LOG | O_RELEASE,
943 /* S_STARTING ==> */ A_LOG,
944 /* S_PENDING ==> */ A_LOG,
945 /* S_STOPPING ==> */ A_LOG,
946 /* S_TERMINATE ==> */ A_LOG,
947 /* S_TRANSITION_ENGINE ==> */ A_LOG | A_TE_INVOKE,
948 /* S_HALT ==> */ A_WARN,
949 },
950
951 /* Got an I_TE_SUCCESS */
952 {
953 /* S_IDLE ==> */ A_LOG,
954 /* S_ELECTION ==> */ A_WARN,
955 /* S_INTEGRATION ==> */ A_WARN,
956 /* S_FINALIZE_JOIN ==> */ A_WARN,
957 /* S_NOT_DC ==> */ A_ERROR,
958 /* S_POLICY_ENGINE ==> */ A_WARN,
959 /* S_RECOVERY ==> */ A_RECOVER | A_WARN,
960 /* S_RELEASE_DC ==> */ A_WARN,
961 /* S_STARTING ==> */ A_ERROR,
962 /* S_PENDING ==> */ A_ERROR,
963 /* S_STOPPING ==> */ A_WARN,
964 /* S_TERMINATE ==> */ A_WARN,
965 /* S_TRANSITION_ENGINE ==> */ A_LOG,
966 /* S_HALT ==> */ A_WARN,
967 },
968
969 /* Got an I_ROUTER */
970 {
971 /* S_IDLE ==> */ A_MSG_ROUTE,
972 /* S_ELECTION ==> */ A_MSG_ROUTE,
973 /* S_INTEGRATION ==> */ A_MSG_ROUTE,
974 /* S_FINALIZE_JOIN ==> */ A_MSG_ROUTE,
975 /* S_NOT_DC ==> */ A_MSG_ROUTE,
976 /* S_POLICY_ENGINE ==> */ A_MSG_ROUTE,
977 /* S_RECOVERY ==> */ A_MSG_ROUTE,
978 /* S_RELEASE_DC ==> */ A_MSG_ROUTE,
979 /* S_STARTING ==> */ A_MSG_ROUTE,
980 /* S_PENDING ==> */ A_MSG_ROUTE,
981 /* S_STOPPING ==> */ A_MSG_ROUTE,
982 /* S_TERMINATE ==> */ A_MSG_ROUTE,
983 /* S_TRANSITION_ENGINE ==> */ A_MSG_ROUTE,
984 /* S_HALT ==> */ A_WARN | A_MSG_ROUTE,
985 },
986
987 /* Got an I_SHUTDOWN */
988 {
989 /* S_IDLE ==> */ A_LOG | A_SHUTDOWN_REQ,
990 /* S_ELECTION ==> */ A_LOG | A_SHUTDOWN_REQ | A_ELECTION_VOTE,
991 /* S_INTEGRATION ==> */ A_LOG | A_SHUTDOWN_REQ,
992 /* S_FINALIZE_JOIN ==> */ A_LOG | A_SHUTDOWN_REQ,
993 /* S_NOT_DC ==> */ A_SHUTDOWN_REQ,
994 /* S_POLICY_ENGINE ==> */ A_LOG | A_SHUTDOWN_REQ,
995 /* S_RECOVERY ==> */ A_WARN | O_EXIT | O_RELEASE,
996 /* S_RELEASE_DC ==> */ A_WARN | A_SHUTDOWN_REQ,
997 /* S_STARTING ==> */ A_WARN | O_EXIT,
998 /* S_PENDING ==> */ A_SHUTDOWN_REQ,
999 /* S_STOPPING ==> */ A_LOG,
1000 /* S_TERMINATE ==> */ A_LOG,
1001 /* S_TRANSITION_ENGINE ==> */ A_WARN | A_SHUTDOWN_REQ,
1002 /* S_HALT ==> */ A_WARN | A_ELECTION_START | A_SHUTDOWN_REQ,
1003 },
1004
1005 /* Got an I_STOP */
1006 {
1007 /* S_IDLE ==> */ A_ERROR | O_RELEASE | O_EXIT,
1008 /* S_ELECTION ==> */ O_RELEASE | O_EXIT,
1009 /* S_INTEGRATION ==> */ A_WARN | O_RELEASE | O_EXIT,
1010 /* S_FINALIZE_JOIN ==> */ A_ERROR | O_RELEASE | O_EXIT,
1011 /* S_NOT_DC ==> */ O_EXIT,
1012 /* S_POLICY_ENGINE ==> */ A_WARN | O_RELEASE | O_EXIT,
1013 /* S_RECOVERY ==> */ A_ERROR | O_RELEASE | O_EXIT,
1014 /* S_RELEASE_DC ==> */ A_ERROR | O_RELEASE | O_EXIT,
1015 /* S_STARTING ==> */ O_EXIT,
1016 /* S_PENDING ==> */ O_EXIT,
1017 /* S_STOPPING ==> */ O_EXIT,
1018 /* S_TERMINATE ==> */ A_ERROR | A_EXIT_1,
1019 /* S_TRANSITION_ENGINE ==> */ A_LOG | O_RELEASE | O_EXIT,
1020 /* S_HALT ==> */ O_RELEASE | O_EXIT | A_WARN,
1021 },
1022
1023 /* Got an I_TERMINATE */
1024 {
1025 /* S_IDLE ==> */ A_ERROR | O_EXIT,
1026 /* S_ELECTION ==> */ A_ERROR | O_EXIT,
1027 /* S_INTEGRATION ==> */ A_ERROR | O_EXIT,
1028 /* S_FINALIZE_JOIN ==> */ A_ERROR | O_EXIT,
1029 /* S_NOT_DC ==> */ A_ERROR | O_EXIT,
1030 /* S_POLICY_ENGINE ==> */ A_ERROR | O_EXIT,
1031 /* S_RECOVERY ==> */ A_ERROR | O_EXIT,
1032 /* S_RELEASE_DC ==> */ A_ERROR | O_EXIT,
1033 /* S_STARTING ==> */ O_EXIT,
1034 /* S_PENDING ==> */ A_ERROR | O_EXIT,
1035 /* S_STOPPING ==> */ O_EXIT,
1036 /* S_TERMINATE ==> */ O_EXIT,
1037 /* S_TRANSITION_ENGINE ==> */ A_ERROR | O_EXIT,
1038 /* S_HALT ==> */ A_ERROR | O_EXIT,
1039 },
1040
1041 /* Got an I_STARTUP */
1042 {
1043 /* S_IDLE ==> */ A_WARN,
1044 /* S_ELECTION ==> */ A_WARN,
1045 /* S_INTEGRATION ==> */ A_WARN,
1046 /* S_FINALIZE_JOIN ==> */ A_WARN,
1047 /* S_NOT_DC ==> */ A_WARN,
1048 /* S_POLICY_ENGINE ==> */ A_WARN,
1049 /* S_RECOVERY ==> */ A_WARN,
1050 /* S_RELEASE_DC ==> */ A_WARN,
1051 /* S_STARTING ==> */
1052 A_LOG | A_STARTUP | A_CIB_START | A_LRM_CONNECT | A_HA_CONNECT | A_READCONFIG | A_STARTED,
1053 /* S_PENDING ==> */ A_LOG,
1054 /* S_STOPPING ==> */ A_WARN,
1055 /* S_TERMINATE ==> */ A_WARN,
1056 /* S_TRANSITION_ENGINE ==> */ A_WARN,
1057 /* S_HALT ==> */ A_WARN,
1058 },
1059
1060 /* Got an I_PE_SUCCESS */
1061 {
1062 /* S_IDLE ==> */ A_LOG,
1063 /* S_ELECTION ==> */ A_WARN,
1064 /* S_INTEGRATION ==> */ A_WARN,
1065 /* S_FINALIZE_JOIN ==> */ A_WARN,
1066 /* S_NOT_DC ==> */ A_NOTHING,
1067 /* S_POLICY_ENGINE ==> */ A_TE_INVOKE,
1068 /* S_RECOVERY ==> */ A_RECOVER | A_LOG,
1069 /* S_RELEASE_DC ==> */ A_LOG,
1070 /* S_STARTING ==> */ A_ERROR,
1071 /* S_PENDING ==> */ A_LOG,
1072 /* S_STOPPING ==> */ A_ERROR,
1073 /* S_TERMINATE ==> */ A_ERROR,
1074 /* S_TRANSITION_ENGINE ==> */ A_LOG,
1075 /* S_HALT ==> */ A_WARN,
1076 },
1077
1078 /* Got an I_JOIN_OFFER */
1079 {
1080 /* S_IDLE ==> */ A_WARN | A_CL_JOIN_REQUEST,
1081 /* S_ELECTION ==> */ A_WARN | A_ELECTION_VOTE,
1082 /* S_INTEGRATION ==> */ A_CL_JOIN_REQUEST,
1083 /* S_FINALIZE_JOIN ==> */ A_CL_JOIN_REQUEST,
1084 /* S_NOT_DC ==> */ A_CL_JOIN_REQUEST | A_DC_TIMER_STOP,
1085 /* S_POLICY_ENGINE ==> */ A_WARN | A_CL_JOIN_REQUEST,
1086 /* S_RECOVERY ==> */ A_WARN | A_CL_JOIN_REQUEST | A_DC_TIMER_STOP,
1087 /* S_RELEASE_DC ==> */ A_WARN | A_CL_JOIN_REQUEST | A_DC_TIMER_STOP,
1088 /* S_STARTING ==> */ A_LOG,
1089 /* S_PENDING ==> */ A_CL_JOIN_REQUEST | A_DC_TIMER_STOP,
1090 /* S_STOPPING ==> */ A_LOG,
1091 /* S_TERMINATE ==> */ A_LOG,
1092 /* S_TRANSITION_ENGINE ==> */ A_WARN | A_CL_JOIN_REQUEST,
1093 /* S_HALT ==> */ A_WARN,
1094 },
1095
1096 /* Got an I_JOIN_REQUEST */
1097 {
1098 /* S_IDLE ==> */ A_DC_JOIN_OFFER_ONE,
1099 /* S_ELECTION ==> */ A_WARN,
1100 /* S_INTEGRATION ==> */ A_DC_JOIN_PROCESS_REQ,
1101 /* S_FINALIZE_JOIN ==> */ A_DC_JOIN_OFFER_ONE,
1102 /* S_NOT_DC ==> */ A_WARN,
1103 /* S_POLICY_ENGINE ==> */ A_DC_JOIN_OFFER_ONE,
1104 /* S_RECOVERY ==> */ A_WARN,
1105 /* S_RELEASE_DC ==> */ A_WARN,
1106 /* S_STARTING ==> */ A_WARN,
1107 /* S_PENDING ==> */ A_WARN,
1108 /* S_STOPPING ==> */ A_WARN,
1109 /* S_TERMINATE ==> */ A_WARN,
1110 /* S_TRANSITION_ENGINE ==> */ A_DC_JOIN_OFFER_ONE,
1111 /* S_HALT ==> */ A_WARN,
1112 },
1113
1114 /* Got an I_JOIN_RESULT */
1115 {
1116 /* S_IDLE ==> */ A_ERROR | A_TE_HALT | A_DC_JOIN_OFFER_ALL,
1117 /* S_ELECTION ==> */ A_LOG,
1118 /* S_INTEGRATION ==> */ A_LOG | A_CL_JOIN_RESULT | A_DC_JOIN_PROCESS_ACK,
1119 /* S_FINALIZE_JOIN ==> */ A_CL_JOIN_RESULT | A_DC_JOIN_PROCESS_ACK,
1120 /* S_NOT_DC ==> */ A_ERROR | A_CL_JOIN_ANNOUNCE,
1121 /* S_POLICY_ENGINE ==> */ A_ERROR | A_TE_HALT | A_DC_JOIN_OFFER_ALL,
1122 /* S_RECOVERY ==> */ A_LOG,
1123 /* S_RELEASE_DC ==> */ A_LOG,
1124 /* S_STARTING ==> */ A_ERROR,
1125 /* S_PENDING ==> */ A_CL_JOIN_RESULT,
1126 /* S_STOPPING ==> */ A_ERROR,
1127 /* S_TERMINATE ==> */ A_ERROR,
1128 /* S_TRANSITION_ENGINE ==> */ A_ERROR | A_TE_HALT | A_DC_JOIN_OFFER_ALL,
1129 /* S_HALT ==> */ A_WARN,
1130 },
1131
1132 /* Got an I_WAIT_FOR_EVENT */
1133 {
1134 /* S_IDLE ==> */ A_LOG,
1135 /* S_ELECTION ==> */ A_LOG,
1136 /* S_INTEGRATION ==> */ A_LOG,
1137 /* S_FINALIZE_JOIN ==> */ A_LOG,
1138 /* S_NOT_DC ==> */ A_LOG,
1139 /* S_POLICY_ENGINE ==> */ A_LOG,
1140 /* S_RECOVERY ==> */ A_LOG,
1141 /* S_RELEASE_DC ==> */ A_LOG,
1142 /* S_STARTING ==> */ A_LOG,
1143 /* S_PENDING ==> */ A_LOG,
1144 /* S_STOPPING ==> */ A_LOG,
1145 /* S_TERMINATE ==> */ A_LOG,
1146 /* S_TRANSITION_ENGINE ==> */ A_LOG,
1147 /* S_HALT ==> */ A_WARN,
1148 },
1149
1150 /* Got an I_DC_HEARTBEAT */
1151 {
1152 /* S_IDLE ==> */ A_ERROR,
1153 /* S_ELECTION ==> */ A_WARN | A_ELECTION_VOTE,
1154 /* S_INTEGRATION ==> */ A_ERROR,
1155 /* S_FINALIZE_JOIN ==> */ A_ERROR,
1156 /* S_NOT_DC ==> */ A_NOTHING,
1157 /* S_POLICY_ENGINE ==> */ A_ERROR,
1158 /* S_RECOVERY ==> */ A_NOTHING,
1159 /* S_RELEASE_DC ==> */ A_LOG,
1160 /* S_STARTING ==> */ A_LOG,
1161 /* S_PENDING ==> */ A_LOG | A_CL_JOIN_ANNOUNCE,
1162 /* S_STOPPING ==> */ A_NOTHING,
1163 /* S_TERMINATE ==> */ A_NOTHING,
1164 /* S_TRANSITION_ENGINE ==> */ A_ERROR,
1165 /* S_HALT ==> */ A_WARN,
1166 },
1167
1168 /* Got an I_LRM_EVENT */
1169 {
1170 /* S_IDLE ==> */ A_LRM_EVENT,
1171 /* S_ELECTION ==> */ A_LRM_EVENT,
1172 /* S_INTEGRATION ==> */ A_LRM_EVENT,
1173 /* S_FINALIZE_JOIN ==> */ A_LRM_EVENT,
1174 /* S_NOT_DC ==> */ A_LRM_EVENT,
1175 /* S_POLICY_ENGINE ==> */ A_LRM_EVENT,
1176 /* S_RECOVERY ==> */ A_LRM_EVENT,
1177 /* S_RELEASE_DC ==> */ A_LRM_EVENT,
1178 /* S_STARTING ==> */ A_LRM_EVENT,
1179 /* S_PENDING ==> */ A_LRM_EVENT,
1180 /* S_STOPPING ==> */ A_LRM_EVENT,
1181 /* S_TERMINATE ==> */ A_LRM_EVENT,
1182 /* S_TRANSITION_ENGINE ==> */ A_LRM_EVENT,
1183 /* S_HALT ==> */ A_WARN,
1184 },
1185
1186 /* For everyone ending up in S_PENDING, (re)start the DC timer and wait for I_JOIN_OFFER or I_NOT_DC */
1187 /* Got an I_PENDING */
1188 {
1189 /* S_IDLE ==> */ O_RELEASE | O_DC_TIMER_RESTART,
1190 /* S_ELECTION ==> */ O_RELEASE | O_DC_TIMER_RESTART,
1191 /* S_INTEGRATION ==> */ O_RELEASE | O_DC_TIMER_RESTART,
1192 /* S_FINALIZE_JOIN ==> */ O_RELEASE | O_DC_TIMER_RESTART,
1193 /* S_NOT_DC ==> */ A_LOG | O_DC_TIMER_RESTART,
1194 /* S_POLICY_ENGINE ==> */ O_RELEASE | O_DC_TIMER_RESTART,
1195 /* S_RECOVERY ==> */ A_WARN,
1196 /* S_RELEASE_DC ==> */ A_WARN | O_DC_TIMER_RESTART,
1197 /* S_STARTING ==> */ A_LOG | A_DC_TIMER_START | A_CL_JOIN_QUERY,
1198 /* S_PENDING ==> */ A_LOG | O_DC_TIMER_RESTART,
1199 /* S_STOPPING ==> */ A_WARN,
1200 /* S_TERMINATE ==> */ A_WARN,
1201 /* S_TRANSITION_ENGINE ==> */ O_RELEASE | O_DC_TIMER_RESTART,
1202 /* S_HALT ==> */ A_WARN,
1203 },
1204
1205 /* Got an I_HALT */
1206 {
1207 /* S_IDLE ==> */ A_WARN,
1208 /* S_ELECTION ==> */ A_WARN,
1209 /* S_INTEGRATION ==> */ A_WARN,
1210 /* S_FINALIZE_JOIN ==> */ A_WARN,
1211 /* S_NOT_DC ==> */ A_WARN,
1212 /* S_POLICY_ENGINE ==> */ A_WARN,
1213 /* S_RECOVERY ==> */ A_WARN,
1214 /* S_RELEASE_DC ==> */ A_WARN,
1215 /* S_STARTING ==> */ A_WARN,
1216 /* S_PENDING ==> */ A_WARN,
1217 /* S_STOPPING ==> */ A_WARN,
1218 /* S_TERMINATE ==> */ A_WARN,
1219 /* S_TRANSITION_ENGINE ==> */ A_WARN,
1220 /* S_HALT ==> */ A_WARN,
1221 },
1222 };
1223
1224 /*!
1225 * \internal
1226 * \brief Get the next FSA state given an input and the current state
1227 *
1228 * \param[in] input FSA input
1229 *
1230 * \return The next FSA state
1231 */
1232 enum crmd_fsa_state
1233 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)
*/
1234 {
1235 return fsa_next_states[input][controld_globals.fsa_state];
1236 }
1237
1238 /*!
1239 * \internal
1240 * \brief Get the appropriate FSA action given an input and the current state
1241 *
1242 * \param[in] input FSA input
1243 *
1244 * \return The appropriate FSA action
1245 */
1246 uint64_t
1247 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)
*/
1248 {
1249 return fsa_actions[input][controld_globals.fsa_state];
1250 }