[infinispan-dev] ISPN-232 - feedback needed
Mircea Markus
mircea.markus at jboss.com
Tue May 25 09:15:17 EDT 2010
On 25 May 2010, at 11:30, Manik Surtani wrote:
>
> On 24 May 2010, at 20:55, Brian Stansberry wrote:
>
>> On 05/24/2010 01:39 PM, Mircea Markus wrote:
>>> On 24 May 2010, at 19:30, Brian Stansberry wrote:
>>>
>>>> Thanks, Mircea:
>>>>
>>>> A related use case I need to cover[1] is checking whether an existing
>>>> key still hashes to the local node and if not, where it hashes. This may
>>>> not belong in KeyAffinityService, but I'd like it in some place easily
>>>> accessible to the same caller the creates KeyAffinityService.
>>>>
>>>> Set<Address> getAddressesForKey(K key)
>>>>
>>>> Usage:
>>>>
>>>> Set<Address> addresses = getAddressesForKey(sessionId);
>>>> if (!addresses.contains(localAddress)) {
>>>> redirectRequest(addresses);
>>>> }
>>>>
>>>> getAddressesForKey() could return a List<Address> but then checking
>>>> whether the local address is OK would require a scan. AIUI there
>>>> ordering in the set of DIST nodes is not meaningful, so a Set should be
>>>> fine.
>>> there's already something similar in the cache API:
>>> cache.getAdvancedCache().getDistributionManager().locate(Object
>>> key)::List<Address>
>>
>> Haha, I figured there was something, but was lazy. Thanks!
>>
>>> If you have many sessions(which I think is the case), then transforming
>>> the List in a Set is quicker indeed.
>>
>> Yes, this could be pretty heavily invoked. Although...
>>
>>> Taking the idea one step further, this would be an possibly useful
>>> service as well: a notification service, to which
>>> you register keys and listeners, and the service would call the listener
>>> whenever key's distribution is changed.
>>> Wdyt?
>>
>> That would be helpful. I was thinking this morning about how to avoid
>> calling getAddressesForKey() all the time (i.e. every request) and was
>> thinking of using a view change notification as a trigger to mark all
>> sessions as needing a check. What you propose would be more efficient
>> for me.
>
> Maybe, but what you described is precisely what we'd do, except that it would be the rehashing thread that does this.
>
>> But, I'd be concerned about an Infinispan thread that's needed
>> for doing a lot of critical work during a view change getting tied up
>> making a ton of notifications.
>
> ^^ Yeah that's my concern. If during a rehash we need to stop at every entry that is being moved and issue a notification, that could be costly and really slow down the rehashing process.
Can't we register an *async* notification listener on ViewChanged ?
>
>>
>>>>
>>>> Re: K getCollocatedKey(K otherKey) please note that for the AS use cases
>>>> I know of where colocation is helpful,
>>> I can't help but notice your American spelling of "colocation". I know,
>>> I know, you won a War :)
>>>> the colocated data will be stored
>>>> in separate Cache instances, while the KAS is scoped to a cache. The
>>>> method should still be helpful though, as long as the caches use the
>>>> same underlying CacheManager/Channel. It's up to the caller to check that.
>>>>
>>> agreed. All the caches associated to a CM share the same transport. They
>>> can potentially have different ConsistentHash functions though, that's
>>> why the service runs per Cache instance, rather than running per
>>> CacheManager instance.
>>>> On KeyAffinityServiceFactory, there's the bufferSize param:
>>>>
>>>> * @param keyBufferSize the number of generated keys per {@link
>>>> org.infinispan.remoting.transport.Address}.
>>>>
>>>> That implies the factory will maintain a buffer of keys for *all*
>>>> addresses, not just the local address. The use cases I'm concerned with,
>>>> the only address for which I want keys is the local one. Perhaps it
>>>> makes sense to offer a separate param for the local address buffer size?
>>>>
>>>> In a small cluster maintaining some keys in a buffer for irrelevant
>>>> addresses is no big deal, but for large clusters it may waste a fair
>>>> amount of memory.
>>> Good point! what about adding a new parameter to the factory's methods:
>>> Collection<Address> - to specify the list of addresses for which keys
>>> will be generated.
>>
>> Perhaps take Map<Address addr, Integer keyBufferSize> ?
>>
>> TBH, I can't think of a use case where you'd use different size buffers
>> (other than 0) for different addresses, but a map gives more imaginative
>> people flexibility.
>>
>> Hmm, for any use case where people are interested in particular
>> addresses other than the local address, they are vulnerable to view
>> changes introducing unexpected members. So, to be complete perhaps be a
>> default buffer size for members not specifically listed:
>>
>> public static <K,V> KeyAffinityService<K>
>> newKeyAffinityService(Cache<K,V> cache, ExecutorFactory ex, KeyGenerator
>> keyGenerator, Map<Address, Integer> keyBufferSizes, int
>> defaultKeyBufferSize) {
>>
>> Kind of complex! :-)
>
>>
>>> And another factory method that would transparently pass the local
>>> address to the previous method so that the caller won't be concerned
>>> with getting the local address.
>>>
>>
>> Sure, if you can come up with a signature for that isn't confusing vs.
>> the other factory methods. Otherwise I don't mind getting the local address.
>>
>>> Cheers,
>>> Mircea
>>>>
>>>> [1] https://jira.jboss.org/browse/JBAS-7853 plus a similar requirement
>>>> for EJB3 as discussed on https://community.jboss.org/docs/DOC-15052
>>>>
>>>>
>>>> On 05/24/2010 05:15 AM, Mircea Markus wrote:
>>>>> Hi,
>>>>>
>>>>> I've committed[1] the interfaces for the key-affinity service in
>>>>> ISPN-232.
>>>>> Would you mind taking a look and let me know what you think?
>>>>>
>>>>> Thanks!
>>>>> Mircea
>>>>>
>>>>> [1]
>>>>> http://anonsvn.jboss.org/repos/infinispan/trunk/core/src/main/java/org/infinispan/affinity/
>>>>> _______________________________________________
>>>>> infinispan-dev mailing list
>>>>> infinispan-dev at lists.jboss.org <mailto:infinispan-dev at lists.jboss.org>
>>>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>>
>>>>
>>>> --
>>>> Brian Stansberry
>>>> Lead, AS Clustering
>>>> JBoss by Red Hat
>>>> _______________________________________________
>>>> infinispan-dev mailing list
>>>> infinispan-dev at lists.jboss.org <mailto: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
>>
>>
>> --
>> Brian Stansberry
>> Lead, AS Clustering
>> JBoss by Red Hat
>> _______________________________________________
>> 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
>
>
>
>
>
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev
More information about the infinispan-dev
mailing list