pacemaker 2.1.5-a3f44794f94
Scalable High-Availability cluster resource manager
cluster.h
Go to the documentation of this file.
1/*
2 * Copyright 2004-2021 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
20extern "C" {
21#endif
22
23# if SUPPORT_COROSYNC
24# include <corosync/cpg.h>
25# endif
26
27extern gboolean crm_have_quorum;
28extern GHashTable *crm_peer_cache;
29extern GHashTable *crm_remote_peer_cache;
30extern unsigned long long crm_peer_seq;
31
32#define CRM_NODE_LOST "lost"
33#define CRM_NODE_MEMBER "member"
34
42};
43
45 /* node is not a cluster node and should not be considered for cluster membership */
47
48 /* node's cache entry is dirty */
50};
51
52typedef struct crm_peer_node_s {
53 char *uname; // Node name as known to cluster
54 char *uuid; // Node UUID to ensure uniqueness
55 char *state; // @TODO change to enum
56 uint64_t flags; // Bitmask of crm_node_flags
57 uint64_t last_seen; // Only needed by cluster nodes
58 uint32_t processes; // @TODO most not needed, merge into flags
59
60 /* @TODO When we can break public API compatibility, we can make the rest of
61 * these members separate structs and use void *cluster_data and
62 * void *user_data here instead, to abstract the cluster layer further.
63 */
64
65 // Currently only needed by corosync stack
66 uint32_t id; // Node ID
67 time_t when_lost; // When CPG membership was last lost
68
69 // Only used by controller
71 char *expected;
73
74void crm_peer_init(void);
75void crm_peer_destroy(void);
76
77typedef struct crm_cluster_s {
78 char *uuid;
79 char *uname;
80 uint32_t nodeid;
81
82 void (*destroy) (gpointer);
83
84# if SUPPORT_COROSYNC
85 /* @TODO When we can break public API compatibility, make these members a
86 * separate struct and use void *cluster_data here instead, to abstract the
87 * cluster layer further.
88 */
89 struct cpg_name group;
90 cpg_callbacks_t cpg;
91 cpg_handle_t cpg_handle;
92# endif
93
95
96gboolean crm_cluster_connect(crm_cluster_t *cluster);
98
101};
102
114};
115
116/* used with crm_get_peer_full */
121};
122
123gboolean send_cluster_message(crm_node_t *node, enum crm_ais_msg_types service,
124 xmlNode *data, gboolean ordered);
125
127
128/* Initialize and refresh the remote peer cache from a cib config */
129void crm_remote_peer_cache_refresh(xmlNode *cib);
130crm_node_t *crm_remote_peer_get(const char *node_name);
131void crm_remote_peer_cache_remove(const char *node_name);
132
133/* allows filtering of remote and cluster nodes using crm_get_peer_flags */
134crm_node_t *crm_get_peer_full(unsigned int id, const char *uname, int flags);
135
136/* only searches cluster nodes */
137crm_node_t *crm_get_peer(unsigned int id, const char *uname);
138
139guint crm_active_peers(void);
140gboolean crm_is_peer_active(const crm_node_t * node);
141guint reap_crm_member(uint32_t id, const char *name);
142
143# if SUPPORT_COROSYNC
144uint32_t get_local_nodeid(cpg_handle_t handle);
145
146gboolean cluster_connect_cpg(crm_cluster_t *cluster);
148
149void pcmk_cpg_membership(cpg_handle_t handle,
150 const struct cpg_name *groupName,
151 const struct cpg_address *member_list, size_t member_list_entries,
152 const struct cpg_address *left_list, size_t left_list_entries,
153 const struct cpg_address *joined_list, size_t joined_list_entries);
154gboolean crm_is_corosync_peer_active(const crm_node_t * node);
155gboolean send_cluster_text(enum crm_ais_msg_class msg_class, const char *data,
156 gboolean local, crm_node_t * node,
157 enum crm_ais_msg_types dest);
158char *pcmk_message_common_cs(cpg_handle_t handle, uint32_t nodeid, uint32_t pid, void *msg,
159 uint32_t *kind, const char **from);
160# endif
161
162const char *crm_peer_uuid(crm_node_t *node);
163const char *crm_peer_uname(const char *uuid);
164void set_uuid(xmlNode *xml, const char *attr, crm_node_t *node);
165
170};
171
172enum crm_ais_msg_types text2msg_type(const char *text);
173void crm_set_status_callback(void (*dispatch) (enum crm_status_type, crm_node_t *, const void *));
174void crm_set_autoreap(gboolean autoreap);
175
179 // 0x0004 was heartbeat
180 // 0x0010 was corosync 1 with plugin
182 // 0x0040 was corosync 1 with CMAN
183};
184
187
188gboolean is_corosync_cluster(void);
189
190const char *get_local_node_name(void);
191char *get_node_name(uint32_t nodeid);
192
200static inline const char *
201crm_join_phase_str(enum crm_join_phase phase)
202{
203 switch (phase) {
204 case crm_join_nack: return "nack";
205 case crm_join_none: return "none";
206 case crm_join_welcomed: return "welcomed";
207 case crm_join_integrated: return "integrated";
208 case crm_join_finalized: return "finalized";
209 case crm_join_confirmed: return "confirmed";
210 }
211 return "invalid";
212}
213
214#if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1)
215#include <crm/cluster/compat.h>
216#endif
217
218#ifdef __cplusplus
219}
220#endif
221
222#endif
const char * name
Definition: cib.c:24
gboolean crm_have_quorum
Definition: membership.c:64
gboolean is_corosync_cluster(void)
Check whether the local cluster is a Corosync cluster.
Definition: cluster.c:375
gboolean crm_cluster_connect(crm_cluster_t *cluster)
Connect to the cluster layer.
Definition: cluster.c:75
int crm_remote_peer_cache_size(void)
Definition: membership.c:87
GHashTable * crm_peer_cache
Definition: membership.c:36
void set_uuid(xmlNode *xml, const char *attr, crm_node_t *node)
Add a node's UUID as an XML attribute.
Definition: cluster.c:277
void crm_remote_peer_cache_refresh(xmlNode *cib)
Repopulate the remote peer cache based on CIB XML.
Definition: membership.c:243
crm_ais_msg_types
Definition: cluster.h:103
@ crm_msg_stonithd
Definition: cluster.h:110
@ crm_msg_none
Definition: cluster.h:104
@ crm_msg_cib
Definition: cluster.h:107
@ crm_msg_pe
Definition: cluster.h:112
@ crm_msg_attrd
Definition: cluster.h:109
@ crm_msg_ais
Definition: cluster.h:105
@ crm_msg_te
Definition: cluster.h:111
@ crm_msg_stonith_ng
Definition: cluster.h:113
@ crm_msg_crmd
Definition: cluster.h:108
@ crm_msg_lrmd
Definition: cluster.h:106
const char * get_local_node_name(void)
Get the local node's name.
Definition: cluster.c:155
void crm_cluster_disconnect(crm_cluster_t *cluster)
Disconnect from the cluster layer.
Definition: cluster.c:102
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:333
gboolean send_cluster_message(crm_node_t *node, enum crm_ais_msg_types service, xmlNode *data, gboolean ordered)
Send an XML message via the cluster messaging layer.
Definition: cluster.c:133
const char * crm_peer_uuid(crm_node_t *node)
Get (and set if needed) a node's UUID.
Definition: cluster.c:38
crm_join_phase
Definition: cluster.h:35
@ crm_join_none
Definition: cluster.h:37
@ crm_join_welcomed
Definition: cluster.h:38
@ crm_join_nack
Definition: cluster.h:36
@ crm_join_finalized
Definition: cluster.h:40
@ crm_join_integrated
Definition: cluster.h:39
@ crm_join_confirmed
Definition: cluster.h:41
enum cluster_type_e get_cluster_type(void)
Get (and validate) the local cluster type.
Definition: cluster.c:311
void crm_set_autoreap(gboolean autoreap)
Tell the library whether to automatically reap lost nodes.
Definition: membership.c:469
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:452
crm_node_t * crm_get_peer(unsigned int id, const char *uname)
Get a cluster node cache entry.
Definition: membership.c:700
const char * crm_peer_uname(const char *uuid)
Get the node name corresponding to a node UUID.
Definition: cluster.c:221
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:532
char * get_node_name(uint32_t nodeid)
Get the node name corresponding to a cluster node ID.
Definition: cluster.c:175
const char * name_for_cluster_type(enum cluster_type_e type)
Get a log-friendly string equivalent of a cluster type.
Definition: cluster.c:290
GHashTable * crm_remote_peer_cache
Definition: membership.c:53
void crm_remote_peer_cache_remove(const char *node_name)
Definition: membership.c:147
cluster_type_e
Definition: cluster.h:176
@ pcmk_cluster_unknown
Definition: cluster.h:177
@ pcmk_cluster_invalid
Definition: cluster.h:178
@ pcmk_cluster_corosync
Definition: cluster.h:181
struct crm_cluster_s crm_cluster_t
struct crm_peer_node_s crm_node_t
crm_get_peer_flags
Definition: cluster.h:117
@ CRM_GET_PEER_CLUSTER
Definition: cluster.h:118
@ CRM_GET_PEER_ANY
Definition: cluster.h:120
@ CRM_GET_PEER_REMOTE
Definition: cluster.h:119
unsigned long long crm_peer_seq
Definition: membership.c:63
enum crm_ais_msg_types text2msg_type(const char *text)
Get the message type equivalent of a string.
Definition: cpg.c:1053
gboolean crm_is_peer_active(const crm_node_t *node)
Definition: membership.c:281
crm_ais_msg_class
Definition: cluster.h:99
@ crm_class_cluster
Definition: cluster.h:100
void crm_peer_init(void)
Definition: membership.c:399
crm_node_flags
Definition: cluster.h:44
@ crm_remote_node
Definition: cluster.h:46
@ crm_node_dirty
Definition: cluster.h:49
void crm_peer_destroy(void)
Definition: membership.c:415
guint crm_active_peers(void)
Definition: membership.c:374
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
crm_status_type
Definition: cluster.h:166
@ crm_status_processes
Definition: cluster.h:169
@ crm_status_nstate
Definition: cluster.h:168
@ crm_status_uname
Definition: cluster.h:167
uint64_t flags
Definition: remote.c:3
Utility functions.
Deprecated Pacemaker cluster API.
gboolean crm_is_corosync_peer_active(const crm_node_t *node)
Check whether a Corosync cluster peer is active.
Definition: corosync.c:531
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 cluster_disconnect_cpg(crm_cluster_t *cluster)
Disconnect from Corosync CPG.
Definition: cpg.c:95
gboolean send_cluster_text(enum crm_ais_msg_class msg_class, const char *data, gboolean local, crm_node_t *node, enum crm_ais_msg_types dest)
Definition: cpg.c:916
enum crm_ais_msg_types type
Definition: cpg.c:3
char uname[MAX_NAME]
Definition: cpg.c:5
char data[0]
Definition: cpg.c:10
uint32_t get_local_nodeid(cpg_handle_t handle)
Get the local Corosync node ID (via CPG)
Definition: cpg.c:117
gboolean local
Definition: cpg.c:2
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
uint32_t pid
Definition: cpg.c:1
gboolean cluster_connect_cpg(crm_cluster_t *cluster)
Connect to Corosync CPG.
Definition: cpg.c:785
uint32_t nodeid
Definition: cluster.h:80
char * uuid
Definition: cluster.h:78
char * uname
Definition: cluster.h:79
void(* destroy)(gpointer)
Definition: cluster.h:82
uint32_t processes
Definition: cluster.h:58
char * uname
Definition: cluster.h:53
char * expected
Definition: cluster.h:71
uint64_t last_seen
Definition: cluster.h:57
uint32_t id
Definition: cluster.h:66
char * state
Definition: cluster.h:55
char * uuid
Definition: cluster.h:54
time_t when_lost
Definition: cluster.h:67
uint64_t flags
Definition: cluster.h:56
enum crm_join_phase join
Definition: cluster.h:70
Wrappers for and extensions to libxml2.