[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