pacemaker  2.0.1-9e909a5bdd
Scalable High-Availability cluster resource manager
internal.h
Go to the documentation of this file.
1 /*
2  * Copyright 2004-2018 Andrew Beekhof <andrew@beekhof.net>
3  *
4  * This source code is licensed under the GNU Lesser General Public License
5  * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
6  */
7 
8 #ifndef CRM_CLUSTER_INTERNAL__H
9 # define CRM_CLUSTER_INTERNAL__H
10 
11 # include <crm/cluster.h>
12 
13 typedef struct crm_ais_host_s AIS_Host;
14 typedef struct crm_ais_msg_s AIS_Message;
15 
19  gboolean local;
22  char uname[MAX_NAME];
23 
24 } __attribute__ ((packed));
25 
26 struct crm_ais_msg_s {
27  cs_ipc_header_response_t header __attribute__ ((aligned(8)));
29  gboolean is_compressed;
30 
33 
36  /* 584 bytes */
37  char data[0];
38 
39 } __attribute__ ((packed));
40 
41 /* *INDENT-OFF* */
43  crm_proc_none = 0x00000001,
44 
45  // Cluster layers
46  crm_proc_cpg = 0x04000000,
47 
48  // Daemons
49  crm_proc_execd = 0x00000010,
50  crm_proc_based = 0x00000100,
51  crm_proc_controld = 0x00000200,
52  crm_proc_attrd = 0x00001000,
53  crm_proc_schedulerd = 0x00010000,
54  crm_proc_fenced = 0x00100000,
55 };
56 /* *INDENT-ON* */
57 
64 static inline uint32_t
65 crm_get_cluster_proc()
66 {
67  switch (get_cluster_type()) {
69  return crm_proc_cpg;
70 
71  default:
72  break;
73  }
74  return crm_proc_none;
75 }
76 
77 static inline const char *
78 peer2text(enum crm_proc_flag proc)
79 {
80  const char *text = "unknown";
81 
82  switch (proc) {
84  text = "none";
85  break;
86  case crm_proc_based:
87  text = "pacemaker-based";
88  break;
89  case crm_proc_controld:
90  text = "pacemaker-controld";
91  break;
93  text = "pacemaker-schedulerd";
94  break;
95  case crm_proc_execd:
96  text = "pacemaker-execd";
97  break;
98  case crm_proc_attrd:
99  text = "pacemaker-attrd";
100  break;
101  case crm_proc_fenced:
102  text = "pacemaker-fenced";
103  break;
104  case crm_proc_cpg:
105  text = "corosync-cpg";
106  break;
107  }
108  return text;
109 }
110 
111 static inline const char *
112 ais_dest(const AIS_Host *host)
113 {
114  if (host->local) {
115  return "local";
116  } else if (host->size > 0) {
117  return host->uname;
118  } else {
119  return "<all>";
120  }
121 }
122 
123 # define ais_data_len(msg) (msg->is_compressed?msg->compressed_size:msg->size)
124 
125 /*
126 typedef enum {
127  CS_OK = 1,
128  CS_ERR_LIBRARY = 2,
129  CS_ERR_VERSION = 3,
130  CS_ERR_INIT = 4,
131  CS_ERR_TIMEOUT = 5,
132  CS_ERR_TRY_AGAIN = 6,
133  CS_ERR_INVALID_PARAM = 7,
134  CS_ERR_NO_MEMORY = 8,
135  CS_ERR_BAD_HANDLE = 9,
136  CS_ERR_BUSY = 10,
137  CS_ERR_ACCESS = 11,
138  CS_ERR_NOT_EXIST = 12,
139  CS_ERR_NAME_TOO_LONG = 13,
140  CS_ERR_EXIST = 14,
141  CS_ERR_NO_SPACE = 15,
142  CS_ERR_INTERRUPT = 16,
143  CS_ERR_NAME_NOT_FOUND = 17,
144  CS_ERR_NO_RESOURCES = 18,
145  CS_ERR_NOT_SUPPORTED = 19,
146  CS_ERR_BAD_OPERATION = 20,
147  CS_ERR_FAILED_OPERATION = 21,
148  CS_ERR_MESSAGE_ERROR = 22,
149  CS_ERR_QUEUE_FULL = 23,
150  CS_ERR_QUEUE_NOT_AVAILABLE = 24,
151  CS_ERR_BAD_FLAGS = 25,
152  CS_ERR_TOO_BIG = 26,
153  CS_ERR_NO_SECTIONS = 27,
154  CS_ERR_CONTEXT_NOT_FOUND = 28,
155  CS_ERR_TOO_MANY_GROUPS = 30,
156  CS_ERR_SECURITY = 100
157 } cs_error_t;
158  */
159 static inline const char *
160 ais_error2text(int error)
161 {
162  const char *text = "unknown";
163 
164 # if SUPPORT_COROSYNC
165  switch (error) {
166  case CS_OK:
167  text = "OK";
168  break;
169  case CS_ERR_LIBRARY:
170  text = "Library error";
171  break;
172  case CS_ERR_VERSION:
173  text = "Version error";
174  break;
175  case CS_ERR_INIT:
176  text = "Initialization error";
177  break;
178  case CS_ERR_TIMEOUT:
179  text = "Timeout";
180  break;
181  case CS_ERR_TRY_AGAIN:
182  text = "Try again";
183  break;
184  case CS_ERR_INVALID_PARAM:
185  text = "Invalid parameter";
186  break;
187  case CS_ERR_NO_MEMORY:
188  text = "No memory";
189  break;
190  case CS_ERR_BAD_HANDLE:
191  text = "Bad handle";
192  break;
193  case CS_ERR_BUSY:
194  text = "Busy";
195  break;
196  case CS_ERR_ACCESS:
197  text = "Access error";
198  break;
199  case CS_ERR_NOT_EXIST:
200  text = "Doesn't exist";
201  break;
202  case CS_ERR_NAME_TOO_LONG:
203  text = "Name too long";
204  break;
205  case CS_ERR_EXIST:
206  text = "Exists";
207  break;
208  case CS_ERR_NO_SPACE:
209  text = "No space";
210  break;
211  case CS_ERR_INTERRUPT:
212  text = "Interrupt";
213  break;
214  case CS_ERR_NAME_NOT_FOUND:
215  text = "Name not found";
216  break;
217  case CS_ERR_NO_RESOURCES:
218  text = "No resources";
219  break;
220  case CS_ERR_NOT_SUPPORTED:
221  text = "Not supported";
222  break;
223  case CS_ERR_BAD_OPERATION:
224  text = "Bad operation";
225  break;
226  case CS_ERR_FAILED_OPERATION:
227  text = "Failed operation";
228  break;
229  case CS_ERR_MESSAGE_ERROR:
230  text = "Message error";
231  break;
232  case CS_ERR_QUEUE_FULL:
233  text = "Queue full";
234  break;
235  case CS_ERR_QUEUE_NOT_AVAILABLE:
236  text = "Queue not available";
237  break;
238  case CS_ERR_BAD_FLAGS:
239  text = "Bad flags";
240  break;
241  case CS_ERR_TOO_BIG:
242  text = "Too big";
243  break;
244  case CS_ERR_NO_SECTIONS:
245  text = "No sections";
246  break;
247  }
248 # endif
249  return text;
250 }
251 
252 static inline const char *
253 msg_type2text(enum crm_ais_msg_types type)
254 {
255  const char *text = "unknown";
256 
257  switch (type) {
258  case crm_msg_none:
259  text = "unknown";
260  break;
261  case crm_msg_ais:
262  text = "ais";
263  break;
264  case crm_msg_cib:
265  text = "cib";
266  break;
267  case crm_msg_crmd:
268  text = "crmd";
269  break;
270  case crm_msg_pe:
271  text = "pengine";
272  break;
273  case crm_msg_te:
274  text = "tengine";
275  break;
276  case crm_msg_lrmd:
277  text = "lrmd";
278  break;
279  case crm_msg_attrd:
280  text = "attrd";
281  break;
282  case crm_msg_stonithd:
283  text = "stonithd";
284  break;
285  case crm_msg_stonith_ng:
286  text = "stonith-ng";
287  break;
288  }
289  return text;
290 }
291 
292 gboolean check_message_sanity(const AIS_Message * msg, const char *data);
293 
294 # if SUPPORT_COROSYNC
295 
296 gboolean send_cpg_iov(struct iovec * iov);
297 
298 char *get_corosync_uuid(crm_node_t *peer);
299 char *corosync_node_name(uint64_t /*cmap_handle_t */ cmap_handle, uint32_t nodeid);
300 char *corosync_cluster_name(void);
301 int corosync_cmap_has_config(const char *prefix);
302 
303 gboolean corosync_initialize_nodelist(void *cluster, gboolean force_member, xmlNode * xml_parent);
304 
305 gboolean send_cluster_message_cs(xmlNode * msg, gboolean local,
306  crm_node_t * node, enum crm_ais_msg_types dest);
307 
309 
310 void terminate_cs_connection(crm_cluster_t * cluster);
311 gboolean init_cs_connection(crm_cluster_t * cluster);
312 gboolean init_cs_connection_once(crm_cluster_t * cluster);
313 # endif
314 
315 crm_node_t *crm_update_peer_proc(const char *source, crm_node_t * peer,
316  uint32_t flag, const char *status);
317 crm_node_t *crm_update_peer_state(const char *source, crm_node_t * node,
318  const char *state, int membership);
319 
320 void crm_update_peer_uname(crm_node_t *node, const char *uname);
321 void crm_update_peer_expected(const char *source, crm_node_t * node, const char *expected);
322 void crm_reap_unseen_nodes(uint64_t ring_id);
323 
324 gboolean cluster_connect_quorum(gboolean(*dispatch) (unsigned long long, gboolean),
325  void (*destroy) (gpointer));
326 
327 gboolean node_name_is_valid(const char *key, const char *name);
328 
329 crm_node_t * crm_find_peer_full(unsigned int id, const char *uname, int flags);
330 crm_node_t * crm_find_peer(unsigned int id, const char *uname);
331 
332 void crm_peer_caches_refresh(xmlNode *cib);
333 crm_node_t *crm_find_known_peer_full(unsigned int id, const char *uname, int flags);
334 
335 #endif
enum crm_ais_msg_types type
Definition: internal.h:20
gboolean send_cpg_iov(struct iovec *iov)
Definition: cpg.c:182
gboolean is_compressed
Definition: internal.h:29
uint32_t size
Definition: internal.h:34
crm_ais_msg_types
Definition: cluster.h:94
void crm_reap_unseen_nodes(uint64_t ring_id)
Definition: membership.c:977
void terminate_cs_connection(crm_cluster_t *cluster)
Definition: corosync.c:154
uint32_t id
Definition: internal.h:17
AIS_Host host
Definition: internal.h:84
gboolean cluster_connect_quorum(gboolean(*dispatch)(unsigned long long, gboolean), void(*destroy)(gpointer))
Definition: corosync.c:251
gboolean init_cs_connection(crm_cluster_t *cluster)
Definition: corosync.c:314
char * corosync_cluster_name(void)
Definition: corosync.c:570
cluster_type_e
Definition: cluster.h:172
gboolean local
Definition: internal.h:19
crm_node_t * crm_update_peer_proc(const char *source, crm_node_t *peer, uint32_t flag, const char *status)
Definition: membership.c:785
AIS_Host sender
Definition: internal.h:32
uint32_t id
Definition: internal.h:28
gboolean check_message_sanity(const AIS_Message *msg, const char *data)
Definition: corosync.c:379
char * corosync_node_name(uint64_t cmap_handle, uint32_t nodeid)
Definition: corosync.c:68
int corosync_cmap_has_config(const char *prefix)
Definition: corosync.c:596
uint32_t size
Definition: internal.h:21
struct qb_ipc_response_header cs_ipc_header_response_t
Definition: crm_internal.h:219
enum cluster_type_e find_corosync_variant(void)
Definition: corosync.c:442
uint32_t compressed_size
Definition: internal.h:35
#define MAX_NAME
Definition: crm.h:36
void crm_update_peer_expected(const char *source, crm_node_t *node, const char *expected)
Definition: membership.c:852
gboolean init_cs_connection_once(crm_cluster_t *cluster)
Definition: corosync.c:341
crm_node_t * crm_find_known_peer_full(unsigned int id, const char *uname, int flags)
Definition: membership.c:1156
crm_node_t * crm_update_peer_state(const char *source, crm_node_t *node, const char *state, int membership)
Update a node&#39;s state and membership information.
Definition: membership.c:965
gboolean node_name_is_valid(const char *key, const char *name)
Definition: cluster.c:334
char uname[MAX_NAME]
Definition: internal.h:22
crm_node_t * crm_find_peer_full(unsigned int id, const char *uname, int flags)
Definition: membership.c:484
gboolean send_cluster_message_cs(xmlNode *msg, gboolean local, crm_node_t *node, enum crm_ais_msg_types dest)
Definition: cpg.c:478
#define uint32_t
Definition: stdint.in.h:158
char data[0]
Definition: internal.h:90
char * get_corosync_uuid(crm_node_t *node)
Definition: corosync.c:51
uint32_t pid
Definition: internal.h:18
void crm_update_peer_uname(crm_node_t *node, const char *uname)
Definition: membership.c:732
AIS_Host host
Definition: internal.h:31
void crm_peer_caches_refresh(xmlNode *cib)
Definition: membership.c:1149
crm_node_t * crm_find_peer(unsigned int id, const char *uname)
Definition: membership.c:522
crm_proc_flag
Definition: internal.h:42
gboolean corosync_initialize_nodelist(void *cluster, gboolean force_member, xmlNode *xml_parent)
Definition: corosync.c:488
uint64_t flags
Definition: remote.c:148
enum crm_proc_flag __attribute__
enum cluster_type_e get_cluster_type(void)
Definition: cluster.c:273