pacemaker  2.1.7-0f7f88312f
Scalable High-Availability cluster resource manager
cluster.h
Go to the documentation of this file.
1 /*
2  * Copyright 2004-2023 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 PCMK__CRM_CLUSTER__H
11 # define PCMK__CRM_CLUSTER__H
12 
13 # include <stdint.h> // uint32_t, uint64_t
14 # include <glib.h> // gboolean, GHashTable
15 # include <libxml/tree.h> // xmlNode
16 # include <crm/common/xml.h>
17 # include <crm/common/util.h>
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 # if SUPPORT_COROSYNC
24 # include <corosync/cpg.h>
25 # endif
26 
27 extern gboolean crm_have_quorum;
28 extern GHashTable *crm_peer_cache;
29 extern GHashTable *crm_remote_peer_cache;
30 extern unsigned long long crm_peer_seq;
31 
32 #define CRM_NODE_LOST "lost"
33 #define CRM_NODE_MEMBER "member"
34 
36  /* @COMPAT: crm_join_nack_quiet can be replaced by crm_node_t:user_data
37  * at a compatibility break.
38  */
41 
48 };
49 
51  /* node is not a cluster node and should not be considered for cluster membership */
52  crm_remote_node = 0x0001,
53 
54  /* node's cache entry is dirty */
55  crm_node_dirty = 0x0010,
56 };
57 
58 typedef struct crm_peer_node_s {
59  char *uname; // Node name as known to cluster
60  char *uuid; // Node UUID to ensure uniqueness
61  char *state; // @TODO change to enum
62  uint64_t flags; // Bitmask of crm_node_flags
63  uint64_t last_seen; // Only needed by cluster nodes
64  uint32_t processes; // @TODO most not needed, merge into flags
65 
66  /* @TODO When we can break public API compatibility, we can make the rest of
67  * these members separate structs and use void *cluster_data and
68  * void *user_data here instead, to abstract the cluster layer further.
69  */
70 
71  // Currently only needed by corosync stack
72  uint32_t id; // Node ID
73  time_t when_lost; // When CPG membership was last lost
74 
75  // Only used by controller
77  char *expected;
78 
79  time_t peer_lost;
80  char *conn_host;
81 
82  time_t when_member; // Since when node has been a cluster member
83  time_t when_online; // Since when peer has been online in CPG
84 } crm_node_t;
85 
86 void crm_peer_init(void);
87 void crm_peer_destroy(void);
88 
89 typedef struct crm_cluster_s {
90  char *uuid;
91  char *uname;
92  uint32_t nodeid;
93 
94  void (*destroy) (gpointer);
95 
96 # if SUPPORT_COROSYNC
97  /* @TODO When we can break public API compatibility, make these members a
98  * separate struct and use void *cluster_data here instead, to abstract the
99  * cluster layer further.
100  */
101  struct cpg_name group;
102  cpg_callbacks_t cpg;
103  cpg_handle_t cpg_handle;
104 # endif
105 
106 } crm_cluster_t;
107 
108 gboolean crm_cluster_connect(crm_cluster_t *cluster);
110 
112 void pcmk_cluster_free(crm_cluster_t *cluster);
113 
116 };
117 
129 };
130 
131 /* used with crm_get_peer_full */
136 };
137 
138 gboolean send_cluster_message(const crm_node_t *node,
139  enum crm_ais_msg_types service,
140  const xmlNode *data, gboolean ordered);
141 
143 
144 /* Initialize and refresh the remote peer cache from a cib config */
145 void crm_remote_peer_cache_refresh(xmlNode *cib);
146 crm_node_t *crm_remote_peer_get(const char *node_name);
147 void crm_remote_peer_cache_remove(const char *node_name);
148 
149 /* allows filtering of remote and cluster nodes using crm_get_peer_flags */
150 crm_node_t *crm_get_peer_full(unsigned int id, const char *uname, int flags);
151 
152 /* only searches cluster nodes */
153 crm_node_t *crm_get_peer(unsigned int id, const char *uname);
154 
155 guint crm_active_peers(void);
156 gboolean crm_is_peer_active(const crm_node_t * node);
157 guint reap_crm_member(uint32_t id, const char *name);
158 
159 # if SUPPORT_COROSYNC
160 uint32_t get_local_nodeid(cpg_handle_t handle);
161 
162 gboolean cluster_connect_cpg(crm_cluster_t *cluster);
163 void cluster_disconnect_cpg(crm_cluster_t * cluster);
164 
165 void pcmk_cpg_membership(cpg_handle_t handle,
166  const struct cpg_name *groupName,
167  const struct cpg_address *member_list, size_t member_list_entries,
168  const struct cpg_address *left_list, size_t left_list_entries,
169  const struct cpg_address *joined_list, size_t joined_list_entries);
170 gboolean crm_is_corosync_peer_active(const crm_node_t * node);
171 gboolean send_cluster_text(enum crm_ais_msg_class msg_class, const char *data,
172  gboolean local, const crm_node_t *node,
173  enum crm_ais_msg_types dest);
174 char *pcmk_message_common_cs(cpg_handle_t handle, uint32_t nodeid, uint32_t pid, void *msg,
175  uint32_t *kind, const char **from);
176 # endif
177 
178 const char *crm_peer_uuid(crm_node_t *node);
179 const char *crm_peer_uname(const char *uuid);
180 
185 };
186 
187 enum crm_ais_msg_types text2msg_type(const char *text);
188 void crm_set_status_callback(void (*dispatch) (enum crm_status_type, crm_node_t *, const void *));
189 void crm_set_autoreap(gboolean autoreap);
190 
194  // 0x0004 was heartbeat
195  // 0x0010 was corosync 1 with plugin
197  // 0x0040 was corosync 1 with CMAN
198 };
199 
201 const char *name_for_cluster_type(enum cluster_type_e type);
202 
203 gboolean is_corosync_cluster(void);
204 
205 const char *get_local_node_name(void);
206 char *get_node_name(uint32_t nodeid);
207 
215 static inline const char *
216 crm_join_phase_str(enum crm_join_phase phase)
217 {
218  switch (phase) {
219  case crm_join_nack_quiet: return "nack_quiet";
220  case crm_join_nack: return "nack";
221  case crm_join_none: return "none";
222  case crm_join_welcomed: return "welcomed";
223  case crm_join_integrated: return "integrated";
224  case crm_join_finalized: return "finalized";
225  case crm_join_confirmed: return "confirmed";
226  default: return "invalid";
227  }
228 }
229 
230 #if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1)
231 #include <crm/cluster/compat.h>
232 #endif
233 
234 #ifdef __cplusplus
235 }
236 #endif
237 
238 #endif
void crm_peer_destroy(void)
Definition: membership.c:417
struct crm_peer_node_s crm_node_t
void crm_set_status_callback(void(*dispatch)(enum crm_status_type, crm_node_t *, const void *))
Set a client function that will be called after peer status changes.
Definition: membership.c:454
char data[0]
Definition: cpg.c:55
crm_node_flags
Definition: cluster.h:50
crm_ais_msg_types
Definition: cluster.h:118
uint64_t flags
Definition: cluster.h:62
uint32_t nodeid
Definition: cluster.h:92
enum crm_join_phase join
Definition: cluster.h:76
const char * name
Definition: cib.c:26
uint32_t id
Definition: cluster.h:72
gboolean crm_is_peer_active(const crm_node_t *node)
Definition: membership.c:282
gboolean crm_have_quorum
Definition: membership.c:64
char * uuid
Definition: cluster.h:60
crm_join_phase
Definition: cluster.h:35
struct crm_cluster_s crm_cluster_t
void crm_set_autoreap(gboolean autoreap)
Tell the library whether to automatically reap lost nodes.
Definition: membership.c:471
const char * get_local_node_name(void)
Get the local node&#39;s name.
Definition: cluster.c:184
void crm_peer_init(void)
Definition: membership.c:401
void(* destroy)(gpointer)
Definition: cluster.h:94
GHashTable * crm_remote_peer_cache
Definition: membership.c:53
crm_node_t * crm_get_peer(unsigned int id, const char *uname)
Get a cluster node cache entry.
Definition: membership.c:814
char * uuid
Definition: cluster.h:90
guint crm_active_peers(void)
Definition: membership.c:375
enum crm_ais_msg_types type
Definition: cpg.c:48
char * get_node_name(uint32_t nodeid)
Get the node name corresponding to a cluster node ID.
Definition: cluster.c:204
void crm_cluster_disconnect(crm_cluster_t *cluster)
Disconnect from the cluster layer.
Definition: cluster.c:101
char * pcmk_message_common_cs(cpg_handle_t handle, uint32_t nodeid, uint32_t pid, void *content, uint32_t *kind, const char **from)
Extract text data from a Corosync CPG message.
Definition: cpg.c:441
crm_node_t * crm_get_peer_full(unsigned int id, const char *uname, int flags)
Get a node cache entry (cluster or Pacemaker Remote)
Definition: membership.c:565
gboolean crm_is_corosync_peer_active(const crm_node_t *node)
Check whether a Corosync cluster peer is active.
Definition: corosync.c:531
void cluster_disconnect_cpg(crm_cluster_t *cluster)
Disconnect from Corosync CPG.
Definition: cpg.c:95
gboolean local
Definition: cpg.c:47
uint32_t processes
Definition: cluster.h:64
uint32_t pid
Definition: cpg.c:46
enum crm_ais_msg_types text2msg_type(const char *text)
Get the message type equivalent of a string.
Definition: cpg.c:1055
void crm_remote_peer_cache_remove(const char *node_name)
Definition: membership.c:147
Utility functions.
crm_cluster_t * pcmk_cluster_new(void)
Allocate a new crm_cluster_t object.
Definition: cluster.c:127
time_t when_lost
Definition: cluster.h:73
cluster_type_e
Definition: cluster.h:191
crm_status_type
Definition: cluster.h:181
gboolean send_cluster_text(enum crm_ais_msg_class msg_class, const char *data, gboolean local, const crm_node_t *node, enum crm_ais_msg_types dest)
Definition: cpg.c:917
time_t peer_lost
Definition: cluster.h:79
time_t when_member
Definition: cluster.h:82
void pcmk_cluster_free(crm_cluster_t *cluster)
Free a crm_cluster_t object and its dynamically allocated members.
Definition: cluster.c:141
Wrappers for and extensions to libxml2.
unsigned long long crm_peer_seq
Definition: membership.c:63
time_t when_online
Definition: cluster.h:83
gboolean send_cluster_message(const crm_node_t *node, enum crm_ais_msg_types service, const xmlNode *data, gboolean ordered)
Send an XML message via the cluster messaging layer.
Definition: cluster.c:162
guint reap_crm_member(uint32_t id, const char *name)
Remove all peer cache entries matching a node ID and/or uname.
Definition: membership.c:334
const char * name_for_cluster_type(enum cluster_type_e type)
Get a log-friendly string equivalent of a cluster type.
Definition: cluster.c:304
gboolean crm_cluster_connect(crm_cluster_t *cluster)
Connect to the cluster layer.
Definition: cluster.c:75
Deprecated Pacemaker cluster API.
char * expected
Definition: cluster.h:77
gboolean is_corosync_cluster(void)
Check whether the local cluster is a Corosync cluster.
Definition: cluster.c:389
crm_ais_msg_class
Definition: cluster.h:114
char * uname
Definition: cluster.h:91
uint32_t get_local_nodeid(cpg_handle_t handle)
Get the local Corosync node ID (via CPG)
Definition: cpg.c:117
crm_node_t * crm_remote_peer_get(const char *node_name)
Get a remote node peer cache entry, creating it if necessary.
Definition: membership.c:107
const char * crm_peer_uname(const char *uuid)
Get the node name corresponding to a node UUID.
Definition: cluster.c:250
char * conn_host
Definition: cluster.h:80
char uname[MAX_NAME]
Definition: cpg.c:50
Not allowed to join, but don&#39;t send a nack message.
Definition: cluster.h:40
char * state
Definition: cluster.h:61
char * uname
Definition: cluster.h:59
uint64_t last_seen
Definition: cluster.h:63
void pcmk_cpg_membership(cpg_handle_t handle, const struct cpg_name *groupName, const struct cpg_address *member_list, size_t member_list_entries, const struct cpg_address *left_list, size_t left_list_entries, const struct cpg_address *joined_list, size_t joined_list_entries)
Handle a CPG configuration change event.
Definition: cpg.c:687
void crm_remote_peer_cache_refresh(xmlNode *cib)
Repopulate the remote peer cache based on CIB XML.
Definition: membership.c:244
GHashTable * crm_peer_cache
Definition: membership.c:36
const char * crm_peer_uuid(crm_node_t *node)
Get (and set if needed) a node&#39;s UUID.
Definition: cluster.c:38
uint64_t flags
Definition: remote.c:215
gboolean cluster_connect_cpg(crm_cluster_t *cluster)
Connect to Corosync CPG.
Definition: cpg.c:785
enum cluster_type_e get_cluster_type(void)
Get (and validate) the local cluster type.
Definition: cluster.c:325
crm_get_peer_flags
Definition: cluster.h:132
int crm_remote_peer_cache_size(void)
Definition: membership.c:87