2 Replies Latest reply on May 15, 2013 5:36 PM by cotton.ben

    How to get Grouper<T>#computeGroup(key) return value to map to physical Node?

    cotton.ben

      What 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?