[jbosscache-dev] JBCACHE-471 - Handling JGroups MERGE

Manik Surtani manik at jboss.org
Wed Mar 19 09:24:01 EDT 2008


On 19 Mar 2008, at 10:00, Bela Ban wrote:
>
>
> Vladimir Blagojevic wrote:
>> Looking through JGroups merge code; there is a possibility of n-way  
>> merge so it is not always the case that we have a two way merge as  
>> suggested interface indicates. How about something like:
>>
>> public interface MergeHandler
>> {
>>   void handleMerge(Cache currentInstance, List<Address>  
>> preMergeView, List<Address> postMergeView);
>> }

How about:

	void handleMerge(Cache currentInstance, List<Address>  
mergedMembership, List<Address>... subPartitionMemberships)

where subPartitionMemberships will list each of the n sub groups being  
merged, the "winning" one being first?

>>
>>
>> Manik Surtani wrote:
>>> This was on 2.2.0's task list:
>>>
>>>    http://jira.jboss.com/jira/browse/JBCACHE-471
>>>
>>> The last time we spoke about this was in Neuchatel, and we decided  
>>> we'd expose an interface, a MergeHandler, that people could  
>>> implement.  We'd also provide a few standard implementations, like  
>>> EvictEntireClusterStateHandler and FatalStopMergeHandler?  I think  
>>> a SingleWinnerHandler  and DisjointedSubtreeMergeHandler can come  
>>> later, as they would both involve a proxying mechanism to talk to  
>>> remote caches being in place - something which will be developed  
>>> as a part of Partitioning [1].
>>>
>>> We didn't discuss the design of this interface - how about a  
>>> single callback with:
>>>
>>> public interface MergeHandler
>>> {
>>>    void handleMerge(Cache currentInstance, List<Address>  
>>> winningSubPartition, List<Address> losingSubPartition);
>>> }
>
> - Maybe we should have the ability to provide additional information  
> for each partition, maybe even for each node, provided by the app ?

How would this happen?  It would require a few levels of callback then  
- one to gather this extra info per instance, and another to deliver  
the handleMerge callback, with the info from all instances?

> - The notion of winning and losing partition implies that we're  
> using a winning-lossing partition merge, which may not be applicable.

True, plus as Vladimir suggested, there could be more than 2 subsets  
of the cluster.

> I suggest you come up with a number of scenarios you'd like to cover  
> in JBC and then we see what information is needed. Maybe  
> implementing this will make the interface clearer...

As far as JBC is concerned, I think we can only handle 2 scenarios  
effectively.

1.  EvictEntireClusterStateHandler
Each instance evicts it's local tree when it gets this.  A variation  
of this could do a remove instead of an evict (to clear local cache  
loader state as well).  Useful if the data exists elsewhere - e.g.,  
when used with Hibernate.

2.  FatalStopMergeHandler
Logs a fatal error and shuts down the cache when a merge is detected.

Anything else involves heuristics of how data is organised in the  
cache, which may result in corrupt state.  Maybe it is better to  
describe these approaches on a wiki and let people implement these  
handlers themselves.

Either way though, this discussion is to design the handler interface  
- as far as solutions 1 and 2 above are concerned, all you need is a  
reference to the current cache instance (to (1) evict all state or (2)  
stop the cache).  I just thought adding the views into the callback  
would help with users - armed with knowledge of their data  
organisation in the cache - achieve a more flexible approach to  
handling a merge.

Cheers,
--
Manik Surtani
Lead, JBoss Cache
manik at jboss.org









More information about the jbosscache-dev mailing list