[pve-devel] applied: [PATCH corosync-pve] cherry-pick some fixes and log-improvements
Thomas Lamprecht
t.lamprecht at proxmox.com
Thu Oct 3 16:34:54 CEST 2019
Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---
Note: a patch which moved this all to a submodule build similar to our other
projects was done in front of this to remove the big tarball/pathces-of-patches
PITA
...mknet-Disable-forwarding-on-shutdown.patch | 55 +
...dd-CS_PRI_NODE_ID-and-CS_PRI_RING_ID.patch | 1224 +++++++++++++++++
...1-totemknet-Add-locking-for-log-call.patch | 93 ++
...ck-sanity-length-of-received-message.patch | 71 +
debian/patches/series | 4 +
5 files changed, 1447 insertions(+)
create mode 100644 debian/patches/0009-totemknet-Disable-forwarding-on-shutdown.patch
create mode 100644 debian/patches/0010-logging-Add-CS_PRI_NODE_ID-and-CS_PRI_RING_ID.patch
create mode 100644 debian/patches/0011-totemknet-Add-locking-for-log-call.patch
create mode 100644 debian/patches/0012-totempg-Check-sanity-length-of-received-message.patch
diff --git a/debian/patches/0009-totemknet-Disable-forwarding-on-shutdown.patch b/debian/patches/0009-totemknet-Disable-forwarding-on-shutdown.patch
new file mode 100644
index 0000000..d8e081f
--- /dev/null
+++ b/debian/patches/0009-totemknet-Disable-forwarding-on-shutdown.patch
@@ -0,0 +1,55 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jan Friesse <jfriesse at redhat.com>
+Date: Thu, 27 Jun 2019 08:33:27 +0200
+Subject: [PATCH] totemknet: Disable forwarding on shutdown
+
+Disabling forwarding will make knet flush the messages (especially
+LEAVE one).
+
+Signed-off-by: Jan Friesse <jfriesse at redhat.com>
+Reviewed-by: Christine Caulfield <ccaulfie at redhat.com>
+(cherry picked from commit d59a18d4a13717ffe56ef31fadda9f67c7cfcf8e)
+Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
+---
+ exec/totemknet.c | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/exec/totemknet.c b/exec/totemknet.c
+index e6e04d3a..e1ea8515 100644
+--- a/exec/totemknet.c
++++ b/exec/totemknet.c
+@@ -554,6 +554,14 @@ int totemknet_finalize (
+ qb_loop_poll_del (instance->poll_handle, instance->logpipes[0]);
+ qb_loop_poll_del (instance->poll_handle, instance->knet_fd);
+
++ /*
++ * Disable forwarding to make knet flush send queue. This ensures that the LEAVE message will be sent.
++ */
++ res = knet_handle_setfwd(instance->knet_handle, 0);
++ if (res) {
++ knet_log_printf (LOGSYS_LEVEL_CRIT, "totemknet: knet_handle_setfwd failed: %s", strerror(errno));
++ }
++
+ res = knet_host_get_host_list(instance->knet_handle, nodes, &num_nodes);
+ if (res) {
+ knet_log_printf (LOGSYS_LEVEL_ERROR, "Cannot get knet node list for shutdown: %s", strerror(errno));
+@@ -561,7 +569,7 @@ int totemknet_finalize (
+ goto finalise_error;
+ }
+
+- /* Tidily shut down all nodes & links. This ensures that the LEAVE message will be sent */
++ /* Tidily shut down all nodes & links. */
+ for (i=0; i<num_nodes; i++) {
+
+ res = knet_link_get_link_list(instance->knet_handle, nodes[i], links, &num_links);
+@@ -586,10 +594,6 @@ int totemknet_finalize (
+ }
+
+ finalise_error:
+- res = knet_handle_setfwd(instance->knet_handle, 0);
+- if (res) {
+- knet_log_printf (LOGSYS_LEVEL_CRIT, "totemknet: knet_handle_setfwd failed: %s", strerror(errno));
+- }
+ res = knet_handle_free(instance->knet_handle);
+ if (res) {
+ knet_log_printf (LOGSYS_LEVEL_CRIT, "totemknet: knet_handle_free failed: %s", strerror(errno));
diff --git a/debian/patches/0010-logging-Add-CS_PRI_NODE_ID-and-CS_PRI_RING_ID.patch b/debian/patches/0010-logging-Add-CS_PRI_NODE_ID-and-CS_PRI_RING_ID.patch
new file mode 100644
index 0000000..2eb0794
--- /dev/null
+++ b/debian/patches/0010-logging-Add-CS_PRI_NODE_ID-and-CS_PRI_RING_ID.patch
@@ -0,0 +1,1224 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jan Friesse <jfriesse at redhat.com>
+Date: Tue, 2 Jul 2019 10:36:30 +0200
+Subject: [PATCH] logging: Add CS_PRI_NODE_ID and CS_PRI_RING_ID
+
+Previously node id was logged ether as a %d (most often), %u, %x or
+PRI.32 and ring id ether as %lld, %llx with various separators (., :, /)
+between rep nodeid and seq. This seems to cause confusion.
+
+This patch adds macros CS_PRI_NODE_ID, CS_PRI_RING_ID and
+CS_PRI_RING_ID_SEQ (CS prefix = corosync, PRI modeled in spirit of
+inttypes.h PRIx32) and makes code use them.
+
+Signed-off-by: Jan Friesse <jfriesse at redhat.com>
+Reviewed-by: Christine Caulfield <ccaulfie at redhat.com>
+(cherry picked from commit 5731af278288bf2a27d2a71a8478066ca6047ba7)
+Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
+---
+ exec/cfg.c | 8 +++---
+ exec/cmap.c | 2 +-
+ exec/cpg.c | 10 ++++----
+ exec/main.c | 8 +++---
+ exec/totemconfig.c | 2 +-
+ exec/totemknet.c | 36 +++++++++++++--------------
+ exec/totemsrp.c | 47 ++++++++++++++++++------------------
+ exec/votequorum.c | 32 ++++++++++++------------
+ exec/vsf_quorum.c | 2 +-
+ include/corosync/corotypes.h | 3 +++
+ test/cpghum.c | 11 +++++----
+ test/testcpg.c | 20 +++++++--------
+ test/testcpg2.c | 7 +++---
+ test/testcpgzc.c | 11 +++++----
+ test/testquorum.c | 5 ++--
+ test/testvotequorum1.c | 6 ++---
+ test/testvotequorum2.c | 2 +-
+ test/testzcgc.c | 9 ++++---
+ tools/corosync-cfgtool.c | 4 +--
+ tools/corosync-notifyd.c | 14 +++++------
+ tools/corosync-quorumtool.c | 12 ++++-----
+ vqsim/vqmain.c | 24 +++++++++---------
+ vqsim/vqsim_vq_engine.c | 4 +--
+ 23 files changed, 143 insertions(+), 136 deletions(-)
+
+diff --git a/exec/cfg.c b/exec/cfg.c
+index f42cb608..28ba58d0 100644
+--- a/exec/cfg.c
++++ b/exec/cfg.c
+@@ -514,11 +514,11 @@ static void message_handler_req_exec_cfg_killnode (
+ cs_name_t reason;
+
+ ENTER();
+- log_printf(LOGSYS_LEVEL_DEBUG, "request to kill node %d(us=%d)",
++ log_printf(LOGSYS_LEVEL_DEBUG, "request to kill node " CS_PRI_NODE_ID " (us=" CS_PRI_NODE_ID ")",
+ req_exec_cfg_killnode->nodeid, api->totem_nodeid_get());
+ if (req_exec_cfg_killnode->nodeid == api->totem_nodeid_get()) {
+ marshall_from_mar_name_t(&reason, &req_exec_cfg_killnode->reason);
+- log_printf(LOGSYS_LEVEL_NOTICE, "Killed by node %d: %s",
++ log_printf(LOGSYS_LEVEL_NOTICE, "Killed by node " CS_PRI_NODE_ID " : %s",
+ nodeid, reason.value);
+ corosync_fatal_error(COROSYNC_FATAL_ERROR_EXIT);
+ }
+@@ -534,7 +534,7 @@ static void message_handler_req_exec_cfg_shutdown (
+ {
+ ENTER();
+
+- log_printf(LOGSYS_LEVEL_NOTICE, "Node %d was shut down by sysadmin", nodeid);
++ log_printf(LOGSYS_LEVEL_NOTICE, "Node " CS_PRI_NODE_ID " was shut down by sysadmin", nodeid);
+ if (nodeid == api->totem_nodeid_get()) {
+ api->shutdown_request();
+ }
+@@ -674,7 +674,7 @@ static void message_handler_req_exec_cfg_reload_config (
+
+ ENTER();
+
+- log_printf(LOGSYS_LEVEL_NOTICE, "Config reload requested by node %d", nodeid);
++ log_printf(LOGSYS_LEVEL_NOTICE, "Config reload requested by node " CS_PRI_NODE_ID, nodeid);
+
+ /*
+ * Set up a new hashtable as a staging area.
+diff --git a/exec/cmap.c b/exec/cmap.c
+index 51656706..f3e36371 100644
+--- a/exec/cmap.c
++++ b/exec/cmap.c
+@@ -1050,7 +1050,7 @@ static void message_handler_req_exec_cmap_mcast_reason_sync_nv(
+ }
+ }
+
+- qb_log(LOG_TRACE, "Received config version %"PRIu64" from node %x", config_version, nodeid);
++ qb_log(LOG_TRACE, "Received config version %"PRIu64" from node " CS_PRI_NODE_ID, config_version, nodeid);
+
+ if (nodeid != api->totem_nodeid_get() &&
+ config_version > cmap_highest_config_version_received) {
+diff --git a/exec/cpg.c b/exec/cpg.c
+index 98a16a60..34283c03 100644
+--- a/exec/cpg.c
++++ b/exec/cpg.c
+@@ -1283,7 +1283,7 @@ static void message_handler_req_exec_cpg_downlist_old (
+ const void *message,
+ unsigned int nodeid)
+ {
+- log_printf (LOGSYS_LEVEL_WARNING, "downlist OLD from node 0x%x",
++ log_printf (LOGSYS_LEVEL_WARNING, "downlist OLD from node " CS_PRI_NODE_ID,
+ nodeid);
+ }
+
+@@ -1304,7 +1304,7 @@ static void message_handler_req_exec_cpg_procjoin (
+ {
+ const struct req_exec_cpg_procjoin *req_exec_cpg_procjoin = message;
+
+- log_printf(LOGSYS_LEVEL_DEBUG, "got procjoin message from cluster node 0x%x (%s) for pid %u",
++ log_printf(LOGSYS_LEVEL_DEBUG, "got procjoin message from cluster node " CS_PRI_NODE_ID " (%s) for pid %u",
+ nodeid,
+ api->totem_ifaces_print(nodeid),
+ (unsigned int)req_exec_cpg_procjoin->pid);
+@@ -1320,7 +1320,7 @@ static void message_handler_req_exec_cpg_procleave (
+ {
+ const struct req_exec_cpg_procjoin *req_exec_cpg_procjoin = message;
+
+- log_printf(LOGSYS_LEVEL_DEBUG, "got procleave message from cluster node 0x%x (%s) for pid %u",
++ log_printf(LOGSYS_LEVEL_DEBUG, "got procleave message from cluster node " CS_PRI_NODE_ID " (%s) for pid %u",
+ nodeid,
+ api->totem_ifaces_print(nodeid),
+ (unsigned int)req_exec_cpg_procjoin->pid);
+@@ -1341,7 +1341,7 @@ static void message_handler_req_exec_cpg_joinlist (
+ const struct join_list_entry *jle = (const struct join_list_entry *)(message + sizeof(struct qb_ipc_response_header));
+ struct joinlist_msg *stored_msg;
+
+- log_printf(LOGSYS_LEVEL_DEBUG, "got joinlist message from node 0x%x",
++ log_printf(LOGSYS_LEVEL_DEBUG, "got joinlist message from node " CS_PRI_NODE_ID,
+ nodeid);
+
+ while ((const char*)jle < message + res->size) {
+@@ -1422,7 +1422,7 @@ static void message_handler_req_exec_cpg_partial_mcast (
+ struct iovec iovec[2];
+ int known_node = 0;
+
+- log_printf(LOGSYS_LEVEL_DEBUG, "Got fragmented message from node %d, size = %d bytes\n", nodeid, msglen);
++ log_printf(LOGSYS_LEVEL_DEBUG, "Got fragmented message from node " CS_PRI_NODE_ID ", size = %d bytes\n", nodeid, msglen);
+
+ res_lib_cpg_mcast.header.id = MESSAGE_RES_CPG_PARTIAL_DELIVER_CALLBACK;
+ res_lib_cpg_mcast.header.size = sizeof(res_lib_cpg_mcast) + msglen;
+diff --git a/exec/main.c b/exec/main.c
+index 06a519c9..7a471a16 100644
+--- a/exec/main.c
++++ b/exec/main.c
+@@ -692,18 +692,18 @@ static void corosync_ring_id_store (
+ }
+ if (fd == -1) {
+ LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR,
+- "Couldn't store new ring id %llx to stable storage",
+- memb_ring_id->seq);
++ "Couldn't store new ring id " CS_PRI_RING_ID_SEQ " to stable storage",
++ memb_ring_id->seq);
+
+ corosync_exit_error (COROSYNC_DONE_STORE_RINGID);
+ }
+ log_printf (LOGSYS_LEVEL_DEBUG,
+- "Storing new sequence id for ring %llx", memb_ring_id->seq);
++ "Storing new sequence id for ring " CS_PRI_RING_ID_SEQ, memb_ring_id->seq);
+ res = write (fd, &memb_ring_id->seq, sizeof(memb_ring_id->seq));
+ close (fd);
+ if (res != sizeof(memb_ring_id->seq)) {
+ LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR,
+- "Couldn't store new ring id %llx to stable storage",
++ "Couldn't store new ring id " CS_PRI_RING_ID_SEQ " to stable storage",
+ memb_ring_id->seq);
+
+ corosync_exit_error (COROSYNC_DONE_STORE_RINGID);
+diff --git a/exec/totemconfig.c b/exec/totemconfig.c
+index 67a61ac2..3af25239 100644
+--- a/exec/totemconfig.c
++++ b/exec/totemconfig.c
+@@ -1338,7 +1338,7 @@ static int put_nodelist_members_to_config(struct totem_config *totem_config, int
+ }
+
+ log_printf(LOGSYS_LEVEL_DEBUG,
+- "Generated nodeid = 0x%x for %s", nodeid, str);
++ "Generated nodeid = " CS_PRI_NODE_ID " for %s", nodeid, str);
+ free(str);
+ }
+ }
+diff --git a/exec/totemknet.c b/exec/totemknet.c
+index e1ea8515..38b69e7b 100644
+--- a/exec/totemknet.c
++++ b/exec/totemknet.c
+@@ -324,7 +324,7 @@ static void host_change_callback_fn(void *private_data, knet_node_id_t host_id,
+ struct totemknet_instance *instance = (struct totemknet_instance *)private_data;
+
+ // TODO: what? if anything.
+- knet_log_printf (LOGSYS_LEVEL_DEBUG, "Knet host change callback. nodeid: %d reachable: %d", host_id, reachable);
++ knet_log_printf (LOGSYS_LEVEL_DEBUG, "Knet host change callback. nodeid: " CS_PRI_NODE_ID " reachable: %d", host_id, reachable);
+ }
+
+ static void pmtu_change_callback_fn(void *private_data, unsigned int data_mtu)
+@@ -574,22 +574,22 @@ int totemknet_finalize (
+
+ res = knet_link_get_link_list(instance->knet_handle, nodes[i], links, &num_links);
+ if (res) {
+- knet_log_printf (LOGSYS_LEVEL_ERROR, "Cannot get knet link list for node %d: %s", nodes[i], strerror(errno));
++ knet_log_printf (LOGSYS_LEVEL_ERROR, "Cannot get knet link list for node " CS_PRI_NODE_ID ": %s", nodes[i], strerror(errno));
+ goto finalise_error;
+ }
+ for (j=0; j<num_links; j++) {
+ res = knet_link_set_enable(instance->knet_handle, nodes[i], links[j], 0);
+ if (res) {
+- knet_log_printf (LOGSYS_LEVEL_ERROR, "totemknet: knet_link_set_enable(node %d, link %d) failed: %s", nodes[i], links[j], strerror(errno));
++ knet_log_printf (LOGSYS_LEVEL_ERROR, "totemknet: knet_link_set_enable(node " CS_PRI_NODE_ID ", link %d) failed: %s", nodes[i], links[j], strerror(errno));
+ }
+ res = knet_link_clear_config(instance->knet_handle, nodes[i], links[j]);
+ if (res) {
+- knet_log_printf (LOGSYS_LEVEL_ERROR, "totemknet: knet_link_clear_config(node %d, link %d) failed: %s", nodes[i], links[j], strerror(errno));
++ knet_log_printf (LOGSYS_LEVEL_ERROR, "totemknet: knet_link_clear_config(node " CS_PRI_NODE_ID ", link %d) failed: %s", nodes[i], links[j], strerror(errno));
+ }
+ }
+ res = knet_host_remove(instance->knet_handle, nodes[i]);
+ if (res) {
+- knet_log_printf (LOGSYS_LEVEL_ERROR, "totemknet: knet_host_remove(node %d) failed: %s", nodes[i], strerror(errno));
++ knet_log_printf (LOGSYS_LEVEL_ERROR, "totemknet: knet_host_remove(node " CS_PRI_NODE_ID ") failed: %s", nodes[i], strerror(errno));
+ }
+ }
+
+@@ -814,17 +814,17 @@ static void totemknet_refresh_config(
+ instance->totem_config->interfaces[link_no].knet_ping_timeout,
+ instance->totem_config->interfaces[link_no].knet_ping_precision);
+ if (err) {
+- KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_ping_timers for node %d link %d failed", host_ids[i], link_no);
++ KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_ping_timers for node " CS_PRI_NODE_ID " link %d failed", host_ids[i], link_no);
+ }
+ err = knet_link_set_pong_count(instance->knet_handle, host_ids[i], link_no,
+ instance->totem_config->interfaces[link_no].knet_pong_count);
+ if (err) {
+- KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_pong_count for node %d link %d failed",host_ids[i], link_no);
++ KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_pong_count for node " CS_PRI_NODE_ID " link %d failed",host_ids[i], link_no);
+ }
+ err = knet_link_set_priority(instance->knet_handle, host_ids[i], link_no,
+ instance->totem_config->interfaces[link_no].knet_link_priority);
+ if (err) {
+- KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_priority for node %d link %d failed", host_ids[i], link_no);
++ KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_priority for node " CS_PRI_NODE_ID " link %d failed", host_ids[i], link_no);
+ }
+
+ }
+@@ -1267,8 +1267,8 @@ int totemknet_member_add (
+ }
+ }
+
+- knet_log_printf (LOGSYS_LEVEL_DEBUG, "knet: member_add: %d (%s), link=%d", member->nodeid, totemip_print(member), link_no);
+- knet_log_printf (LOGSYS_LEVEL_DEBUG, "knet: local: %d (%s)", local->nodeid, totemip_print(local));
++ knet_log_printf (LOGSYS_LEVEL_DEBUG, "knet: member_add: " CS_PRI_NODE_ID " (%s), link=%d", member->nodeid, totemip_print(member), link_no);
++ knet_log_printf (LOGSYS_LEVEL_DEBUG, "knet: local: " CS_PRI_NODE_ID " (%s)", local->nodeid, totemip_print(local));
+
+
+ /* Only add the host if it doesn't already exist in knet */
+@@ -1290,7 +1290,7 @@ int totemknet_member_add (
+ return -1;
+ }
+ } else {
+- knet_log_printf (LOGSYS_LEVEL_DEBUG, "nodeid %d already added", member->nodeid);
++ knet_log_printf (LOGSYS_LEVEL_DEBUG, "nodeid " CS_PRI_NODE_ID " already added", member->nodeid);
+ }
+
+
+@@ -1329,7 +1329,7 @@ int totemknet_member_add (
+ err = knet_link_set_priority(instance->knet_handle, member->nodeid, link_no,
+ instance->totem_config->interfaces[link_no].knet_link_priority);
+ if (err) {
+- KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_priority for nodeid %d, link %d failed", member->nodeid, link_no);
++ KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_priority for nodeid " CS_PRI_NODE_ID ", link %d failed", member->nodeid, link_no);
+ }
+
+ /* ping timeouts maybe 0 here for a newly added interface so we leave this till later, it will
+@@ -1340,18 +1340,18 @@ int totemknet_member_add (
+ instance->totem_config->interfaces[link_no].knet_ping_timeout,
+ instance->totem_config->interfaces[link_no].knet_ping_precision);
+ if (err) {
+- KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_ping_timers for nodeid %d, link %d failed", member->nodeid, link_no);
++ KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_ping_timers for nodeid " CS_PRI_NODE_ID ", link %d failed", member->nodeid, link_no);
+ }
+ err = knet_link_set_pong_count(instance->knet_handle, member->nodeid, link_no,
+ instance->totem_config->interfaces[link_no].knet_pong_count);
+ if (err) {
+- KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_pong_count for nodeid %d, link %d failed", member->nodeid, link_no);
++ KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_pong_count for nodeid " CS_PRI_NODE_ID ", link %d failed", member->nodeid, link_no);
+ }
+ }
+
+ err = knet_link_set_enable(instance->knet_handle, member->nodeid, link_no, 1);
+ if (err) {
+- KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_enable for nodeid %d, link %d failed", member->nodeid, link_no);
++ KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set_enable for nodeid " CS_PRI_NODE_ID ", link %d failed", member->nodeid, link_no);
+ return -1;
+ }
+
+@@ -1370,7 +1370,7 @@ int totemknet_member_remove (
+ uint8_t link_list[KNET_MAX_LINK];
+ size_t num_links;
+
+- knet_log_printf (LOGSYS_LEVEL_DEBUG, "knet: member_remove: %d, link=%d", token_target->nodeid, link_no);
++ knet_log_printf (LOGSYS_LEVEL_DEBUG, "knet: member_remove: " CS_PRI_NODE_ID ", link=%d", token_target->nodeid, link_no);
+
+ /* Don't remove the link with the loopback on it until we shut down */
+ if (token_target->nodeid == instance->our_nodeid) {
+@@ -1383,13 +1383,13 @@ int totemknet_member_remove (
+ /* Remove the link first */
+ res = knet_link_set_enable(instance->knet_handle, token_target->nodeid, link_no, 0);
+ if (res != 0) {
+- KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set enable(off) for nodeid %d, link %d failed", token_target->nodeid, link_no);
++ KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_set enable(off) for nodeid " CS_PRI_NODE_ID ", link %d failed", token_target->nodeid, link_no);
+ return res;
+ }
+
+ res = knet_link_clear_config(instance->knet_handle, token_target->nodeid, link_no);
+ if (res != 0) {
+- KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_clear_config for nodeid %d, link %d failed", token_target->nodeid, link_no);
++ KNET_LOGSYS_PERROR(errno, LOGSYS_LEVEL_ERROR, "knet_link_clear_config for nodeid " CS_PRI_NODE_ID ", link %d failed", token_target->nodeid, link_no);
+ return res;
+ }
+
+diff --git a/exec/totemsrp.c b/exec/totemsrp.c
+index a48d97bc..e988c531 100644
+--- a/exec/totemsrp.c
++++ b/exec/totemsrp.c
+@@ -1415,9 +1415,9 @@ static void memb_set_log(
+
+ for (i = 0; i < list_entries; i++) {
+ if (i == 0) {
+- snprintf(int_buf, sizeof(int_buf), "%u", list[i].nodeid);
++ snprintf(int_buf, sizeof(int_buf), CS_PRI_NODE_ID, list[i].nodeid);
+ } else {
+- snprintf(int_buf, sizeof(int_buf), ",%u", list[i].nodeid);
++ snprintf(int_buf, sizeof(int_buf), "," CS_PRI_NODE_ID, list[i].nodeid);
+ }
+
+ if (strlen(list_str) + strlen(int_buf) >= sizeof(list_str)) {
+@@ -1471,7 +1471,7 @@ static void my_leave_memb_set(
+ instance->my_leave_memb_entries++;
+ } else {
+ log_printf (instance->totemsrp_log_level_warning,
+- "Cannot set LEAVE nodeid=%d", nodeid);
++ "Cannot set LEAVE nodeid=" CS_PRI_NODE_ID, nodeid);
+ }
+ }
+
+@@ -1871,8 +1871,8 @@ static void deliver_messages_from_recovery_to_regular (struct totemsrp_instance
+ }
+
+ log_printf (instance->totemsrp_log_level_debug,
+- "comparing if ring id is for this processors old ring seqno %d",
+- mcast->seq);
++ "comparing if ring id is for this processors old ring seqno " CS_PRI_RING_ID_SEQ,
++ (uint64_t)mcast->seq);
+
+ /*
+ * Only add this message to the regular sort
+@@ -1892,7 +1892,7 @@ static void deliver_messages_from_recovery_to_regular (struct totemsrp_instance
+ }
+ } else {
+ log_printf (instance->totemsrp_log_level_debug,
+- "-not adding msg with seq no %x", mcast->seq);
++ "-not adding msg with seq no " CS_PRI_RING_ID_SEQ, (uint64_t)mcast->seq);
+ }
+ }
+ }
+@@ -2056,7 +2056,7 @@ static void memb_state_operational_enter (struct totemsrp_instance *instance)
+ int sptr = 0;
+ sptr += snprintf(joined_node_msg, sizeof(joined_node_msg)-sptr, " joined:");
+ for (i=0; i< joined_list_entries; i++) {
+- sptr += snprintf(joined_node_msg+sptr, sizeof(joined_node_msg)-sptr, " %u", joined_list_totemip[i]);
++ sptr += snprintf(joined_node_msg+sptr, sizeof(joined_node_msg)-sptr, " " CS_PRI_NODE_ID, joined_list_totemip[i]);
+ }
+ }
+ else {
+@@ -2068,14 +2068,14 @@ static void memb_state_operational_enter (struct totemsrp_instance *instance)
+ int sptr2 = 0;
+ sptr += snprintf(left_node_msg, sizeof(left_node_msg)-sptr, " left:");
+ for (i=0; i< instance->my_left_memb_entries; i++) {
+- sptr += snprintf(left_node_msg+sptr, sizeof(left_node_msg)-sptr, " %u", left_list[i]);
++ sptr += snprintf(left_node_msg+sptr, sizeof(left_node_msg)-sptr, " " CS_PRI_NODE_ID, left_list[i]);
+ }
+ for (i=0; i< instance->my_left_memb_entries; i++) {
+ if (my_leave_memb_match(instance, left_list[i]) == 0) {
+ if (sptr2 == 0) {
+ sptr2 += snprintf(failed_node_msg, sizeof(failed_node_msg)-sptr2, " failed:");
+ }
+- sptr2 += snprintf(failed_node_msg+sptr2, sizeof(left_node_msg)-sptr2, " %u", left_list[i]);
++ sptr2 += snprintf(failed_node_msg+sptr2, sizeof(left_node_msg)-sptr2, " " CS_PRI_NODE_ID, left_list[i]);
+ }
+ }
+ if (sptr2 == 0) {
+@@ -2092,9 +2092,9 @@ static void memb_state_operational_enter (struct totemsrp_instance *instance)
+ log_printf (instance->totemsrp_log_level_debug,
+ "entering OPERATIONAL state.");
+ log_printf (instance->totemsrp_log_level_notice,
+- "A new membership (%u:%lld) was formed. Members%s%s",
++ "A new membership (" CS_PRI_RING_ID ") was formed. Members%s%s",
+ instance->my_ring_id.rep,
+- instance->my_ring_id.seq,
++ (uint64_t)instance->my_ring_id.seq,
+ joined_node_msg,
+ left_node_msg);
+
+@@ -2313,15 +2313,14 @@ static void memb_state_recovery_enter (
+
+ for (i = 0; i < instance->my_trans_memb_entries; i++) {
+ log_printf (instance->totemsrp_log_level_debug,
+- "TRANS [%d] member %u:", i, instance->my_trans_memb_list[i].nodeid);
++ "TRANS [%d] member " CS_PRI_NODE_ID ":", i, instance->my_trans_memb_list[i].nodeid);
+ }
+ for (i = 0; i < instance->my_new_memb_entries; i++) {
+ log_printf (instance->totemsrp_log_level_debug,
+- "position [%d] member %u:", i, addr[i].nodeid);
++ "position [%d] member " CS_PRI_NODE_ID ":", i, addr[i].nodeid);
+ log_printf (instance->totemsrp_log_level_debug,
+- "previous ring seq %llx rep %u",
+- memb_list[i].ring_id.seq,
+- memb_list[i].ring_id.rep);
++ "previous ringid (" CS_PRI_RING_ID ")",
++ memb_list[i].ring_id.rep, (uint64_t)memb_list[i].ring_id.seq);
+
+ log_printf (instance->totemsrp_log_level_debug,
+ "aru %x high delivered %x received flag %d",
+@@ -4292,9 +4291,9 @@ static int message_handler_mcast (
+ }
+
+ log_printf (instance->totemsrp_log_level_trace,
+- "Received ringid(%u:%lld) seq %x",
++ "Received ringid (" CS_PRI_RING_ID ") seq %x",
+ mcast_header.ring_id.rep,
+- mcast_header.ring_id.seq,
++ (uint64_t)mcast_header.ring_id.seq,
+ mcast_header.seq);
+
+ /*
+@@ -4423,20 +4422,20 @@ static void memb_join_process (
+ if (instance->flushing) {
+ if (memb_join->header.nodeid == LEAVE_DUMMY_NODEID) {
+ log_printf (instance->totemsrp_log_level_warning,
+- "Discarding LEAVE message during flush, nodeid=%u",
++ "Discarding LEAVE message during flush, nodeid=" CS_PRI_NODE_ID,
+ memb_join->failed_list_entries > 0 ? failed_list[memb_join->failed_list_entries - 1 ].nodeid : LEAVE_DUMMY_NODEID);
+ if (memb_join->failed_list_entries > 0) {
+ my_leave_memb_set(instance, failed_list[memb_join->failed_list_entries - 1 ].nodeid);
+ }
+ } else {
+ log_printf (instance->totemsrp_log_level_warning,
+- "Discarding JOIN message during flush, nodeid=%d", memb_join->header.nodeid);
++ "Discarding JOIN message during flush, nodeid=" CS_PRI_NODE_ID, memb_join->header.nodeid);
+ }
+ return;
+ } else {
+ if (memb_join->header.nodeid == LEAVE_DUMMY_NODEID) {
+ log_printf (instance->totemsrp_log_level_debug,
+- "Received LEAVE message from %u", memb_join->failed_list_entries > 0 ? failed_list[memb_join->failed_list_entries - 1 ].nodeid : LEAVE_DUMMY_NODEID);
++ "Received LEAVE message from " CS_PRI_NODE_ID, memb_join->failed_list_entries > 0 ? failed_list[memb_join->failed_list_entries - 1 ].nodeid : LEAVE_DUMMY_NODEID);
+ if (memb_join->failed_list_entries > 0) {
+ my_leave_memb_set(instance, failed_list[memb_join->failed_list_entries - 1 ].nodeid);
+ }
+@@ -5064,9 +5063,9 @@ void main_iface_change_fn (
+ instance->token_ring_id_seq = instance->my_ring_id.seq;
+ log_printf (
+ instance->totemsrp_log_level_debug,
+- "Created or loaded sequence id %llx.%u for this ring.",
+- instance->my_ring_id.seq,
+- instance->my_ring_id.rep);
++ "Created or loaded sequence id " CS_PRI_RING_ID " for this ring.",
++ instance->my_ring_id.rep,
++ (uint64_t)instance->my_ring_id.seq);
+
+ if (instance->totemsrp_service_ready_fn) {
+ instance->totemsrp_service_ready_fn ();
+diff --git a/exec/votequorum.c b/exec/votequorum.c
+index 6c6e3b12..400c5180 100644
+--- a/exec/votequorum.c
++++ b/exec/votequorum.c
+@@ -475,7 +475,7 @@ static struct cluster_node *allocate_node(unsigned int nodeid)
+ * this should never happen
+ */
+ if (!cl) {
+- log_printf(LOGSYS_LEVEL_CRIT, "Unable to find memory for node %u data!!", nodeid);
++ log_printf(LOGSYS_LEVEL_CRIT, "Unable to find memory for node " CS_PRI_NODE_ID " data!!", nodeid);
+ goto out;
+ }
+ qb_list_del(tmp);
+@@ -538,7 +538,7 @@ static void get_lowest_node_id(void)
+ lowest_node_id = node->node_id;
+ }
+ }
+- log_printf(LOGSYS_LEVEL_DEBUG, "lowest node id: %d us: %d", lowest_node_id, us->node_id);
++ log_printf(LOGSYS_LEVEL_DEBUG, "lowest node id: " CS_PRI_NODE_ID " us: " CS_PRI_NODE_ID, lowest_node_id, us->node_id);
+ icmap_set_uint32("runtime.votequorum.lowest_node_id", lowest_node_id);
+
+ LEAVE();
+@@ -560,7 +560,7 @@ static void get_highest_node_id(void)
+ highest_node_id = node->node_id;
+ }
+ }
+- log_printf(LOGSYS_LEVEL_DEBUG, "highest node id: %d us: %d", highest_node_id, us->node_id);
++ log_printf(LOGSYS_LEVEL_DEBUG, "highest node id: " CS_PRI_NODE_ID " us: " CS_PRI_NODE_ID, highest_node_id, us->node_id);
+ icmap_set_uint32("runtime.votequorum.highest_node_id", highest_node_id);
+
+ LEAVE();
+@@ -664,7 +664,7 @@ static int check_auto_tie_breaker(void)
+ */
+ for (j=0; j<i; j++) {
+ if (is_in_nodelist(atb_nodelist[j], previous_quorum_members, previous_quorum_members_entries)) {
+- log_printf(LOGSYS_LEVEL_DEBUG, "ATB_LIST found node %d in previous partition but not here, quorum denied", atb_nodelist[j]);
++ log_printf(LOGSYS_LEVEL_DEBUG, "ATB_LIST found node " CS_PRI_NODE_ID " in previous partition but not here, quorum denied", atb_nodelist[j]);
+ LEAVE();
+ return 0;
+ }
+@@ -674,7 +674,7 @@ static int check_auto_tie_breaker(void)
+ * None of the other list nodes were in the previous partition, if there
+ * are enough votes, we can be quorate
+ */
+- log_printf(LOGSYS_LEVEL_DEBUG, "ATB_LIST found node %d in current partition, we can be quorate", atb_nodelist[i]);
++ log_printf(LOGSYS_LEVEL_DEBUG, "ATB_LIST found node " CS_PRI_NODE_ID " in current partition, we can be quorate", atb_nodelist[i]);
+ LEAVE();
+ return 1;
+ }
+@@ -920,7 +920,7 @@ static int calculate_quorum(int allow_decrease, unsigned int max_expected, unsig
+ qb_list_for_each(nodelist, &cluster_members_list) {
+ node = qb_list_entry(nodelist, struct cluster_node, list);
+
+- log_printf(LOGSYS_LEVEL_DEBUG, "node %u state=%d, votes=%u, expected=%u",
++ log_printf(LOGSYS_LEVEL_DEBUG, "node " CS_PRI_NODE_ID " state=%d, votes=%u, expected=%u",
+ node->node_id, node->state, node->votes, node->expected_votes);
+
+ if (node->state == NODESTATE_MEMBER) {
+@@ -1819,7 +1819,7 @@ static int votequorum_exec_send_nodelist_notification(void *conn, uint64_t conte
+
+ ENTER();
+
+- log_printf(LOGSYS_LEVEL_DEBUG, "Sending nodelist callback. ring_id = %d/%lld", quorum_ringid.nodeid, quorum_ringid.seq);
++ log_printf(LOGSYS_LEVEL_DEBUG, "Sending nodelist callback. ring_id = " CS_PRI_RING_ID, quorum_ringid.nodeid, quorum_ringid.seq);
+
+ size = sizeof(struct res_lib_votequorum_nodelist_notification) + sizeof(uint32_t) * quorum_members_entries;
+
+@@ -1897,7 +1897,7 @@ static void message_handler_req_exec_votequorum_qdevice_reconfigure (
+
+ ENTER();
+
+- log_printf(LOGSYS_LEVEL_DEBUG, "Received qdevice name change req from node %u [from: %s to: %s]",
++ log_printf(LOGSYS_LEVEL_DEBUG, "Received qdevice name change req from node " CS_PRI_NODE_ID " [from: %s to: %s]",
+ nodeid,
+ req_exec_quorum_qdevice_reconfigure->oldname,
+ req_exec_quorum_qdevice_reconfigure->newname);
+@@ -1940,7 +1940,7 @@ static void message_handler_req_exec_votequorum_qdevice_reg (
+
+ ENTER();
+
+- log_printf(LOGSYS_LEVEL_DEBUG, "Received qdevice op %u req from node %u [%s]",
++ log_printf(LOGSYS_LEVEL_DEBUG, "Received qdevice op %u req from node " CS_PRI_NODE_ID " [%s]",
+ req_exec_quorum_qdevice_reg->operation,
+ nodeid, req_exec_quorum_qdevice_reg->qdevice_name);
+
+@@ -2052,8 +2052,8 @@ static void message_handler_req_exec_votequorum_nodeinfo (
+
+ ENTER();
+
+- log_printf(LOGSYS_LEVEL_DEBUG, "got nodeinfo message from cluster node %u", sender_nodeid);
+- log_printf(LOGSYS_LEVEL_DEBUG, "nodeinfo message[%u]: votes: %d, expected: %d flags: %d",
++ log_printf(LOGSYS_LEVEL_DEBUG, "got nodeinfo message from cluster node " CS_PRI_NODE_ID, sender_nodeid);
++ log_printf(LOGSYS_LEVEL_DEBUG, "nodeinfo message[" CS_PRI_NODE_ID "]: votes: %d, expected: %d flags: %d",
+ nodeid,
+ req_exec_quorum_nodeinfo->votes,
+ req_exec_quorum_nodeinfo->expected_votes,
+@@ -2174,7 +2174,7 @@ static void message_handler_req_exec_votequorum_reconfigure (
+
+ ENTER();
+
+- log_printf(LOGSYS_LEVEL_DEBUG, "got reconfigure message from cluster node %u for %u",
++ log_printf(LOGSYS_LEVEL_DEBUG, "got reconfigure message from cluster node " CS_PRI_NODE_ID " for " CS_PRI_NODE_ID,
+ nodeid, req_exec_quorum_reconfigure->nodeid);
+
+ switch(req_exec_quorum_reconfigure->param)
+@@ -2201,7 +2201,7 @@ static void message_handler_req_exec_votequorum_reconfigure (
+
+ case VOTEQUORUM_RECONFIG_PARAM_CANCEL_WFA:
+ update_wait_for_all_status(0);
+- log_printf(LOGSYS_LEVEL_INFO, "wait_for_all_status reset by user on node %d.",
++ log_printf(LOGSYS_LEVEL_INFO, "wait_for_all_status reset by user on node " CS_PRI_NODE_ID ".",
+ req_exec_quorum_reconfigure->nodeid);
+ recalculate_quorum(0, 0);
+
+@@ -2551,7 +2551,7 @@ static void message_handler_req_lib_votequorum_getinfo (void *conn, const void *
+
+ ENTER();
+
+- log_printf(LOGSYS_LEVEL_DEBUG, "got getinfo request on %p for node %u", conn, req_lib_votequorum_getinfo->nodeid);
++ log_printf(LOGSYS_LEVEL_DEBUG, "got getinfo request on %p for node " CS_PRI_NODE_ID, conn, req_lib_votequorum_getinfo->nodeid);
+
+ if (nodeid == VOTEQUORUM_QDEVICE_NODEID) {
+ nodeid = us->node_id;
+@@ -2953,8 +2953,8 @@ static void message_handler_req_lib_votequorum_qdevice_poll (void *conn,
+ if (us->flags & NODE_FLAGS_QDEVICE_REGISTERED) {
+ if (!(req_lib_votequorum_qdevice_poll->ring_id.nodeid == quorum_ringid.nodeid &&
+ req_lib_votequorum_qdevice_poll->ring_id.seq == quorum_ringid.seq)) {
+- log_printf(LOGSYS_LEVEL_DEBUG, "Received poll ring id (%u.%"PRIu64") != last sync "
+- "ring id (%u.%"PRIu64"). Ignoring poll call.",
++ log_printf(LOGSYS_LEVEL_DEBUG, "Received poll ring id (" CS_PRI_RING_ID ") != last sync "
++ "ring id (" CS_PRI_RING_ID "). Ignoring poll call.",
+ req_lib_votequorum_qdevice_poll->ring_id.nodeid, req_lib_votequorum_qdevice_poll->ring_id.seq,
+ quorum_ringid.nodeid, quorum_ringid.seq);
+ error = CS_ERR_MESSAGE_ERROR;
+diff --git a/exec/vsf_quorum.c b/exec/vsf_quorum.c
+index f93eaf5b..f62ffa81 100644
+--- a/exec/vsf_quorum.c
++++ b/exec/vsf_quorum.c
+@@ -122,7 +122,7 @@ static void log_view_list(const unsigned int *view_list, size_t view_list_entrie
+ memset(view_buf, 0, len);
+
+ for (; i < total; i++) {
+- ret = snprintf(view_buf + pos, len - pos, " %u", view_list[i]);
++ ret = snprintf(view_buf + pos, len - pos, " " CS_PRI_NODE_ID, view_list[i]);
+ if (ret >= len - pos)
+ break;
+ pos += ret;
+diff --git a/include/corosync/corotypes.h b/include/corosync/corotypes.h
+index c8ef1d43..12b61eb8 100644
+--- a/include/corosync/corotypes.h
++++ b/include/corosync/corotypes.h
+@@ -56,6 +56,9 @@ typedef int64_t cs_time_t;
+ #define CS_TIME_END ((cs_time_t)0x7FFFFFFFFFFFFFFFULL)
+ #define CS_MAX(x, y) (((x) > (y)) ? (x) : (y))
+
++#define CS_PRI_NODE_ID "%" PRIu32
++#define CS_PRI_RING_ID_SEQ "%" PRIx64
++#define CS_PRI_RING_ID "%" PRIx32 ".%" PRIx64
+ /**
+ * @brief The cs_name_t struct
+ */
+diff --git a/test/cpghum.c b/test/cpghum.c
+index 3cc2119d..7c007d0c 100644
+--- a/test/cpghum.c
++++ b/test/cpghum.c
+@@ -44,6 +44,7 @@
+ #include <ctype.h>
+ #include <syslog.h>
+ #include <stdarg.h>
++#include <inttypes.h>
+ #include <sys/time.h>
+ #include <sys/types.h>
+ #include <sys/socket.h>
+@@ -249,7 +250,7 @@ static void cpg_bm_deliver_fn (
+ unsigned int datalen;
+
+ if (nodeid > MAX_NODEID) {
+- cpgh_log_printf(CPGH_LOG_ERR, "Got message from invalid nodeid %d (too high for us). Quitting\n", nodeid);
++ cpgh_log_printf(CPGH_LOG_ERR, "Got message from invalid nodeid " CS_PRI_NODE_ID " (too high for us). Quitting\n", nodeid);
+ exit(1);
+ }
+
+@@ -280,7 +281,7 @@ static void cpg_bm_deliver_fn (
+ // Basic check, packets should all be the right size
+ if (msg_len != header->size) {
+ length_errors++;
+- cpgh_log_printf(CPGH_LOG_ERR, "%s: message sizes don't match. got %zu, expected %u from node %d\n", group_name->value, msg_len, header->size, nodeid);
++ cpgh_log_printf(CPGH_LOG_ERR, "%s: message sizes don't match. got %zu, expected %u from node " CS_PRI_NODE_ID "\n", group_name->value, msg_len, header->size, nodeid);
+
+ if (abort_on_error) {
+ exit(2);
+@@ -294,7 +295,7 @@ static void cpg_bm_deliver_fn (
+ /* Don't report the first mismatch or a newly restarted sender, we're just catching up */
+ if (g_recv_counter[nodeid] && header->counter) {
+ sequence_errors++;
+- cpgh_log_printf(CPGH_LOG_ERR, "%s: counters don't match. got %d, expected %d from node %d\n", group_name->value, header->counter, g_recv_counter[nodeid], nodeid);
++ cpgh_log_printf(CPGH_LOG_ERR, "%s: counters don't match. got %d, expected %d from node " CS_PRI_NODE_ID "\n", group_name->value, header->counter, g_recv_counter[nodeid], nodeid);
+
+ if (abort_on_error) {
+ exit(2);
+@@ -316,7 +317,7 @@ static void cpg_bm_deliver_fn (
+ crc = crc32(crc, (Bytef *)dataint, datalen) & 0xFFFFFFFF;
+ if (crc != recv_crc) {
+ crc_errors++;
+- cpgh_log_printf(CPGH_LOG_ERR, "%s: CRCs don't match. got %lx, expected %lx from nodeid %d\n", group_name->value, recv_crc, crc, nodeid);
++ cpgh_log_printf(CPGH_LOG_ERR, "%s: CRCs don't match. got %lx, expected %lx from nodeid " CS_PRI_NODE_ID "\n", group_name->value, recv_crc, crc, nodeid);
+
+ if (abort_on_error) {
+ exit(2);
+@@ -750,7 +751,7 @@ int main (int argc, char *argv[]) {
+ if (!machine_readable) {
+ for (i=1; i<MAX_NODEID; i++) {
+ if (g_recv_counter[i]) {
+- cpgh_log_printf(CPGH_LOG_INFO, "%s: %5d message%s of %d bytes received from node %d\n",
++ cpgh_log_printf(CPGH_LOG_INFO, "%s: %5d message%s of %d bytes received from node " CS_PRI_NODE_ID "\n",
+ group_name.value, g_recv_counter[i] - g_recv_start[i],
+ g_recv_counter[i]==1?"":"s",
+ g_recv_size[i], i);
+diff --git a/test/testcpg.c b/test/testcpg.c
+index 3316f7b4..e48f3ccb 100644
+--- a/test/testcpg.c
++++ b/test/testcpg.c
+@@ -92,7 +92,7 @@ static char * node_pid_format(unsigned int nodeid, unsigned int pid) {
+ sprintf(buffer, "node/pid %s/%d", inet_ntoa(saddr),pid);
+ }
+ else {
+- sprintf(buffer, "node/pid %d/%d", nodeid, pid);
++ sprintf(buffer, "node/pid " CS_PRI_NODE_ID "/%d", nodeid, pid);
+ }
+ return buffer;
+ }
+@@ -193,17 +193,17 @@ static void ConfchgCallback (
+ /* report dynamic nature of nodeid returned from local_get */
+ /* local get of nodeid might change identity from original! */
+ if(htonl((uint32_t)nodeid) == INADDR_LOOPBACK) {
+- printf("We probably left the building switched identity? start nodeid %d nodeid %d current nodeid %d pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid);
++ printf("We probably left the building switched identity? start nodeid " CS_PRI_NODE_ID " nodeid " CS_PRI_NODE_ID " current nodeid " CS_PRI_NODE_ID " pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid);
+ } else if(htonl((uint32_t)left_list[0].nodeid) == INADDR_LOOPBACK) {
+- printf("We probably left the building started alone? start nodeid %d nodeid %d current nodeid %d pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid);
++ printf("We probably left the building started alone? start nodeid " CS_PRI_NODE_ID " nodeid " CS_PRI_NODE_ID " current nodeid " CS_PRI_NODE_ID " pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid);
+ }
+ /* a possibly reliable way to check is based on original address */
+ if(left_list[0].nodeid == nodeidStart) {
+- printf("We have left the building direct match start nodeid %d nodeid %d local get current nodeid %d pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid);
++ printf("We have left the building direct match start nodeid " CS_PRI_NODE_ID " nodeid " CS_PRI_NODE_ID " local get current nodeid " CS_PRI_NODE_ID " pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid);
+ // quit = 1;
+ restart = 1;
+ } else {
+- printf("Probably another node with matching pid start nodeid %d nodeid %d current nodeid %d pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid);
++ printf("Probably another node with matching pid start nodeid " CS_PRI_NODE_ID " nodeid " CS_PRI_NODE_ID " current nodeid " CS_PRI_NODE_ID " pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid);
+ }
+ }
+ }
+@@ -219,13 +219,13 @@ static void TotemConfchgCallback (
+
+ printf("\n");
+ print_time();
+- printf ("TotemConfchgCallback: ringid (%u.%"PRIu64")\n",
++ printf ("TotemConfchgCallback: ringid (" CS_PRI_RING_ID ")\n",
+ ring_id.nodeid, ring_id.seq);
+
+ printf("active processors %lu: ",
+ (unsigned long int) member_list_entries);
+ for (i=0; i<member_list_entries; i++) {
+- printf("%d ", member_list[i]);
++ printf(CS_PRI_NODE_ID " ", member_list[i]);
+ }
+ printf ("\n");
+ }
+@@ -289,7 +289,7 @@ static void print_localnodeid(cpg_handle_t handle)
+ addrStr, (socklen_t)sizeof(addrStr)) == NULL) {
+ addrStr[0] = 0;
+ }
+- printf ("Local node id is %s/%x result %d\n", addrStr, nodeid, result);
++ printf ("Local node id is %s/" CS_PRI_NODE_ID " result %d\n", addrStr, nodeid, result);
+ }
+ }
+
+@@ -362,7 +362,7 @@ int main (int argc, char *argv[]) {
+ printf ("Could not get local node id\n");
+ retrybackoff(recnt);
+ }
+- printf ("Local node id is %x\n", nodeid);
++ printf ("Local node id is " CS_PRI_NODE_ID "\n", nodeid);
+ nodeidStart = nodeid;
+
+ retries = 0;
+@@ -383,7 +383,7 @@ int main (int argc, char *argv[]) {
+
+ printf ("membership list\n");
+ for (i = 0; i < member_list_entries; i++) {
+- printf ("node id %d pid %d\n", member_list[i].nodeid,
++ printf ("node id " CS_PRI_NODE_ID " pid %d\n", member_list[i].nodeid,
+ member_list[i].pid);
+ }
+
+diff --git a/test/testcpg2.c b/test/testcpg2.c
+index 3d7763a8..d779cf32 100644
+--- a/test/testcpg2.c
++++ b/test/testcpg2.c
+@@ -37,6 +37,7 @@
+ #include <assert.h>
+ #include <stdio.h>
+ #include <poll.h>
++#include <inttypes.h>
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <sys/uio.h>
+@@ -52,7 +53,7 @@ static void deliver(
+ void *msg,
+ size_t msg_len)
+ {
+- printf("self delivered nodeid: %x\n", nodeid);
++ printf("self delivered nodeid: " CS_PRI_NODE_ID "\n", nodeid);
+ }
+
+ static void confch(
+@@ -62,7 +63,7 @@ static void confch(
+ const struct cpg_address *left_list, size_t left_list_entries,
+ const struct cpg_address *joined_list, size_t joined_list_entries)
+ {
+- printf("confchg nodeid %x\n", member_list[0].nodeid);
++ printf("confchg nodeid " CS_PRI_NODE_ID "\n", member_list[0].nodeid);
+ }
+
+ int main(int argc, char** argv) {
+@@ -78,7 +79,7 @@ int main(int argc, char** argv) {
+ printf ("All of the nodeids should match on a single node configuration\n for the test to pass.");
+ assert(CS_OK==cpg_initialize(&handle, &cb));
+ assert(CS_OK==cpg_local_get(handle,&nodeid));
+- printf("local_get: %x\n", nodeid);
++ printf("local_get: " CS_PRI_NODE_ID "\n", nodeid);
+ assert(CS_OK==cpg_join(handle, &group));
+ assert(CS_OK==cpg_mcast_joined(handle,CPG_TYPE_AGREED,&msg,1));
+ cpg_fd_get (handle, &fd);
+diff --git a/test/testcpgzc.c b/test/testcpgzc.c
+index 2a6a9a81..6da36a1c 100644
+--- a/test/testcpgzc.c
++++ b/test/testcpgzc.c
+@@ -39,6 +39,7 @@
+ #include <errno.h>
+ #include <unistd.h>
+ #include <string.h>
++#include <inttypes.h>
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <sys/select.h>
+@@ -80,7 +81,7 @@ static void DeliverCallback (
+ inet_ntoa(saddr), pid, (const char *)msg);
+ }
+ else {
+- printf("DeliverCallback: message (len=%lu)from node/pid %d/%d: '%s'\n",
++ printf("DeliverCallback: message (len=%lu)from node/pid " CS_PRI_NODE_ID "/%d: '%s'\n",
+ (unsigned long int) msg_len, nodeid, pid,
+ (const char *)msg);
+ }
+@@ -107,7 +108,7 @@ static void ConfchgCallback (
+ joined_list[i].reason);
+ }
+ else {
+- printf("joined node/pid: %d/%d reason: %d\n",
++ printf("joined node/pid: " CS_PRI_NODE_ID "/%d reason: %d\n",
+ joined_list[i].nodeid, joined_list[i].pid,
+ joined_list[i].reason);
+ }
+@@ -121,7 +122,7 @@ static void ConfchgCallback (
+ left_list[i].reason);
+ }
+ else {
+- printf("left node/pid: %d/%d reason: %d\n",
++ printf("left node/pid: " CS_PRI_NODE_ID "/%d reason: %d\n",
+ left_list[i].nodeid, left_list[i].pid,
+ left_list[i].reason);
+ }
+@@ -136,7 +137,7 @@ static void ConfchgCallback (
+ inet_ntoa (saddr), member_list[i].pid);
+ }
+ else {
+- printf("node/pid: %d/%d\n",
++ printf("node/pid: " CS_PRI_NODE_ID "/%d\n",
+ member_list[i].nodeid, member_list[i].pid);
+ }
+ }
+@@ -204,7 +205,7 @@ int main (int argc, char *argv[]) {
+ exit (1);
+ }
+
+- printf ("Local node id is %x\n", nodeid);
++ printf ("Local node id is " CS_PRI_NODE_ID "\n", nodeid);
+ result = cpg_join(handle, &group_name);
+ if (result != CS_OK) {
+ printf ("Could not join process group, error %d\n", result);
+diff --git a/test/testquorum.c b/test/testquorum.c
+index 52ae562e..ebcbf07c 100644
+--- a/test/testquorum.c
++++ b/test/testquorum.c
+@@ -2,6 +2,7 @@
+
+ #include <sys/types.h>
+ #include <stdio.h>
++#include <inttypes.h>
+ #include <stdint.h>
+ #include <stdlib.h>
+ #include <unistd.h>
+@@ -21,11 +22,11 @@ static void quorum_notification_fn(
+
+ printf("quorum notification called \n");
+ printf(" quorate = %lu\n", (long unsigned int) quorate);
+- printf(" ring id = %llu\n", (long long unsigned int) ring_id);
++ printf(" ring id = " CS_PRI_RING_ID_SEQ "\n", ring_id);
+ printf(" num nodes = %lu ", (long unsigned int) view_list_entries);
+
+ for (i=0; i<view_list_entries; i++) {
+- printf(" %d ", view_list[i]);
++ printf(" " CS_PRI_NODE_ID, view_list[i]);
+ }
+ printf("\n");
+ }
+diff --git a/test/testvotequorum1.c b/test/testvotequorum1.c
+index d9110ca8..f87c79ba 100644
+--- a/test/testvotequorum1.c
++++ b/test/testvotequorum1.c
+@@ -91,7 +91,7 @@ static void votequorum_quorum_notification_fn(
+ printf(" quorate = %d\n", quorate);
+
+ for (i = 0; i< node_list_entries; i++) {
+- printf(" %d: %s\n", node_list[i].nodeid, node_state(node_list[i].state));
++ printf(" " CS_PRI_NODE_ID ": %s\n", node_list[i].nodeid, node_state(node_list[i].state));
+ }
+
+ }
+@@ -108,11 +108,11 @@ static void votequorum_nodelist_notification_fn(
+
+ printf("votequorum nodelist notification called \n");
+ printf(" number of nodes = %d\n", node_list_entries);
+- printf(" current ringid = (%u.%"PRIu64")\n", ring_id.nodeid, ring_id.seq);
++ printf(" current ringid = (" CS_PRI_RING_ID ")\n", ring_id.nodeid, ring_id.seq);
+ printf(" nodes: ");
+
+ for (i = 0; i< node_list_entries; i++) {
+- printf("%d ", node_list[i]);
++ printf(CS_PRI_NODE_ID " ", node_list[i]);
+ }
+ printf("\n\n");
+ }
+diff --git a/test/testvotequorum2.c b/test/testvotequorum2.c
+index a30e8535..1e8c13f1 100644
+--- a/test/testvotequorum2.c
++++ b/test/testvotequorum2.c
+@@ -85,7 +85,7 @@ static void votequorum_nodelist_notification_fn(
+ {
+
+ printf("votequorum nodelist notification called \n");
+- printf(" current ringid = (%u.%"PRIu64")\n", ring_id.nodeid, ring_id.seq);
++ printf(" current ringid = (" CS_PRI_RING_ID ")\n", ring_id.nodeid, ring_id.seq);
+ printf("\n");
+
+ memcpy(&last_received_ring_id, &ring_id, sizeof(ring_id));
+diff --git a/test/testzcgc.c b/test/testzcgc.c
+index 15ab56bb..ca177f44 100644
+--- a/test/testzcgc.c
++++ b/test/testzcgc.c
+@@ -39,6 +39,7 @@
+ #include <errno.h>
+ #include <unistd.h>
+ #include <string.h>
++#include <inttypes.h>
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <sys/select.h>
+@@ -77,7 +78,7 @@ static void DeliverCallback (
+ inet_ntoa(saddr), pid, (const char *)msg);
+ }
+ else {
+- printf("DeliverCallback: message (len=%lu)from node/pid %d/%d: '%s'\n",
++ printf("DeliverCallback: message (len=%lu)from node/pid " CS_PRI_NODE_ID "/%d: '%s'\n",
+ (unsigned long int) msg_len, nodeid, pid,
+ (const char *)msg);
+ }
+@@ -104,7 +105,7 @@ static void ConfchgCallback (
+ joined_list[i].reason);
+ }
+ else {
+- printf("joined node/pid: %d/%d reason: %d\n",
++ printf("joined node/pid: " CS_PRI_NODE_ID "/%d reason: %d\n",
+ joined_list[i].nodeid, joined_list[i].pid,
+ joined_list[i].reason);
+ }
+@@ -118,7 +119,7 @@ static void ConfchgCallback (
+ left_list[i].reason);
+ }
+ else {
+- printf("left node/pid: %d/%d reason: %d\n",
++ printf("left node/pid: " CS_PRI_NODE_ID "/%d reason: %d\n",
+ left_list[i].nodeid, left_list[i].pid,
+ left_list[i].reason);
+ }
+@@ -133,7 +134,7 @@ static void ConfchgCallback (
+ inet_ntoa (saddr), member_list[i].pid);
+ }
+ else {
+- printf("node/pid: %d/%d\n",
++ printf("node/pid: " CS_PRI_NODE_ID "/%d\n",
+ member_list[i].nodeid, member_list[i].pid);
+ }
+ }
+diff --git a/tools/corosync-cfgtool.c b/tools/corosync-cfgtool.c
+index f51b9d41..57c120fc 100644
+--- a/tools/corosync-cfgtool.c
++++ b/tools/corosync-cfgtool.c
+@@ -153,7 +153,7 @@ linkstatusget_do (char *interface_name, int brief)
+ printf ("Could not get the local node id, the error is: %d\n", result);
+ }
+ else {
+- printf ("Local node ID %u\n", nodeid);
++ printf ("Local node ID " CS_PRI_NODE_ID "\n", nodeid);
+ }
+
+ result = corosync_cfg_ring_status_get (handle,
+@@ -350,7 +350,7 @@ static void killnode_do(unsigned int nodeid)
+ cs_error_t result;
+ corosync_cfg_handle_t handle;
+
+- printf ("Killing node %d\n", nodeid);
++ printf ("Killing node " CS_PRI_NODE_ID "\n", nodeid);
+ result = corosync_cfg_initialize (&handle, NULL);
+ if (result != CS_OK) {
+ printf ("Could not initialize corosync configuration API error %d\n", result);
+diff --git a/tools/corosync-notifyd.c b/tools/corosync-notifyd.c
+index 6338fe04..dfc1c429 100644
+--- a/tools/corosync-notifyd.c
++++ b/tools/corosync-notifyd.c
+@@ -249,7 +249,7 @@ static void _cs_cmap_members_key_changed (
+
+ res = snprintf(tmp_key, CMAP_KEYNAME_MAXLEN, "runtime.members.%u.ip", nodeid);
+ if (res <= 0 || res >= CMAP_KEYNAME_MAXLEN) {
+- qb_log(LOG_ERR, "temp_key: failed, res: %d, nodeid: %u", res, nodeid);
++ qb_log(LOG_ERR, "temp_key: failed, res: %d, nodeid: " CS_PRI_NODE_ID, res, nodeid);
+ return ;
+ }
+ no_retries = 0;
+@@ -965,16 +965,16 @@ _cs_snmp_init(void)
+ static void
+ _cs_syslog_node_membership_event(char *nodename, uint32_t nodeid, char *state, char* ip)
+ {
+- qb_log(LOG_NOTICE, "%s[%d] ip:%s %s", nodename, nodeid, ip, state);
++ qb_log(LOG_NOTICE, "%s[" CS_PRI_NODE_ID "] ip:%s %s", nodename, nodeid, ip, state);
+ }
+
+ static void
+ _cs_syslog_node_quorum_event(char *nodename, uint32_t nodeid, const char *state)
+ {
+ if (strcmp(state, "quorate") == 0) {
+- qb_log(LOG_NOTICE, "%s[%d] is now %s", nodename, nodeid, state);
++ qb_log(LOG_NOTICE, "%s[" CS_PRI_NODE_ID "] is now %s", nodename, nodeid, state);
+ } else {
+- qb_log(LOG_NOTICE, "%s[%d] has lost quorum", nodename, nodeid);
++ qb_log(LOG_NOTICE, "%s[" CS_PRI_NODE_ID "] has lost quorum", nodename, nodeid);
+ }
+ }
+
+@@ -982,16 +982,16 @@ static void
+ _cs_syslog_application_connection_event(char *nodename, uint32_t nodeid, char* app_name, const char *state)
+ {
+ if (strcmp(state, "connected") == 0) {
+- qb_log(LOG_NOTICE, "%s[%d] %s is now %s to corosync", nodename, nodeid, app_name, state);
++ qb_log(LOG_NOTICE, "%s[" CS_PRI_NODE_ID "] %s is now %s to corosync", nodename, nodeid, app_name, state);
+ } else {
+- qb_log(LOG_NOTICE, "%s[%d] %s is now %s from corosync", nodename, nodeid, app_name, state);
++ qb_log(LOG_NOTICE, "%s[" CS_PRI_NODE_ID "] %s is now %s from corosync", nodename, nodeid, app_name, state);
+ }
+ }
+
+ static void
+ _cs_syslog_link_faulty_event(char *nodename, uint32_t our_nodeid, uint32_t nodeid, uint32_t iface_no, const char *state)
+ {
+- qb_log(LOG_NOTICE, "%s[%d] link %u to node %u is now %s", nodename, our_nodeid, iface_no, nodeid, state);
++ qb_log(LOG_NOTICE, "%s[" CS_PRI_NODE_ID "] link %u to node " CS_PRI_NODE_ID " is now %s", nodename, our_nodeid, iface_no, nodeid, state);
+ }
+
+ static void
+diff --git a/tools/corosync-quorumtool.c b/tools/corosync-quorumtool.c
+index 48199519..baaa4472 100644
+--- a/tools/corosync-quorumtool.c
++++ b/tools/corosync-quorumtool.c
+@@ -236,7 +236,7 @@ static int set_votes(uint32_t nodeid, int votes)
+ int err;
+
+ if ((err=votequorum_setvotes(v_handle, nodeid, votes)) != CS_OK) {
+- fprintf(stderr, "Unable to set votes %d for nodeid: %u: %s\n",
++ fprintf(stderr, "Unable to set votes %d for nodeid: " CS_PRI_NODE_ID ": %s\n",
+ votes, nodeid, cs_strerror(err));
+ }
+
+@@ -340,7 +340,7 @@ static const char *node_name(uint32_t nodeid, name_format_t name_format)
+
+ err = corosync_cfg_get_node_addrs(c_handle, nodeid, INTERFACE_MAX, &numaddrs, addrs);
+ if (err != CS_OK) {
+- fprintf(stderr, "Unable to get node address for nodeid %u: %s\n", nodeid, cs_strerror(err));
++ fprintf(stderr, "Unable to get node address for nodeid " CS_PRI_NODE_ID ": %s\n", nodeid, cs_strerror(err));
+ return "";
+ }
+
+@@ -473,7 +473,7 @@ static void display_nodes_data(nodeid_format_t nodeid_format, name_format_t name
+ if (v_handle) {
+ for (i=0; i < g_view_list_entries; i++) {
+ if (votequorum_getinfo(v_handle, g_view_list[i].node_id, &info[i]) != CS_OK) {
+- printf("Unable to get node %u info\n", g_view_list[i].node_id);
++ printf("Unable to get node " CS_PRI_NODE_ID " info\n", g_view_list[i].node_id);
+ }
+ g_view_list[i].vq_info = &info[i];
+ if (info[i].flags & VOTEQUORUM_INFO_QDEVICE_REGISTERED) {
+@@ -600,16 +600,16 @@ static int display_quorum_data(int is_quorate,
+ printf("Quorum provider: %s\n", quorumtype);
+ printf("Nodes: %d\n", g_view_list_entries);
+ if (nodeid_format == NODEID_FORMAT_DECIMAL) {
+- printf("Node ID: %u\n", our_nodeid);
++ printf("Node ID: " CS_PRI_NODE_ID "\n", our_nodeid);
+ } else {
+ printf("Node ID: 0x%08x\n", our_nodeid);
+ }
+
+ if (v_handle) {
+- printf("Ring ID: %d/%" PRIu64 "\n", g_ring_id_rep_node, g_ring_id);
++ printf("Ring ID: " CS_PRI_RING_ID "\n", g_ring_id_rep_node, g_ring_id);
+ }
+ else {
+- printf("Ring ID: %" PRIu64 "\n", g_ring_id);
++ printf("Ring ID: " CS_PRI_RING_ID_SEQ "\n", g_ring_id);
+ }
+ printf("Quorate: %s\n", is_quorate?"Yes":"No");
+
+diff --git a/vqsim/vqmain.c b/vqsim/vqmain.c
+index 25d0fad5..e42ce9fd 100644
+--- a/vqsim/vqmain.c
++++ b/vqsim/vqmain.c
+@@ -117,19 +117,19 @@ static void print_quorum_state(struct vq_node *node)
+ int i;
+
+ if (node->last_quorate < 0) {
+- fprintf(output_file, "%d:%02d: q=UNINITIALIZED\n",
++ fprintf(output_file, "%d:" CS_PRI_NODE_ID ": q=UNINITIALIZED\n",
+ node->partition->num, node->nodeid);
+ return;
+ }
+
+- fprintf(output_file, "%d:%02d: q=%d ring=[%d/%lld] ", node->partition->num, node->nodeid, node->last_quorate,
+- node->last_ring_id.nodeid, node->last_ring_id.seq);
++ fprintf(output_file, "%d:" CS_PRI_NODE_ID ": q=%d ring=[" CS_PRI_RING_ID "] ", node->partition->num, node->nodeid, node->last_quorate,
++ node->last_ring_id.nodeid, (uint64_t)node->last_ring_id.seq);
+ fprintf(output_file, "nodes=[");
+ for (i = 0; i < node->last_view_list_entries; i++) {
+ if (i) {
+ fprintf(output_file, " ");
+ }
+- fprintf(output_file, "%d", node->last_view_list[i]);
++ fprintf(output_file, CS_PRI_NODE_ID, node->last_view_list[i]);
+ }
+ fprintf(output_file, "]\n");
+
+@@ -265,7 +265,7 @@ static int vq_parent_read_fn(int32_t fd, int32_t revents, void *data)
+ }
+ }
+ if (revents == POLLERR) {
+- fprintf(stderr, "pollerr on %d\n", vqn->nodeid);
++ fprintf(stderr, "pollerr on " CS_PRI_NODE_ID "\n", vqn->nodeid);
+ }
+ return 0;
+ }
+@@ -342,7 +342,7 @@ static int32_t sigchld_handler(int32_t sig, void *data)
+ sprintf(text, "(exit code %d)", WEXITSTATUS(status));
+ break;
+ }
+- printf("%d:%02d: Quit %s\n", vqn->partition->num, vqn->nodeid, exit_status);
++ printf("%d:" CS_PRI_NODE_ID ": Quit %s\n", vqn->partition->num, vqn->nodeid, exit_status);
+
+ remove_node(vqn);
+ }
+@@ -353,7 +353,7 @@ static int32_t sigchld_handler(int32_t sig, void *data)
+ if (WIFSIGNALED(status)) {
+ vqn = find_by_pid(pid);
+ if (vqn) {
+- printf("%d:%02d exited on signal %d%s\n", vqn->partition->num, vqn->nodeid, WTERMSIG(status), WCOREDUMP(status)?" (core dumped)":"");
++ printf("%d:" CS_PRI_NODE_ID " exited on signal %d%s\n", vqn->partition->num, vqn->nodeid, WTERMSIG(status), WCOREDUMP(status)?" (core dumped)":"");
+ remove_node(vqn);
+ }
+ else {
+@@ -411,7 +411,7 @@ static pid_t create_node(int nodeid, int partno)
+ newvq->instance = vq_create_instance(poll_loop, nodeid);
+ if (!newvq->instance) {
+ fprintf(stderr,
+- "ERR: could not create vq instance nodeid %d\n",
++ "ERR: could not create vq instance nodeid " CS_PRI_NODE_ID "\n",
+ nodeid);
+ free(newvq);
+ return (pid_t) -1;
+@@ -467,7 +467,7 @@ static size_t create_nodes_from_config(void)
+ pid = create_node(nodeid, 0);
+ if (pid == (pid_t) -1) {
+ fprintf(stderr,
+- "ERR: nodeid %d could not be spawned\n",
++ "ERR: nodeid " CS_PRI_NODE_ID " could not be spawned\n",
+ nodeid);
+ exit(1);
+ }
+@@ -537,7 +537,7 @@ int cmd_start_new_node(int nodeid, int partition)
+
+ node = find_node(nodeid);
+ if (node) {
+- fprintf(stderr, "ERR: nodeid %d already exists in partition %d\n", nodeid, node->partition->num);
++ fprintf(stderr, "ERR: nodeid " CS_PRI_NODE_ID " already exists in partition %d\n", nodeid, node->partition->num);
+ return -1;
+ }
+ if (create_node(nodeid, partition) == -1) {
+@@ -577,7 +577,7 @@ int cmd_stop_node(int nodeid)
+
+ node = find_node(nodeid);
+ if (!node) {
+- fprintf(stderr, "ERR: nodeid %d is not up\n", nodeid);
++ fprintf(stderr, "ERR: nodeid " CS_PRI_NODE_ID " is not up\n", nodeid);
+ return -1;
+ }
+
+@@ -613,7 +613,7 @@ void cmd_move_nodes(int partition, int num_nodes, int *nodelist)
+ node->partition = &partitions[partition];
+ }
+ else {
+- printf("ERR: node %d does not exist\n", nodelist[i]);
++ printf("ERR: node " CS_PRI_NODE_ID " does not exist\n", nodelist[i]);
+ }
+ }
+ }
+diff --git a/vqsim/vqsim_vq_engine.c b/vqsim/vqsim_vq_engine.c
+index b8460f39..e0bb0bd8 100644
+--- a/vqsim/vqsim_vq_engine.c
++++ b/vqsim/vqsim_vq_engine.c
+@@ -313,7 +313,7 @@ static int poll_qdevice(int onoff)
+
+ res = send_lib_msg(MESSAGE_REQ_VOTEQUORUM_QDEVICE_POLL, &pollmsg);
+ if (res != CS_OK) {
+- fprintf(stderr, "%d: qdevice poll failed: %d\n", our_nodeid, res);
++ fprintf(stderr, CS_PRI_NODE_ID ": qdevice poll failed: %d\n", our_nodeid, res);
+ }
+ return res;
+ }
+@@ -362,7 +362,7 @@ static void do_qdevice(int onoff)
+ start_qdevice_poll(1);
+ }
+ else {
+- fprintf(stderr, "%d: qdevice registration failed: %d\n", our_nodeid, res);
++ fprintf(stderr, CS_PRI_NODE_ID ": qdevice registration failed: %d\n", our_nodeid, res);
+ }
+ }
+ else {
diff --git a/debian/patches/0011-totemknet-Add-locking-for-log-call.patch b/debian/patches/0011-totemknet-Add-locking-for-log-call.patch
new file mode 100644
index 0000000..0d29c8e
--- /dev/null
+++ b/debian/patches/0011-totemknet-Add-locking-for-log-call.patch
@@ -0,0 +1,93 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jan Friesse <jfriesse at redhat.com>
+Date: Mon, 9 Sep 2019 17:47:24 +0200
+Subject: [PATCH] totemknet: Add locking for log call
+
+Knet callbacks may be called from different thread than main thread. If
+this happens, log messages may be lost. Most prominent example is when
+link goes up (logged by main thread) and host_change_callback_fn is
+called.
+
+Implemented solution is adding mutex for every log call in totemknet.
+
+Signed-off-by: Jan Friesse <jfriesse at redhat.com>
+Reviewed-by: Fabio M. Di Nitto <fdinitto at redhat.com>
+(cherry picked from commit 1cf1558fe745de0f81147ca33ea1f27ac152308d)
+Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
+---
+ exec/totemknet.c | 30 +++++++++++++++++++++++++++---
+ 1 file changed, 27 insertions(+), 3 deletions(-)
+
+diff --git a/exec/totemknet.c b/exec/totemknet.c
+index 38b69e7b..a372ea75 100644
+--- a/exec/totemknet.c
++++ b/exec/totemknet.c
+@@ -51,6 +51,7 @@
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <errno.h>
++#include <pthread.h>
+ #include <sched.h>
+ #include <time.h>
+ #include <sys/time.h>
+@@ -171,6 +172,8 @@ struct totemknet_instance {
+
+ int logpipes[2];
+ int knet_fd;
++
++ pthread_mutex_t log_mutex;
+ #ifdef HAVE_LIBNOZZLE
+ char *nozzle_name;
+ char *nozzle_ipaddr;
+@@ -203,20 +206,36 @@ static void log_flush_messages (
+
+ static void totemknet_instance_initialize (struct totemknet_instance *instance)
+ {
++ int res;
++
+ memset (instance, 0, sizeof (struct totemknet_instance));
++ res = pthread_mutex_init(&instance->log_mutex, NULL);
++ /*
++ * There is not too much else what can be done.
++ */
++ assert(res == 0);
+ }
+
++#define knet_log_printf_lock(level, subsys, function, file, line, format, args...) \
++do { \
++ (void)pthread_mutex_lock(&instance->log_mutex); \
++ instance->totemknet_log_printf ( \
++ level, subsys, function, file, line, \
++ (const char *)format, ##args); \
++ (void)pthread_mutex_unlock(&instance->log_mutex); \
++} while (0);
++
+ #define knet_log_printf(level, format, args...) \
+ do { \
+- instance->totemknet_log_printf ( \
++ knet_log_printf_lock ( \
+ level, instance->totemknet_subsys_id, \
+ __FUNCTION__, __FILE__, __LINE__, \
+ (const char *)format, ##args); \
+ } while (0);
+
+-#define libknet_log_printf(level, format, args...) \
++#define libknet_log_printf(level, format, args...) \
+ do { \
+- instance->totemknet_log_printf ( \
++ knet_log_printf_lock ( \
+ level, instance->knet_subsys_id, \
+ __FUNCTION__, "libknet.h", __LINE__, \
+ (const char *)format, ##args); \
+@@ -603,6 +622,11 @@ finalise_error:
+
+ log_flush_messages(instance);
+
++ /*
++ * Error is deliberately ignored
++ */
++ (void)pthread_mutex_destroy(&instance->log_mutex);
++
+ return (res);
+ }
+
diff --git a/debian/patches/0012-totempg-Check-sanity-length-of-received-message.patch b/debian/patches/0012-totempg-Check-sanity-length-of-received-message.patch
new file mode 100644
index 0000000..8ba9f03
--- /dev/null
+++ b/debian/patches/0012-totempg-Check-sanity-length-of-received-message.patch
@@ -0,0 +1,71 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jan Friesse <jfriesse at redhat.com>
+Date: Thu, 3 Oct 2019 11:35:37 +0200
+Subject: [PATCH] totempg: Check sanity (length) of received message
+
+Signed-off-by: Jan Friesse <jfriesse at redhat.com>
+Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
+---
+ exec/totempg.c | 32 ++++++++++++++++++++++++++++++--
+ 1 file changed, 30 insertions(+), 2 deletions(-)
+
+diff --git a/exec/totempg.c b/exec/totempg.c
+index 6b3c590d..e251c236 100644
+--- a/exec/totempg.c
++++ b/exec/totempg.c
+@@ -603,10 +603,18 @@ static void totempg_deliver_fn (
+ const char *data;
+ int datasize;
+ struct iovec iov_delv;
++ size_t expected_msg_len;
+
+ assembly = assembly_ref (nodeid);
+ assert (assembly);
+
++ if (msg_len < sizeof(struct totempg_mcast)) {
++ log_printf(LOG_WARNING,
++ "Message (totempg_mcast) received from node " CS_PRI_NODE_ID " is too short... Ignoring.", nodeid);
++
++ return ;
++ }
++
+ /*
+ * Assemble the header into one block of data and
+ * assemble the packet contents into one block of data to simplify delivery
+@@ -621,14 +629,34 @@ static void totempg_deliver_fn (
+ datasize = sizeof (struct totempg_mcast) +
+ msg_count * sizeof (unsigned short);
+
++ if (msg_len < datasize) {
++ log_printf(LOG_WARNING,
++ "Message (totempg_mcast datasize) received from node " CS_PRI_NODE_ID
++ " is too short... Ignoring.", nodeid);
++
++ return ;
++ }
++
+ memcpy (header, msg, datasize);
+ data = msg;
+
+ msg_lens = (unsigned short *) (header + sizeof (struct totempg_mcast));
+- if (endian_conversion_required) {
+- for (i = 0; i < mcast->msg_count; i++) {
++ expected_msg_len = datasize;
++ for (i = 0; i < mcast->msg_count; i++) {
++ if (endian_conversion_required) {
+ msg_lens[i] = swab16 (msg_lens[i]);
+ }
++
++ expected_msg_len += msg_lens[i];
++ }
++
++ if (msg_len != expected_msg_len) {
++ log_printf(LOG_WARNING,
++ "Message (totempg_mcast) received from node " CS_PRI_NODE_ID
++ " doesn't have expected length of %zu (has %u) bytes... Ignoring.",
++ nodeid, expected_msg_len, msg_len);
++
++ return ;
+ }
+
+ assert((assembly->index+msg_len) < sizeof(assembly->data));
diff --git a/debian/patches/series b/debian/patches/series
index c255b6f..2604279 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -6,3 +6,7 @@
0006-cpg-Move-filling-of-member_list-to-subfunction.patch
0007-totem-fix-check-if-all-nodes-have-name-attrs-in-mult.patch
0008-totem-fix-check-if-all-nodes-have-same-number-of-lin.patch
+0009-totemknet-Disable-forwarding-on-shutdown.patch
+0010-logging-Add-CS_PRI_NODE_ID-and-CS_PRI_RING_ID.patch
+0011-totemknet-Add-locking-for-log-call.patch
+0012-totempg-Check-sanity-length-of-received-message.patch
--
2.20.1
More information about the pve-devel
mailing list