1 /* 2 * Copyright 2022-2024 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 #ifndef CONTROLD_GLOBALS__H 11 # define CONTROLD_GLOBALS__H 12 13 #include <crm_internal.h> // pcmk__output_t, etc. 14 15 #include <stdint.h> // uint32_t, uint64_t 16 #include <glib.h> // GList, GMainLoop 17 #include <crm/cib.h> // cib_t 18 #include <pacemaker-internal.h> // pcmk__graph_t 19 #include <controld_fsa.h> // enum crmd_fsa_state 20 21 typedef struct { 22 // Group of \p controld_flags values 23 uint32_t flags; 24 25 26 /* Controller finite state automaton */ 27 28 // FSA state 29 enum crmd_fsa_state fsa_state; 30 31 // FSA actions (group of \p A_* flags) 32 uint64_t fsa_actions; 33 34 // FSA input register contents (group of \p R_* flags) 35 uint64_t fsa_input_register; 36 37 // FSA message queue 38 GList *fsa_message_queue; 39 40 41 /* CIB */ 42 43 // Connection to the CIB 44 cib_t *cib_conn; 45 46 47 /* Scheduler */ 48 49 // Reference of the scheduler request being waited on 50 char *fsa_pe_ref; 51 52 53 /* Transitioner */ 54 55 // Transitioner UUID 56 char *te_uuid; 57 58 // Graph of transition currently being processed 59 pcmk__graph_t *transition_graph; 60 61 62 /* Logging */ 63 64 // Output object for controller log messages 65 pcmk__output_t *logger_out; 66 67 68 /* Cluster layer */ 69 70 // Cluster name 71 char *cluster_name; 72 73 // Cluster connection 74 pcmk_cluster_t *cluster; 75 76 /* @TODO Figure out, document, and clean up the code involving 77 * controld_globals.membership_id, controld_globals.peer_seq, and 78 * highest_seq. It's convoluted with no comments. It has something to do 79 * with corosync quorum notifications and the current ring ID, but it's 80 * unclear why we need three separate variables for it. 81 */ 82 // Last saved cluster communication layer membership ID 83 unsigned long long membership_id; 84 85 unsigned long long peer_seq; 86 87 88 /* Other */ 89 90 // Designated controller name 91 char *dc_name; 92 93 // Designated controller's Pacemaker version 94 char *dc_version; 95 96 // Local node's UUID 97 char *our_uuid; 98 99 // Max lifetime (in seconds) of a resource's shutdown lock to a node 100 guint shutdown_lock_limit; 101 102 // Node pending timeout 103 guint node_pending_timeout; 104 105 // Main event loop 106 GMainLoop *mainloop; 107 } controld_globals_t; 108 109 extern controld_globals_t controld_globals; 110 111 /*! 112 * \internal 113 * \enum controld_flags 114 * \brief Bit flags to store various controller state and configuration info 115 */ 116 enum controld_flags { 117 //! The DC left in a membership change that is being processed 118 controld_dc_left = (1 << 0), 119 120 //! The FSA is stalled waiting for further input 121 controld_fsa_is_stalled = (1 << 1), 122 123 //! The local node has been in a quorate partition at some point 124 controld_ever_had_quorum = (1 << 2), 125 126 //! The local node is currently in a quorate partition 127 controld_has_quorum = (1 << 3), 128 129 //! Panic the local node if it loses quorum 130 controld_no_quorum_panic = (1 << 4), 131 132 //! Lock resources to the local node when it shuts down cleanly 133 controld_shutdown_lock_enabled = (1 << 5), 134 }; 135 136 # define controld_set_global_flags(flags_to_set) do { \ 137 controld_globals.flags = pcmk__set_flags_as(__func__, __LINE__, \ 138 LOG_TRACE, \ 139 "Global", "controller", \ 140 controld_globals.flags, \ 141 (flags_to_set), \ 142 #flags_to_set); \ 143 } while (0) 144 145 # define controld_clear_global_flags(flags_to_clear) do { \ 146 controld_globals.flags \ 147 = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, "Global", \ 148 "controller", controld_globals.flags, \ 149 (flags_to_clear), #flags_to_clear); \ 150 } while (0) 151 152 #endif // ifndef CONTROLD_GLOBALS__H