How to get Grouper<T>#computeGroup(key) return value to map to physical Node?
cotton.ben May 15, 2013 10:40 AMWhat is the relationship of physical nodes executing on an infinispan grid and their associated 'Group' identity? Can I configure 1 group = 1 node? Where is this documented?
I am playing with the Infinispan 5.3 quick-start package to exercise my usage of the Grouping API. As we know the quick start package is made up of AbstractNode.java, Node0.java, Node1.java and Node2.java (plus a util/listener).
My ambition is to demonstrate
1. that any Cache<K,V>.put("DIMENSION.xxx",v) will flow through my Grouper and "pin" that key in the Cache at @Node=0.
2. that any Cache<K,V>.put("POSITION.xxx",v) will flow through my Grouper and "pin" that key in the Cache at either @Node=1 or @Node=2 .
Here is my AbstractNode#createCacheManagerProgramatically() config:
private static EmbeddedCacheManager createCacheManagerProgramatically() {
return new DefaultCacheManager(
GlobalConfigurationBuilder.defaultClusteredBuilder()
.transport().addProperty("configurationFile", "jgroups.xml")
.build(),
new org.infinispan.configuration.cache.ConfigurationBuilder()
.clustering()
.cacheMode(CacheMode.DIST_SYNC)
.hash().numOwners(1).groups().enabled(Boolean.TRUE)
.addGrouper(new com.jpmorgan.ct.lri.cs.ae.test.DimensionGrouper<String>())
.build()
);
}
And here is my Grouper<T> implementation
public class DimensionGrouper<T> implements Grouper<String> {
public String computeGroup(String key, String group) {
if (key.indexOf("DIMENSION.")==0) {
String groupPinned = "0";
System.out.println("Pinning Key=["+key+"] @Node=["+groupPinned+"]"); //node= exactly 0
return groupPinned;
} else if (key.indexOf("POSITION.")==0) {
String groupPinned = ""+(1+ (int)(Math.random()*2));
System.out.println("Pinning Key=["+key+"] @Node=["+groupPinned+"]"); //node= {1,2}
return groupPinned;
} else {
return null;
}
}
public Class<String> getKeyType() {
return String.class;
}
}
The "logic" is working correctly ... i.e. when from Node2.java I call
for (int i = 0; i < 10; i++) {
cacheDP.put("DIMENSION." + i, "DimensionValue." + i);
cacheDP.put("POSITION." + i, "PositionValue." + i);
}
My DimensionGrouper is returning "0" from computeGroup(). My question is how in Infinispan can I map the computeGroup() return value to a physical Node? I.e. How can I make it so that when computeGroup() returns "0", I will *only* add that <K,V> entry to the Cache @Node 0?