diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 06:53:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 06:53:20 +0000 |
commit | e5a812082ae033afb1eed82c0f2df3d0f6bdc93f (patch) | |
tree | a6716c9275b4b413f6c9194798b34b91affb3cc7 /include/crm/cluster.h | |
parent | Initial commit. (diff) | |
download | pacemaker-e5a812082ae033afb1eed82c0f2df3d0f6bdc93f.tar.xz pacemaker-e5a812082ae033afb1eed82c0f2df3d0f6bdc93f.zip |
Adding upstream version 2.1.6.upstream/2.1.6
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'include/crm/cluster.h')
-rw-r--r-- | include/crm/cluster.h | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/include/crm/cluster.h b/include/crm/cluster.h new file mode 100644 index 0000000..bceb9c2 --- /dev/null +++ b/include/crm/cluster.h @@ -0,0 +1,236 @@ +/* + * Copyright 2004-2023 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU Lesser General Public License + * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. + */ + +#ifndef PCMK__CRM_CLUSTER__H +# define PCMK__CRM_CLUSTER__H + +# include <stdint.h> // uint32_t, uint64_t +# include <glib.h> // gboolean, GHashTable +# include <libxml/tree.h> // xmlNode +# include <crm/common/xml.h> +# include <crm/common/util.h> + +#ifdef __cplusplus +extern "C" { +#endif + +# if SUPPORT_COROSYNC +# include <corosync/cpg.h> +# endif + +extern gboolean crm_have_quorum; +extern GHashTable *crm_peer_cache; +extern GHashTable *crm_remote_peer_cache; +extern unsigned long long crm_peer_seq; + +#define CRM_NODE_LOST "lost" +#define CRM_NODE_MEMBER "member" + +enum crm_join_phase { + /* @COMPAT: crm_join_nack_quiet can be replaced by crm_node_t:user_data + * at a compatibility break. + */ + //! Not allowed to join, but don't send a nack message + crm_join_nack_quiet = -2, + + crm_join_nack = -1, + crm_join_none = 0, + crm_join_welcomed = 1, + crm_join_integrated = 2, + crm_join_finalized = 3, + crm_join_confirmed = 4, +}; + +enum crm_node_flags { + /* node is not a cluster node and should not be considered for cluster membership */ + crm_remote_node = 0x0001, + + /* node's cache entry is dirty */ + crm_node_dirty = 0x0010, +}; + +typedef struct crm_peer_node_s { + char *uname; // Node name as known to cluster + char *uuid; // Node UUID to ensure uniqueness + char *state; // @TODO change to enum + uint64_t flags; // Bitmask of crm_node_flags + uint64_t last_seen; // Only needed by cluster nodes + uint32_t processes; // @TODO most not needed, merge into flags + + /* @TODO When we can break public API compatibility, we can make the rest of + * these members separate structs and use void *cluster_data and + * void *user_data here instead, to abstract the cluster layer further. + */ + + // Currently only needed by corosync stack + uint32_t id; // Node ID + time_t when_lost; // When CPG membership was last lost + + // Only used by controller + enum crm_join_phase join; + char *expected; + + time_t peer_lost; + char *conn_host; +} crm_node_t; + +void crm_peer_init(void); +void crm_peer_destroy(void); + +typedef struct crm_cluster_s { + char *uuid; + char *uname; + uint32_t nodeid; + + void (*destroy) (gpointer); + +# if SUPPORT_COROSYNC + /* @TODO When we can break public API compatibility, make these members a + * separate struct and use void *cluster_data here instead, to abstract the + * cluster layer further. + */ + struct cpg_name group; + cpg_callbacks_t cpg; + cpg_handle_t cpg_handle; +# endif + +} crm_cluster_t; + +gboolean crm_cluster_connect(crm_cluster_t *cluster); +void crm_cluster_disconnect(crm_cluster_t *cluster); + +crm_cluster_t *pcmk_cluster_new(void); +void pcmk_cluster_free(crm_cluster_t *cluster); + +enum crm_ais_msg_class { + crm_class_cluster = 0, +}; + +enum crm_ais_msg_types { + crm_msg_none = 0, + crm_msg_ais = 1, + crm_msg_lrmd = 2, + crm_msg_cib = 3, + crm_msg_crmd = 4, + crm_msg_attrd = 5, + crm_msg_stonithd = 6, + crm_msg_te = 7, + crm_msg_pe = 8, + crm_msg_stonith_ng = 9, +}; + +/* used with crm_get_peer_full */ +enum crm_get_peer_flags { + CRM_GET_PEER_CLUSTER = 0x0001, + CRM_GET_PEER_REMOTE = 0x0002, + CRM_GET_PEER_ANY = CRM_GET_PEER_CLUSTER|CRM_GET_PEER_REMOTE, +}; + +gboolean send_cluster_message(const crm_node_t *node, + enum crm_ais_msg_types service, xmlNode *data, + gboolean ordered); + +int crm_remote_peer_cache_size(void); + +/* Initialize and refresh the remote peer cache from a cib config */ +void crm_remote_peer_cache_refresh(xmlNode *cib); +crm_node_t *crm_remote_peer_get(const char *node_name); +void crm_remote_peer_cache_remove(const char *node_name); + +/* allows filtering of remote and cluster nodes using crm_get_peer_flags */ +crm_node_t *crm_get_peer_full(unsigned int id, const char *uname, int flags); + +/* only searches cluster nodes */ +crm_node_t *crm_get_peer(unsigned int id, const char *uname); + +guint crm_active_peers(void); +gboolean crm_is_peer_active(const crm_node_t * node); +guint reap_crm_member(uint32_t id, const char *name); + +# if SUPPORT_COROSYNC +uint32_t get_local_nodeid(cpg_handle_t handle); + +gboolean cluster_connect_cpg(crm_cluster_t *cluster); +void cluster_disconnect_cpg(crm_cluster_t * cluster); + +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); +gboolean crm_is_corosync_peer_active(const crm_node_t * node); +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); +char *pcmk_message_common_cs(cpg_handle_t handle, uint32_t nodeid, uint32_t pid, void *msg, + uint32_t *kind, const char **from); +# endif + +const char *crm_peer_uuid(crm_node_t *node); +const char *crm_peer_uname(const char *uuid); +void set_uuid(xmlNode *xml, const char *attr, crm_node_t *node); + +enum crm_status_type { + crm_status_uname, + crm_status_nstate, + crm_status_processes, +}; + +enum crm_ais_msg_types text2msg_type(const char *text); +void crm_set_status_callback(void (*dispatch) (enum crm_status_type, crm_node_t *, const void *)); +void crm_set_autoreap(gboolean autoreap); + +enum cluster_type_e { + pcmk_cluster_unknown = 0x0001, + pcmk_cluster_invalid = 0x0002, + // 0x0004 was heartbeat + // 0x0010 was corosync 1 with plugin + pcmk_cluster_corosync = 0x0020, + // 0x0040 was corosync 1 with CMAN +}; + +enum cluster_type_e get_cluster_type(void); +const char *name_for_cluster_type(enum cluster_type_e type); + +gboolean is_corosync_cluster(void); + +const char *get_local_node_name(void); +char *get_node_name(uint32_t nodeid); + +/*! + * \brief Get log-friendly string equivalent of a join phase + * + * \param[in] phase Join phase + * + * \return Log-friendly string equivalent of \p phase + */ +static inline const char * +crm_join_phase_str(enum crm_join_phase phase) +{ + switch (phase) { + case crm_join_nack_quiet: return "nack_quiet"; + case crm_join_nack: return "nack"; + case crm_join_none: return "none"; + case crm_join_welcomed: return "welcomed"; + case crm_join_integrated: return "integrated"; + case crm_join_finalized: return "finalized"; + case crm_join_confirmed: return "confirmed"; + default: return "invalid"; + } +} + +#if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) +#include <crm/cluster/compat.h> +#endif + +#ifdef __cplusplus +} +#endif + +#endif |