From mboxrd@z Thu Jan 1 00:00:00 1970 From: teigland@sourceware.org Date: 21 Sep 2006 15:46:55 -0000 Subject: [Cluster-devel] cluster/cman-kernel/src sm_message.c Message-ID: <20060921154655.14106.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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;