Search code examples
gridgain

primaryValues behave not as expected


In our poc, we have a cache in PARTIONED MODE, with 2 backups, and we started 3 nodes. 100 entries were loaded into cache and we did below steps to retrive it.

public void  perform () throws GridException {
         final  GridCache<Long, Entity> cache= g.cache("cache");
         GridProjection proj= g.forCache("cache");

         Collection< Collection<Entity>> list= proj .compute().broadcast(
                 new GridCallable< Collection<Entity>>() {
             @Override public Collection<Entity> call() throws Exception {

                 Collection<Entity> values= cache.primaryValues();

                 System.out.println("List size on each Node: "+ values.size());
                   // console from each node shows 28,38,34 respectively, which is correct

                 return values;
             }
         }).get(); 

       for (Collection<Entity> e: list){
           System.out.println("list size when arrives on main Node :"+ e.size());
//console shows 28 for three times, which is not correct
       }
}

I assume that primaryValues() is to take value of each element returned by primaryEntrySet() out and put into a Collection. I also tried to use primaryEntrySet and it works without such problem.


Solution

  • The way GridGain serializes cache collections is by reference which may not be very intuitive. I have filed a Jira issue with Apache Ignite project (which is the next version of GridGain open source edition): https://issues.apache.org/jira/browse/IGNITE-38

    In the mean time, please try the following from your GridCallable, which should work:

    return new ArrayList(cache.primaryValues());