I am using Ignite 2.6 version.

I am starting 3 server nodes with a replicated cache and 1 client node.
Cache configuration is as follows.
Read-through true on but write-through is false. Load data by key is
implemented as given below in cache-loader.

Steps to reproduce issue:
1) Delete an entry from cache using IgniteCache.remove() method. (Entry is
just removed from cache but present in DB as write-through is false)
2) Invoke IgniteCache.get() method for the same key in step 1.
3) Now query the cache from client node. Every invocation returns different
results.
Sometimes it returns reloaded entry, sometime returns the results
without reloaded entry.

Looks like read-through is not replicating the reloaded entry on all nodes
in case of REPLICATED cache.

So to investigate further I changed the cache mode to PARTITIONED and set
the backup count to 3 i.e. total number of nodes present in cluster (to
mimic REPLICATED behavior).
This time it worked as expected.
Every invocation returned the same result with reloaded entry.

*  private CacheConfiguration networkCacheCfg() {*



















*    CacheConfiguration networkCacheCfg = new
CacheConfiguration<>(CacheName.NETWORK_CACHE.name
<http://CacheName.NETWORK_CACHE.name>());
networkCacheCfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
networkCacheCfg.setWriteThrough(false);
networkCacheCfg.setReadThrough(true);
networkCacheCfg.setRebalanceMode(CacheRebalanceMode.ASYNC);
networkCacheCfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
  //networkCacheCfg.setBackups(3);
networkCacheCfg.setCacheMode(CacheMode.REPLICATED);
Factory<NetworkDataCacheLoader> storeFactory =
FactoryBuilder.factoryOf(NetworkDataCacheLoader.class);
networkCacheCfg.setCacheStoreFactory(storeFactory);
networkCacheCfg.setIndexedTypes(DefaultDataAffinityKey.class,
NetworkData.class);    networkCacheCfg.setSqlIndexMaxInlineSize(65);
RendezvousAffinityFunction affinityFunction = new
RendezvousAffinityFunction();
affinityFunction.setExcludeNeighbors(false);
networkCacheCfg.setAffinity(affinityFunction);
networkCacheCfg.setStatisticsEnabled(true);   //
networkCacheCfg.setNearConfiguration(nearCacheConfiguration());    return
networkCacheCfg;  }*

@Override
public V load(K k) throws CacheLoaderException {
    V value = null;
    DataSource dataSource = springCtx.getBean(DataSource.class);
    try (Connection connection = dataSource.getConnection();
         PreparedStatement statement =
connection.prepareStatement(loadByKeySql)) {
        //statement.setObject(1, k.getId());
        setPreparedStatement(statement,k);
        try (ResultSet rs = statement.executeQuery()) {
            if (rs.next()) {
                value = rowMapper.mapRow(rs, 0);
            }
        }
    } catch (SQLException e) {

        throw new CacheLoaderException(e.getMessage(), e);
    }

    return value;
}


Thanks,

Akash

Reply via email to