[infinispan-dev] HotRod, ClientIntelligence and client-side key location

Manik Surtani manik at jboss.org
Sat Mar 20 11:15:28 EDT 2010


On 19 Mar 2010, at 16:22, Alex Kluge wrote:

> He also hosts both a big endian and an endian neutral, but slower,
> implementation. Some research and testing would be required.

Definitely.  I plan to do some testing around this this week.

> 
> --- On Fri, 3/19/10, Manik Surtani <manik at jboss.org> wrote:
> 
>> From: Manik Surtani <manik at jboss.org>
>> Subject: Re: [infinispan-dev] HotRod, ClientIntelligence and client-side key location
>> To: "infinispan -Dev List" <infinispan-dev at lists.jboss.org>
>> Date: Friday, March 19, 2010, 9:31 AM
>> 
>> On 19 Mar 2010, at 14:20, Manik Surtani wrote:
>> 
>>> 
>>> On 18 Mar 2010, at 21:26, Alex Kluge wrote:
>>> 
>>>> Hi,
>>>> 
>>>> I wrestled with the same question when going down
>> this path.
>>>> 
>>>>> but the only way this can be meaningfully used
>> is if the client has the ability
>>>>> to calculate the hash code of the key in the
>> same manner the servers do.
>>>> 
>>>> Definitely the case. However, even if the client
>> gets it wrong, the
>>>> message should still be routed to the correct
>> server.
>>> 
>>> Yes, but if this is the norm rather than the exception
>> then there is little point in attempting client-side
>> hashing.
>>> 
>>>> 
>>>>> Firstly, this is hard when consumed by
>> non-Java clients as you'd need to
>>>>> implement the way the JDK calculates the hash
>> code of a byte array.
>>>> 
>>>> This is a much easier problem if you don't use the
>> built in hashing.
>>> 
>>> This is true.  The current impl simply calls
>> key.hashcode() and passes the result through a Wang/Jenkins
>> based bit spreader.  I suppose we could be smarter and
>> for keys which are byte arrays (and this will *always* be
>> the case if interacting via HotRod) something like FNV-1 or
>> SuperFastHash could be used.  I was even looking at
>> MurmurHash.
>>> 
>>>     http://sites.google.com/site/murmurhash/
>>> 
>>> We probably wouldn't even need a bit spreader in this
>> case, and a MurmurHash impls exist for several platforms.
>>> 
>>>     http://en.wikipedia.org/wiki/MurmurHash
>> 
>> Maybe MurmurHash isn't such a good idea.  A comment in
>> Austin Appleby's C++ impl:
>> 
>> // 2. It will not produce the same results on little-endian
>> and big-endian
>> //    machines.
>> 
>> So while JVMs shield you from CPU endian-ness, clients
>> would need to be run on machines of the same CPU-endian-ness
>> to make it work.
>> 
>> 
>>>> There are
>>>> a number of hash algorithms that can be used,
>> including 
>>>> FNV 1 (http://www.isthe.com/chongo/tech/comp/fnv/)
>>>> and others http://www.azillionmonkeys.com/qed/hash.html.
>>>> 
>>>> These are implementable in other languages, are
>> fast, and provide good distributions of
>>>> results. We can use, and similarly document, an
>> integer hash used to further spread the
>>>> hash values if needed. If these are chosen to be
>> implementable in multiple languages,
>>>> clearly documented, and don't change too often, it
>> should be reasonable to put them into
>>>> the client.
>>>> 
>>>> Using this approach removes the dependency on the
>> hash that the VM happens to be
>>>> using. Indeed, the hash for a byte array may
>> simply be the address of the array, which
>>>> makes it very poor for our use.
>>>>              
>>                
>>                
>>                
>>      Alex
>>>> 
>>>> --- On Thu, 3/18/10, Manik Surtani <manik at jboss.org>
>> wrote:
>>>> 
>>>>> From: Manik Surtani <manik at jboss.org>
>>>>> Subject: [infinispan-dev] HotRod,
>> ClientIntelligence and client-side key location
>>>>> To: "infinispan -Dev List" <infinispan-dev at lists.jboss.org>
>>>>> Date: Thursday, March 18, 2010, 11:59 AM
>>>>> I've been thinking about how we
>>>>> handle this, and I think we have a problem
>> with smart
>>>>> clients where clients have the ability to
>> locate the key on
>>>>> the server cluster in order to direct the
>> request to the
>>>>> specific node.
>>>>> 
>>>>> The problem is in hash code calculation. 
>> The HotRod
>>>>> protocol caters for this with regards to
>> calculating node
>>>>> address hash code by passing this in the
>> topology map (see
>>>>> "Hasher Client Topology Change Header" in
>> [1]), but the only
>>>>> way this can be meaningfully used is if the
>> client has the
>>>>> ability to calculate the hash code of the key
>> in the same
>>>>> manner the servers do.  Firstly, this is
>> hard when
>>>>> consumed by non-Java clients as you'd need to
>> implement the
>>>>> way the JDK calculates the hash code of a byte
>> array. 
>>>>> Second, you'd need detailed and specific
>> knowledge of any
>>>>> bit spreading that takes place within
>> Infinispan - and this
>>>>> is internal implementation detail which may
>> change from
>>>>> release to release.
>>>>> 
>>>>> So the way I see it I can't see how non-Java
>> clients will
>>>>> be able to locate keys and then direct
>> requests to the
>>>>> necessary nodes.  In fact, even with Java
>> clients the
>>>>> only way this could be done would be to send
>> back marshalled
>>>>> Addresses in the topology map, *and* have the
>> same version
>>>>> of the Infinispan server libs installed on the
>> client, *and*
>>>>> ensure that the same JDK/JVM version is used
>> on the
>>>>> client.  
>>>>> 
>>>>> Can we think of a better way to do this? 
>> If not, is
>>>>> it worth still supporting client-side
>> consistent hash based
>>>>> key location for the weird but vaguely
>> workable scenario for
>>>>> Java-based clients?
>>>>> 
>>>>> Thoughts?
>>>>> 
>>>>> Cheers
>>>>> Manik
>>>>> 
>>>>> 
>>>>> [1] http://community.jboss.org/wiki/HotRodProtocol
>>>>> --
>>>>> Manik Surtani
>>>>> manik at jboss.org
>>>>> Lead, Infinispan
>>>>> Lead, JBoss Cache
>>>>> http://www.infinispan.org
>>>>> http://www.jbosscache.org
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>> _______________________________________________
>>>>> infinispan-dev mailing list
>>>>> infinispan-dev at lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> _______________________________________________
>>>> infinispan-dev mailing list
>>>> infinispan-dev at lists.jboss.org
>>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>> 
>>> --
>>> Manik Surtani
>>> manik at jboss.org
>>> Lead, Infinispan
>>> Lead, JBoss Cache
>>> http://www.infinispan.org
>>> http://www.jbosscache.org
>>> 
>>> 
>>> 
>>> 
>> 
>> --
>> Manik Surtani
>> manik at jboss.org
>> Lead, Infinispan
>> Lead, JBoss Cache
>> http://www.infinispan.org
>> http://www.jbosscache.org
>> 
>> 
>> 
>> 
>> 
>> _______________________________________________
>> infinispan-dev mailing list
>> infinispan-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>> 
> 
> 
> 
> 
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev

--
Manik Surtani
manik at jboss.org
Lead, Infinispan
Lead, JBoss Cache
http://www.infinispan.org
http://www.jbosscache.org








More information about the infinispan-dev mailing list