1
2
3
4
5
6
7
8
9
10 #ifndef CRMD_FSA__H
11 # define CRMD_FSA__H
12
13 # include <crm/crm.h>
14 # include <crm/cib.h>
15 # include <crm/common/xml.h>
16 # include <crm/common/mainloop.h>
17 # include <crm/cluster.h>
18 # include <crm/cluster/election_internal.h>
19 # include <crm/common/ipc_internal.h>
20
21
22 enum crmd_fsa_state {
23 S_IDLE = 0,
24
25 S_ELECTION,
26
27
28 S_INTEGRATION,
29
30
31
32
33 S_FINALIZE_JOIN,
34
35
36
37
38 S_NOT_DC,
39 S_POLICY_ENGINE,
40 S_RECOVERY,
41
42
43
44 S_RELEASE_DC,
45
46
47
48
49
50
51 S_STARTING,
52 S_PENDING,
53 S_STOPPING,
54 S_TERMINATE,
55
56
57
58
59 S_TRANSITION_ENGINE,
60
61
62
63 S_HALT,
64
65
66
67
68
69 S_ILLEGAL
70
71 };
72
73 # define MAXSTATE S_ILLEGAL
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 enum crmd_fsa_input {
136 I_NULL,
137 I_CIB_UPDATE,
138 I_DC_TIMEOUT,
139 I_ELECTION,
140 I_PE_CALC,
141 I_RELEASE_DC,
142
143
144 I_ELECTION_DC,
145
146
147 I_ERROR,
148
149
150
151
152 I_FAIL,
153 I_INTEGRATED,
154 I_FINALIZED,
155 I_NODE_JOIN,
156 I_NOT_DC,
157
158
159 I_RECOVERED,
160 I_RELEASE_FAIL,
161
162 I_RELEASE_SUCCESS,
163 I_RESTART,
164
165
166 I_TE_SUCCESS,
167
168
169 I_ROUTER,
170
171
172 I_SHUTDOWN,
173 I_STOP,
174 I_TERMINATE,
175 I_STARTUP,
176 I_PE_SUCCESS,
177 I_JOIN_OFFER,
178 I_JOIN_REQUEST,
179 I_JOIN_RESULT,
180
181
182 I_WAIT_FOR_EVENT,
183
184
185 I_DC_HEARTBEAT,
186
187 I_PENDING,
188 I_HALT,
189
190
191 I_ILLEGAL
192
193 };
194
195 # define MAXINPUT I_ILLEGAL
196
197 # define I_MESSAGE I_ROUTER
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213 # define A_NOTHING 0x0000000000000000ULL
214
215
216
217
218
219 # define A_STARTUP 0x0000000000000001ULL
220
221
222
223 # define A_STARTED 0x0000000000000002ULL
224
225 # define A_HA_CONNECT 0x0000000000000004ULL
226 # define A_HA_DISCONNECT 0x0000000000000008ULL
227
228 # define A_INTEGRATE_TIMER_START 0x0000000000000010ULL
229 # define A_INTEGRATE_TIMER_STOP 0x0000000000000020ULL
230 # define A_FINALIZE_TIMER_START 0x0000000000000040ULL
231 # define A_FINALIZE_TIMER_STOP 0x0000000000000080ULL
232
233
234 # define A_DC_TIMER_START 0x0000000000000100ULL
235 # define A_DC_TIMER_STOP 0x0000000000000200ULL
236 # define A_ELECTION_COUNT 0x0000000000000400ULL
237 # define A_ELECTION_VOTE 0x0000000000000800ULL
238
239 # define A_ELECTION_START 0x0000000000001000ULL
240
241
242
243 # define A_MSG_PROCESS 0x0000000000002000ULL
244
245 # define A_MSG_ROUTE 0x0000000000004000ULL
246
247
248 # define A_DC_JOIN_OFFER_ONE 0x0000000000008000ULL
249
250
251
252 # define A_DC_JOIN_OFFER_ALL 0x0000000000010000ULL
253
254 # define A_DC_JOIN_PROCESS_REQ 0x0000000000020000ULL
255
256 # define A_DC_JOIN_FINALIZE 0x0000000000040000ULL
257
258 # define A_DC_JOIN_PROCESS_ACK 0x0000000000080000ULL
259
260
261 # define A_CL_JOIN_QUERY 0x0000000000100000ULL
262 # define A_CL_JOIN_ANNOUNCE 0x0000000000200000ULL
263
264 # define A_CL_JOIN_REQUEST 0x0000000000400000ULL
265
266 # define A_CL_JOIN_RESULT 0x0000000000800000ULL
267
268
269
270 # define A_RECOVER 0x0000000001000000ULL
271
272
273
274
275 # define A_DC_RELEASE 0x0000000002000000ULL
276
277 # define A_DC_RELEASED 0x0000000004000000ULL
278
279
280
281
282 # define A_DC_TAKEOVER 0x0000000008000000ULL
283
284
285 # define A_SHUTDOWN 0x0000000010000000ULL
286 # define A_STOP 0x0000000020000000ULL
287 # define A_EXIT_0 0x0000000040000000ULL
288 # define A_EXIT_1 0x0000000080000000ULL
289
290 # define A_SHUTDOWN_REQ 0x0000000100000000ULL
291 # define A_ELECTION_CHECK 0x0000000200000000ULL
292 # define A_DC_JOIN_FINAL 0x0000000400000000ULL
293
294
295 # define A_CIB_START 0x0000020000000000ULL
296 # define A_CIB_STOP 0x0000040000000000ULL
297
298
299
300
301
302
303
304
305
306
307 # define A_TE_INVOKE 0x0000100000000000ULL
308 # define A_TE_START 0x0000200000000000ULL
309 # define A_TE_STOP 0x0000400000000000ULL
310 # define A_TE_CANCEL 0x0000800000000000ULL
311 # define A_TE_HALT 0x0001000000000000ULL
312
313
314
315
316
317 # define A_PE_INVOKE 0x0002000000000000ULL
318 # define A_PE_START 0x0004000000000000ULL
319 # define A_PE_STOP 0x0008000000000000ULL
320
321
322
323
324
325 # define A_NODE_BLOCK 0x0010000000000000ULL
326
327 # define A_UPDATE_NODESTATUS 0x0020000000000000ULL
328 # define A_READCONFIG 0x0080000000000000ULL
329
330
331
332 # define A_LRM_CONNECT 0x0100000000000000ULL
333
334 # define A_LRM_DISCONNECT 0x0200000000000000ULL
335 # define A_LRM_INVOKE 0x0400000000000000ULL
336
337
338 # define A_LOG 0x1000000000000000ULL
339 # define A_ERROR 0x2000000000000000ULL
340 # define A_WARN 0x4000000000000000ULL
341
342 # define O_EXIT (A_SHUTDOWN|A_STOP|A_LRM_DISCONNECT|A_HA_DISCONNECT|A_EXIT_0|A_CIB_STOP)
343 # define O_RELEASE (A_DC_TIMER_STOP|A_DC_RELEASE|A_PE_STOP|A_TE_STOP|A_DC_RELEASED)
344 # define O_PE_RESTART (A_PE_START|A_PE_STOP)
345 # define O_TE_RESTART (A_TE_START|A_TE_STOP)
346 # define O_CIB_RESTART (A_CIB_START|A_CIB_STOP)
347 # define O_LRM_RECONNECT (A_LRM_CONNECT|A_LRM_DISCONNECT)
348 # define O_DC_TIMER_RESTART (A_DC_TIMER_STOP|A_DC_TIMER_START)
349
350
351
352
353
354
355
356
357
358 # define R_THE_DC 0x00000001ULL
359
360 # define R_STARTING 0x00000002ULL
361
362 # define R_SHUTDOWN 0x00000004ULL
363
364 # define R_STAYDOWN 0x00000008ULL
365
366
367 # define R_JOIN_OK 0x00000010ULL
368 # define R_READ_CONFIG 0x00000040ULL
369 # define R_INVOKE_PE 0x00000080ULL
370
371 # define R_CIB_CONNECTED 0x00000100ULL
372
373 # define R_PE_CONNECTED 0x00000200ULL
374 # define R_TE_CONNECTED 0x00000400ULL
375
376 # define R_LRM_CONNECTED 0x00000800ULL
377
378 # define R_CIB_REQUIRED 0x00001000ULL
379
380 # define R_PE_REQUIRED 0x00002000ULL
381 # define R_TE_REQUIRED 0x00004000ULL
382
383 # define R_ST_REQUIRED 0x00008000ULL
384
385
386 # define R_CIB_DONE 0x00010000ULL
387
388 # define R_HAVE_CIB 0x00020000ULL
389
390 # define R_MEMBERSHIP 0x00100000ULL
391
392
393 # define R_PEER_DATA 0x00200000ULL
394
395 # define R_HA_DISCONNECTED 0x00400000ULL
396
397 # define R_REQ_PEND 0x01000000ULL
398
399
400 # define R_PE_PEND 0x02000000ULL
401 # define R_TE_PEND 0x04000000ULL
402
403
404 # define R_RESP_PEND 0x08000000ULL
405
406
407
408
409 # define R_SENT_RSC_STOP 0x20000000ULL
410
411
412
413 # define R_IN_RECOVERY 0x80000000ULL
414
415 #define CRM_DIRECT_NACK_RC (99)
416
417 enum crmd_fsa_cause {
418 C_UNKNOWN = 0,
419 C_STARTUP,
420 C_IPC_MESSAGE,
421 C_HA_MESSAGE,
422 C_CRMD_STATUS_CALLBACK,
423 C_LRM_OP_CALLBACK,
424 C_TIMER_POPPED,
425 C_SHUTDOWN,
426 C_FSA_INTERNAL,
427 };
428
429 enum fsa_data_type {
430 fsa_dt_none,
431 fsa_dt_ha_msg,
432 fsa_dt_xml,
433 fsa_dt_lrm,
434 };
435
436 typedef struct fsa_data_s fsa_data_t;
437 struct fsa_data_s {
438 int id;
439 enum crmd_fsa_input fsa_input;
440 enum crmd_fsa_cause fsa_cause;
441 uint64_t actions;
442 const char *origin;
443 void *data;
444 enum fsa_data_type data_type;
445 };
446
447 #define controld_set_fsa_input_flags(flags_to_set) do { \
448 controld_globals.fsa_input_register \
449 = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \
450 "FSA input", "controller", \
451 controld_globals.fsa_input_register, \
452 (flags_to_set), #flags_to_set); \
453 } while (0)
454
455 #define controld_clear_fsa_input_flags(flags_to_clear) do { \
456 controld_globals.fsa_input_register \
457 = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \
458 "FSA input", "controller", \
459 controld_globals.fsa_input_register, \
460 (flags_to_clear), \
461 #flags_to_clear); \
462 } while (0)
463
464 #define controld_set_fsa_action_flags(flags_to_set) do { \
465 controld_globals.fsa_actions \
466 = pcmk__set_flags_as(__func__, __LINE__, LOG_DEBUG, \
467 "FSA action", "controller", \
468 controld_globals.fsa_actions, \
469 (flags_to_set), #flags_to_set); \
470 } while (0)
471
472 #define controld_clear_fsa_action_flags(flags_to_clear) do { \
473 controld_globals.fsa_actions \
474 = pcmk__clear_flags_as(__func__, __LINE__, LOG_DEBUG, \
475 "FSA action", "controller", \
476 controld_globals.fsa_actions, \
477 (flags_to_clear), #flags_to_clear); \
478 } while (0)
479
480
481 xmlNode *controld_query_executor_state(void);
482
483 const char *fsa_input2string(enum crmd_fsa_input input);
484 const char *fsa_state2string(enum crmd_fsa_state state);
485 const char *fsa_cause2string(enum crmd_fsa_cause cause);
486 const char *fsa_action2string(long long action);
487
488 enum crmd_fsa_state s_crmd_fsa(enum crmd_fsa_cause cause);
489
490 enum crmd_fsa_state controld_fsa_get_next_state(enum crmd_fsa_input input);
491
492 uint64_t controld_fsa_get_action(enum crmd_fsa_input input);
493
494 void controld_init_fsa_trigger(void);
495 void controld_destroy_fsa_trigger(void);
496
497 void free_max_generation(void);
498
499 # define AM_I_DC pcmk_is_set(controld_globals.fsa_input_register, R_THE_DC)
500 # define controld_trigger_fsa() controld_trigger_fsa_as(__func__, __LINE__)
501
502 void controld_trigger_fsa_as(const char *fn, int line);
503
504
505 void do_read_config(long long action, enum crmd_fsa_cause cause,
506 enum crmd_fsa_state cur_state,
507 enum crmd_fsa_input current_input, fsa_data_t *msg_data);
508
509
510 void do_pe_invoke(long long action, enum crmd_fsa_cause cause,
511 enum crmd_fsa_state cur_state,
512 enum crmd_fsa_input current_input, fsa_data_t *msg_data);
513
514
515 void do_log(long long action, enum crmd_fsa_cause cause,
516 enum crmd_fsa_state cur_state,
517 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
518
519
520 void do_startup(long long action, enum crmd_fsa_cause cause,
521 enum crmd_fsa_state cur_state,
522 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
523
524
525 void do_cib_control(long long action, enum crmd_fsa_cause cause,
526 enum crmd_fsa_state cur_state,
527 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
528
529
530 void do_ha_control(long long action, enum crmd_fsa_cause cause,
531 enum crmd_fsa_state cur_state,
532 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
533
534
535 void do_lrm_control(long long action, enum crmd_fsa_cause cause,
536 enum crmd_fsa_state cur_state,
537 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
538
539
540 void do_pe_control(long long action, enum crmd_fsa_cause cause,
541 enum crmd_fsa_state cur_state,
542 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
543
544
545 void do_te_control(long long action, enum crmd_fsa_cause cause,
546 enum crmd_fsa_state cur_state,
547 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
548
549
550 void do_started(long long action, enum crmd_fsa_cause cause,
551 enum crmd_fsa_state cur_state,
552 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
553
554
555 void do_msg_route(long long action, enum crmd_fsa_cause cause,
556 enum crmd_fsa_state cur_state,
557 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
558
559
560 void do_recover(long long action, enum crmd_fsa_cause cause,
561 enum crmd_fsa_state cur_state,
562 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
563
564
565 void do_election_vote(long long action, enum crmd_fsa_cause cause,
566 enum crmd_fsa_state cur_state,
567 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
568
569
570 void do_election_count_vote(long long action, enum crmd_fsa_cause cause,
571 enum crmd_fsa_state cur_state,
572 enum crmd_fsa_input cur_input,
573 fsa_data_t *msg_data);
574
575
576 void do_election_check(long long action, enum crmd_fsa_cause cause,
577 enum crmd_fsa_state cur_state,
578 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
579
580
581 void do_timer_control(long long action, enum crmd_fsa_cause cause,
582 enum crmd_fsa_state cur_state,
583 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
584
585
586 void do_dc_takeover(long long action, enum crmd_fsa_cause cause,
587 enum crmd_fsa_state cur_state,
588 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
589
590
591 void do_dc_release(long long action, enum crmd_fsa_cause cause,
592 enum crmd_fsa_state cur_state,
593 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
594
595
596 void do_dc_join_offer_all(long long action, enum crmd_fsa_cause cause,
597 enum crmd_fsa_state cur_state,
598 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
599
600
601 void do_dc_join_offer_one(long long action, enum crmd_fsa_cause cause,
602 enum crmd_fsa_state cur_state,
603 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
604
605
606 void do_dc_join_ack(long long action, enum crmd_fsa_cause cause,
607 enum crmd_fsa_state cur_state,
608 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
609
610
611 void do_dc_join_filter_offer(long long action, enum crmd_fsa_cause cause,
612 enum crmd_fsa_state cur_state,
613 enum crmd_fsa_input cur_input,
614 fsa_data_t *msg_data);
615
616
617 void do_dc_join_finalize(long long action, enum crmd_fsa_cause cause,
618 enum crmd_fsa_state cur_state,
619 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
620
621
622
623 void do_cl_join_query(long long action, enum crmd_fsa_cause cause,
624 enum crmd_fsa_state cur_state,
625 enum crmd_fsa_input current_input, fsa_data_t *msg_data);
626
627
628 void do_cl_join_announce(long long action, enum crmd_fsa_cause cause,
629 enum crmd_fsa_state cur_state,
630 enum crmd_fsa_input current_input, fsa_data_t *msg_data);
631
632
633 void do_cl_join_offer_respond(long long action, enum crmd_fsa_cause cause,
634 enum crmd_fsa_state cur_state,
635 enum crmd_fsa_input current_input,
636 fsa_data_t *msg_data);
637
638
639 void do_cl_join_finalize_respond(long long action, enum crmd_fsa_cause cause,
640 enum crmd_fsa_state cur_state,
641 enum crmd_fsa_input current_input,
642 fsa_data_t *msg_data);
643
644
645 void do_lrm_invoke(long long action, enum crmd_fsa_cause cause,
646 enum crmd_fsa_state cur_state,
647 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
648
649
650 void do_te_invoke(long long action, enum crmd_fsa_cause cause,
651 enum crmd_fsa_state cur_state,
652 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
653
654
655 void do_shutdown_req(long long action, enum crmd_fsa_cause cause,
656 enum crmd_fsa_state cur_state,
657 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
658
659
660 void do_shutdown(long long action, enum crmd_fsa_cause cause,
661 enum crmd_fsa_state cur_state,
662 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
663
664
665 void do_stop(long long action, enum crmd_fsa_cause cause,
666 enum crmd_fsa_state cur_state,
667 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
668
669
670 void do_exit(long long action, enum crmd_fsa_cause cause,
671 enum crmd_fsa_state cur_state,
672 enum crmd_fsa_input cur_input, fsa_data_t *msg_data);
673
674
675 void do_dc_join_final(long long action, enum crmd_fsa_cause cause,
676 enum crmd_fsa_state cur_state,
677 enum crmd_fsa_input current_input, fsa_data_t *msg_data);
678 #endif