21 #include <sys/socket.h> 
   22 #include <netinet/in.h> 
   23 #include <arpa/inet.h> 
   29 #include <sys/utsname.h> 
   31 #include <qb/qbipcc.h> 
   32 #include <qb/qbutil.h> 
   34 #include <corosync/corodefs.h> 
   35 #include <corosync/corotypes.h> 
   36 #include <corosync/hdb.h> 
   37 #include <corosync/cfg.h> 
   38 #include <corosync/cmap.h> 
   39 #include <corosync/quorum.h> 
   58     cmap_handle_t local_handle = 0;
 
   65     if (cmap_handle == 0 && local_handle == 0) {
 
   67         crm_trace(
"Initializing CMAP connection");
 
   69             rc = cmap_initialize(&local_handle);
 
   72                 crm_debug(
"API connection setup failed: %s.  Retrying in %ds", cs_strerror(rc),
 
   77         } 
while (retries < 5 && rc != CS_OK);
 
   80             crm_warn(
"Could not connect to Cluster Configuration Database API, error %s",
 
   86     if (cmap_handle == 0) {
 
   87         cmap_handle = local_handle;
 
   90     while (name == NULL && cmap_handle != 0) {
 
   95         rc = cmap_get_uint32(cmap_handle, key, &
id);
 
   96         crm_trace(
"Checking %u vs %u from %s", nodeid, 
id, key);
 
  104             crm_trace(
"Searching for node name for %u in nodelist.node.%d %s", nodeid, lpc, name);
 
  107                 cmap_get_string(cmap_handle, key, &name);
 
  119                 cmap_get_string(cmap_handle, key, &name);
 
  130         cmap_finalize(local_handle);
 
  134         crm_info(
"Unable to get node name for nodeid %u", nodeid);
 
  142     crm_info(
"Disconnecting from Corosync");
 
  163 pcmk_quorum_dispatch(gpointer user_data)
 
  169         crm_err(
"Connection to the Quorum API failed: %d", rc);
 
  177 pcmk_quorum_notification(quorum_handle_t handle,
 
  184     static gboolean init_phase = TRUE;
 
  189                        ring_id, (
long unsigned int)view_list_entries);
 
  192                      ring_id, (
long unsigned int)view_list_entries);
 
  198                  (quorate? 
"retained" : 
"still lost"), ring_id,
 
  199                  (
long unsigned int)view_list_entries);
 
  202     if (view_list_entries == 0 && init_phase) {
 
  203         crm_info(
"Corosync membership is still forming, ignoring");
 
  212     while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) {
 
  217     for (i = 0; i < view_list_entries; i++) {
 
  224         if (node->
uname == NULL) {
 
  227             crm_info(
"Obtaining name for new node %u", 
id);
 
  245     .quorum_notify_fn = pcmk_quorum_notification,
 
  250                        void (*destroy) (gpointer))
 
  258     quorum_fd_callbacks.
dispatch = pcmk_quorum_dispatch;
 
  261     crm_debug(
"Configuring Pacemaker to obtain quorum from Corosync");
 
  265         crm_err(
"Could not connect to the Quorum API: %d", rc);
 
  268     } 
else if (quorum_type != QUORUM_SET) {
 
  269         crm_err(
"Corosync quorum is not configured");
 
  275         crm_err(
"Could not obtain the current Quorum API state: %d", rc);
 
  289         crm_err(
"Could not setup Quorum API notifications: %d", rc);
 
  295         crm_err(
"Could not obtain the Quorum API connection: %d", rc);
 
  316     while (retries < 5) {
 
  325             case CS_ERR_TRY_AGAIN:
 
  326             case CS_ERR_QUEUE_FULL:
 
  334     crm_err(
"Could not connect to corosync after %d retries", retries);
 
  358     if(cluster->
nodeid == 0) {
 
  359         crm_err(
"Could not establish local nodeid");
 
  364     if(cluster->
uname == NULL) {
 
  365         crm_err(
"Could not establish local node name");
 
  379     gboolean sane = TRUE;
 
  383     if (sane && msg->header.
size == 0) {
 
  388     if (sane && msg->header.error != CS_OK) {
 
  389         crm_warn(
"Message header contains an error: %d", msg->header.error);
 
  400         crm_warn(
"Message with no payload");
 
  405         int str_size = strlen(data) + 1;
 
  410             crm_warn(
"Message payload is corrupted: expected %d bytes, got %d",
 
  413             for (lpc = (str_size - 10); lpc < msg->
size; lpc++) {
 
  417                 crm_debug(
"bad_data[%d]: %d / '%c'", lpc, data[lpc], data[lpc]);
 
  423         crm_err(
"Invalid message %d: (dest=%s:%s, from=%s:%s.%u, compressed=%d, size=%d, total=%d)",
 
  424                 msg->
id, ais_dest(&(msg->
host)), msg_type2text(dest),
 
  430             (
"Verified message %d: (dest=%s:%s, from=%s:%s.%u, compressed=%d, size=%d, total=%d)",
 
  431              msg->
id, ais_dest(&(msg->
host)), msg_type2text(dest), ais_dest(&(msg->
sender)),
 
  443     cmap_handle_t handle;
 
  445     rc = cmap_initialize(&handle);
 
  450         case CS_ERR_SECURITY:
 
  451             crm_debug(
"Failed to initialize the cmap API: Permission denied (%d)", rc);
 
  458             crm_info(
"Failed to initialize the cmap API: %s (%d)",
 
  459                      ais_error2text(rc), rc);
 
  463     cmap_finalize(handle);
 
  491     gboolean any = FALSE;
 
  492     cmap_handle_t cmap_handle;
 
  495         rc = cmap_initialize(&cmap_handle);
 
  498             crm_debug(
"API connection setup failed: %s.  Retrying in %ds", cs_strerror(rc),
 
  503     } 
while (retries < 5 && rc != CS_OK);
 
  506         crm_warn(
"Could not connect to Cluster Configuration Database API, error %d", rc);
 
  511     crm_trace(
"Initializing corosync nodelist");
 
  512     for (lpc = 0; TRUE; lpc++) {
 
  518         rc = cmap_get_uint32(cmap_handle, key, &nodeid);
 
  531             while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) {
 
  532                 if(node && node->
uname && strcasecmp(node->
uname, name) == 0) {
 
  533                     if (node->
id && node->
id != nodeid) {
 
  534                         crm_crit(
"Nodes %u and %u share the same name '%s': shutting down", node->
id,
 
  542         if (nodeid > 0 || name != NULL) {
 
  543             crm_trace(
"Initializing node[%d] %u = %s", lpc, nodeid, name);
 
  547         if (nodeid > 0 && name != NULL) {
 
  563     cmap_finalize(cmap_handle);
 
  570     cmap_handle_t handle;
 
  571     char *cluster_name = NULL;
 
  574     rc = cmap_initialize(&handle);
 
  576         crm_info(
"Failed to initialize the cmap API: %s (%d)", ais_error2text(rc), rc);
 
  580     rc = cmap_get_string(handle, 
"totem.cluster_name", &cluster_name);
 
  582         crm_info(
"Cannot get totem.cluster_name: %s (%d)", ais_error2text(rc), rc);
 
  585         crm_debug(
"cmap totem.cluster_name = '%s'", cluster_name);
 
  588     cmap_finalize(handle);
 
  598     static int found = -1;
 
  599     cmap_handle_t cmap_handle;
 
  600     cmap_iter_handle_t iter_handle;
 
  601     char key_name[CMAP_KEYNAME_MAXLEN + 1];
 
  608         rc = cmap_initialize(&cmap_handle);
 
  611             crm_debug(
"API connection setup failed: %s.  Retrying in %ds", cs_strerror(rc),
 
  616     } 
while (retries < 5 && rc != CS_OK);
 
  619         crm_warn(
"Could not connect to Cluster Configuration Database API: %s (rc=%d)",
 
  620                  cs_strerror(rc), rc);
 
  624     rc = cmap_iter_init(cmap_handle, prefix, &iter_handle);
 
  626         crm_warn(
"Failed to initialize iteration for corosync cmap '%s': %s (rc=%d)",
 
  627                  prefix, cs_strerror(rc), rc);
 
  632     while ((rc = cmap_iter_next(cmap_handle, iter_handle, key_name, NULL, NULL)) == CS_OK) {
 
  633         crm_trace(
"'%s' is configured in corosync cmap: %s", prefix, key_name);
 
  637     cmap_iter_finalize(cmap_handle, iter_handle);
 
  640     cmap_finalize(cmap_handle);
 
enum crm_ais_msg_types type
 
#define crm_notice(fmt, args...)
 
#define crm_crit(fmt, args...)
 
gboolean safe_str_neq(const char *a, const char *b)
 
mainloop_io_t * mainloop_add_fd(const char *name, int priority, int fd, void *userdata, struct mainloop_fd_callbacks *callbacks)
 
quorum_callbacks_t quorum_callbacks
 
void crm_reap_unseen_nodes(uint64_t ring_id)
 
char * corosync_node_name(uint64_tcmap_handle, uint32_t nodeid)
 
quorum_handle_t pcmk_quorum_handle
 
char * get_corosync_uuid(crm_node_t *peer)
 
void terminate_cs_connection(crm_cluster_t *cluster)
 
crm_node_t * crm_get_peer(unsigned int id, const char *uname)
 
int(* dispatch)(gpointer userdata)
 
char * get_node_name(uint32_t nodeid)
 
gboolean cluster_connect_quorum(gboolean(*dispatch)(unsigned long long, gboolean), void(*destroy)(gpointer))
 
Wrappers for and extensions to glib mainloop. 
 
gboolean init_cs_connection(crm_cluster_t *cluster)
 
gboolean crm_is_corosync_peer_active(const crm_node_t *node)
 
void cluster_disconnect_cpg(crm_cluster_t *cluster)
 
#define crm_warn(fmt, args...)
 
char * corosync_cluster_name(void)
 
#define crm_debug(fmt, args...)
 
void(* destroy)(gpointer userdata)
 
gboolean(* quorum_app_callback)(unsigned long long seq, gboolean quorate)
 
#define crm_trace(fmt, args...)
 
gboolean check_message_sanity(const AIS_Message *msg, const char *data)
 
xmlNode * create_xml_node(xmlNode *parent, const char *name)
 
struct crm_ais_msg_s AIS_Message
 
#define ais_data_len(msg)
 
int corosync_cmap_has_config(const char *prefix)
 
enum cluster_type_e find_corosync_variant(void)
 
gboolean ais_membership_force
 
const char * name_for_cluster_type(enum cluster_type_e type)
 
#define DAEMON_RESPAWN_STOP
 
gboolean init_cs_connection_once(crm_cluster_t *cluster)
 
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
 
crm_node_t * crm_update_peer_state(const char *source, crm_node_t *node, const char *state, int membership)
Update a node's state and membership information. 
 
uint32_t get_local_nodeid(cpg_handle_t handle)
 
gboolean node_name_is_valid(const char *key, const char *name)
 
#define crm_err(fmt, args...)
 
void crm_xml_set_id(xmlNode *xml, const char *format,...) __attribute__((__format__(__printf__
 
Wrappers for and extensions to libqb IPC. 
 
char * crm_strdup_printf(char const *format,...) __attribute__((__format__(__printf__
 
GHashTable * crm_peer_cache
 
#define crm_info(fmt, args...)
 
gboolean corosync_initialize_nodelist(void *cluster, gboolean force_member, xmlNode *xml_parent)
 
gboolean cluster_connect_cpg(crm_cluster_t *cluster)
 
enum cluster_type_e get_cluster_type(void)