All of lore.kernel.org
 help / color / mirror / Atom feed
From: Fabio M. Di Nitto <fdinitto@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster: STABLE3 - cman: Add improved cluster_id hash function
Date: Fri, 19 Mar 2010 16:17:42 +0100	[thread overview]
Message-ID: <4BA39596.5070009@redhat.com> (raw)
In-Reply-To: <20100319140030.6959712015A@lists.fedorahosted.org>

Christine, because of the nature of this code (public domain) and 
specific request NOT to copyright it, can you please move it in its own 
file and add a proper exception/description in docs/COPYRIGHT?

I don't think mixing it with our GPL2+ and copyright is a good idea in 
the long term.

Or alternatively find the the correct way to describe it in 
docs/COPYRIGHT and LICENCES.....

Thanks
Fabio

On 03/19/2010 03:00 PM, Christine Caulfield wrote:
> Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=814faae67c226f6ac9e99438096696479c8aaf2e
> Commit:        814faae67c226f6ac9e99438096696479c8aaf2e
> Parent:        e23761e752f496399c51d74c557f302378eb1427
> Author:        Christine Caulfield<ccaulfie@redhat.com>
> AuthorDate:    Fri Mar 19 13:57:50 2010 +0000
> Committer:     Christine Caulfield<ccaulfie@redhat.com>
> CommitterDate: Fri Mar 19 13:57:50 2010 +0000
>
> cman: Add improved cluster_id hash function
>
> Add a new and vastly improved function for converting the cluster name
> into a 16bit ID. This is currently disabled by default but can be enabled
> with the stanza
>
> <cman hash_cluster_id="yes"/>
>
> in cluster.conf
>
> We might make this the default in future .. watch this space. Or some space
> closely related to this one that's less intimidating to read on a Friday
> afternoon before you've had tea.
>
> Thanks to Steven Dake for finding and slightly modifying the hash function.
>
> Signed-off-by: Christine Caulfield<ccaulfie@redhat.com>
> ---
>   cman/daemon/cman-preconfig.c |  119 ++++++++++++++++++++++++++++++++++++++++--
>   1 files changed, 115 insertions(+), 4 deletions(-)
>
> diff --git a/cman/daemon/cman-preconfig.c b/cman/daemon/cman-preconfig.c
> index f27effa..3339f1d 100644
> --- a/cman/daemon/cman-preconfig.c
> +++ b/cman/daemon/cman-preconfig.c
> @@ -49,6 +49,7 @@ static char *mcast_name;
>   static char *cluster_name;
>   static char error_reason[1024] = { '\0' };
>   static hdb_handle_t cluster_parent_handle;
> +static int use_hashed_cluster_id = 0;
>
>   /*
>    * Exports the interface for the service
> @@ -283,6 +284,99 @@ static int add_ifaddr(struct objdb_iface_ver0 *objdb, char *mcast, char *ifaddr,
>   	return ret;
>   }
>
> +
> +/***
> + *
> + * Fowler/Noll/Vo hash
> + *
> + * The basis of this hash algorithm was taken from an idea sent
> + * as reviewer comments to the IEEE POSIX P1003.2 committee by:
> + *
> + *      Phong Vo (http://www.research.att.com/info/kpv/)
> + *      Glenn Fowler (http://www.research.att.com/~gsf/)
> + *
> + * In a subsequent ballot round:
> + *
> + *      Landon Curt Noll (http://www.isthe.com/chongo/)
> + *
> + * improved on their algorithm.  Some people tried this hash
> + * and found that it worked rather well.  In an EMail message
> + * to Landon, they named it the ``Fowler/Noll/Vo'' or FNV hash.
> + *
> + * FNV hashes are designed to be fast while maintaining a low
> + * collision rate. The FNV speed allows one to quickly hash lots
> + * of data while maintaining a reasonable collision rate.  See:
> + *
> + *      http://www.isthe.com/chongo/tech/comp/fnv/index.html
> + *
> + * for more details as well as other forms of the FNV hash.
> + ***
> + *
> + * To use the recommended 32 bit FNV-1a hash, pass FNV1_32A_INIT as the
> + * Fnv32_t hashval argument to fnv_32a_buf() or fnv_32a_str().
> + *
> + ***
> + *
> + * Please do not copyright this code.  This code is in the public domain.
> + *
> + * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
> + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
> + * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
> + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
> + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
> + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
> + * PERFORMANCE OF THIS SOFTWARE.
> + *
> + * By:
> + *	chongo<Landon Curt Noll>  /\oo/\
> + *      http://www.isthe.com/chongo/
> + *
> + * Share and Enjoy!	:-)
> + */
> +
> +/*
> + * Modified to be a little more simple to understand and to provide a 16 bit
> + * value rather then 32 bit for cluster id generation
> + *
> + * sdake at redhat.com
> + */
> +
> +/* 32 bit magic FNV-1a prime */
> +#define FNV_32_PRIME ((uint32_t)0x01000193)
> +
> +/* Default initialization for FNV-1a */
> +#define FNV_32_INIT ((uint32_t)0x811c9dc5)
> +
> +static uint16_t generate_hashed_cluster_id(char *str)
> +{
> +	unsigned char *s = (unsigned char *)str;
> +	uint32_t hval = FNV_32_INIT;
> +	uint32_t ret;
> +
> +	/*
> +	* FNV-1a hash each octet in the buffer
> +	*/
> +	while (*s) {
> +		/*
> +		 * xor the bottom with the current octet
> +		 */
> +		hval ^= (uint32_t)*s++;
> +		/*
> +		 * multiply by the 32 bit FNV magic prime mod 2^32
> +		 */
> +		hval *= FNV_32_PRIME;
> +	}
> +
> +	/*
> +	 * Use XOR folding as recommended by authors of algorithm
> +	 * to create a different hash size that is a power of two
> +	 */
> +	ret = (hval>>  16) ^ (hval&  0xFFFF);
> +
> +	sprintf(error_reason, "Generated hashed cluster id for '%s' is %d\n", str, ret);
> +	return (ret);
> +}
> +
>   static uint16_t generate_cluster_id(char *name)
>   {
>   	int i;
> @@ -916,8 +1010,12 @@ static int set_noccs_defaults(struct objdb_iface_ver0 *objdb)
>   		return -1;
>   	}
>
> -	if (!cluster_id)
> -		cluster_id = generate_cluster_id(cluster_name);
> +	if (!cluster_id) {
> +	    if (use_hashed_cluster_id)
> +	        cluster_id = generate_hashed_cluster_id(cluster_name);
> +	    else
> +	        cluster_id = generate_cluster_id(cluster_name);
> +	}
>
>   	if (!nodename_env) {
>   		int error;
> @@ -1084,6 +1182,7 @@ static int get_cman_globals(struct objdb_iface_ver0 *objdb)
>   {
>   	hdb_handle_t object_handle;
>   	hdb_handle_t find_handle;
> +	char *use_hash;
>
>   	objdb_get_string(objdb, cluster_parent_handle, "name",&cluster_name);
>
> @@ -1096,11 +1195,21 @@ static int get_cman_globals(struct objdb_iface_ver0 *objdb)
>   		if (!key_filename)
>   			objdb_get_string(objdb, object_handle, "keyfile",&key_filename);
>
> +		objdb_get_string(objdb, object_handle, "hash_cluster_id",&use_hash);
> +		if (use_hash) {
> +		    if (strncasecmp(use_hash, "yes", 3) == 0 || strncasecmp(use_hash, "on", 2) == 0)
> +		        use_hashed_cluster_id = 1;
> +		}
> +
>   		if (!cluster_id)
>   			objdb_get_int(objdb, object_handle, "cluster_id",&cluster_id, 0);
>
> -		if (!cluster_id)
> -			cluster_id = generate_cluster_id(cluster_name);
> +		if (!cluster_id) {
> +		    if (use_hashed_cluster_id)
> +		        cluster_id = generate_hashed_cluster_id(cluster_name);
> +		    else
> +		        cluster_id = generate_cluster_id(cluster_name);
> +		}
>   	}
>   	objdb->object_find_destroy(find_handle);
>   	return 0;
> @@ -1202,6 +1311,8 @@ static void setup_old_compat(struct objdb_iface_ver0 *objdb, hdb_handle_t cluste
>   	hdb_handle_t totem_handle;
>   	hdb_handle_t gfs_handle;
>   	char *value;
> +	
> +	use_hashed_cluster_id = 0;
>
>   	/* Set groupd to backwards compatibility mode */
>   	groupd_handle = find_or_create_object(objdb, "group", cluster_handle);
> _______________________________________________
> cluster-commits mailing list
> cluster-commits at lists.fedorahosted.org
> https://fedorahosted.org/mailman/listinfo/cluster-commits



           reply	other threads:[~2010-03-19 15:17 UTC|newest]

Thread overview: expand[flat|nested]  mbox.gz  Atom feed
 [parent not found: <20100319140030.6959712015A@lists.fedorahosted.org>]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4BA39596.5070009@redhat.com \
    --to=fdinitto@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.