[Cluster-devel] cluster/cman-kernel/src sm_message.c
teigland at sourceware.org
teigland at sourceware.org
Thu Sep 21 15:46:55 UTC 2006
CVSROOT: /cvs/cluster
Module name: cluster
Branch: STABLE
Changes by: teigland at sourceware.org 2006-09-21 15:46:54
Modified files:
cman-kernel/src: sm_message.c
Log message:
Before choosing a new global id for a new group, a node discovers
what the current max group id seen by any node in the cluster is
and picks new=max+1. The problem is when two nodes do this in
parallel for two different new groups (that are at the same level)
and end up assigning the same global id to the two different groups.
To fix this, we have a node take this max group id and add its own nodeid
to it, so new=max+our_nodeid. This is similar to designating some of the
id bits to be the nodeid of the node creating the group, but that method
would break backward compatibility. bz 206193
Also, if we reach the max value of the global id counter (0xFFFFFF),
then print a message and refuse to go ahead forming the group.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman-kernel/src/sm_message.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.4.8.1&r2=1.4.8.2
--- cluster/cman-kernel/src/Attic/sm_message.c 2005/06/22 04:45:57 1.4.8.1
+++ cluster/cman-kernel/src/Attic/sm_message.c 2006/09/21 15:46:54 1.4.8.2
@@ -41,14 +41,16 @@
uint32_t sm_new_global_id(int level)
{
- uint32_t id = global_last_id++;
+ uint32_t id = global_last_id + sm_our_nodeid;
uint8_t l = (uint8_t) level;
if (level > 255)
return 0;
- if (id > 0x00FFFFFF)
+ if (id > 0x00FFFFFF) {
+ log_print("ERROR: max global group id");
return 0;
+ }
id |= (l << 24);
return id;
More information about the Cluster-devel
mailing list