Hi,

I have a case where I'm trying to use Ignite (embedded i.e.: 
Ignition.getOrStart(igniteConfiguration) called in a Spring bean definition) in 
a multi-node Spring Boot application with active-active setup. My goal is to 
utilize Ignite as a shared, atomic, and persistent key-value store.
For this test case I have two application nodes running the same code and below 
is my Spring configuration class; yet I keep getting 
"CacheInvalidStateException: Failed to execute cache operation (all partition 
owners have left the grid, partition data has been lost) 
[cacheName=sequenceNumberCache, part=187, key=XXX.SequenceNumberKey@f3c5d51c]".

Can anyone shed some light on what I'm doing wrong? I understand that manual 
topology management is preferred for rebalancing concerns but considering I'm 
using the in fully replicated mode with native persistence, I see no harm 
(though am still suspicious) in calling cluster.active(true) as soon as app 
inits. I really would like to avoid any manual topology management, is there a 
better way of doing this?

Thanks in advance,
Cihan Keser


```
@Configuration
public class SequenceNumberStoreConfig {

    public static final String CACHE_NAME = "sequenceNumberCache";

    @Bean
    public Ignite igniteInstance(
            @Value("${ignite.workDir}") String workDir
    ) {
        CacheConfiguration<Integer, SequenceNumberKey> cacheConfiguration =
                new CacheConfiguration<>(CACHE_NAME);
        cacheConfiguration.setIndexedTypes(SequenceNumberKey.class, 
Integer.class);
        cacheConfiguration.setAtomicityMode(CacheAtomicityMode.ATOMIC);
        cacheConfiguration.setBackups(1);
        
cacheConfiguration.setWriteSynchronizationMode(CacheWriteSynchronizationMode.PRIMARY_SYNC);
        cacheConfiguration.setCacheMode(CacheMode.REPLICATED);
        
cacheConfiguration.setPartitionLossPolicy(PartitionLossPolicy.READ_WRITE_SAFE);
        cacheConfiguration.setReadFromBackup(true);
        cacheConfiguration.setRebalanceMode(CacheRebalanceMode.ASYNC);

        DataRegionConfiguration dataRegionConfiguration = new 
DataRegionConfiguration();
        dataRegionConfiguration.setPersistenceEnabled(true);

        DataStorageConfiguration dataStorageConfiguration = new 
DataStorageConfiguration();
        
dataStorageConfiguration.setDefaultDataRegionConfiguration(dataRegionConfiguration);
        dataStorageConfiguration.setWalMode(WALMode.FSYNC);

        TcpDiscoveryVmIpFinder tcpDiscoveryVmIpFinder = new 
TcpDiscoveryVmIpFinder();
        tcpDiscoveryVmIpFinder.setShared(true);
        tcpDiscoveryVmIpFinder.setAddresses(ImmutableList.of("node1", "node2"));

        TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
        discoverySpi.setIpFinder(tcpDiscoveryVmIpFinder);

        IgniteConfiguration igniteConfiguration = new IgniteConfiguration();
        igniteConfiguration.setCacheConfiguration(cacheConfiguration);
        igniteConfiguration.setDiscoverySpi(discoverySpi);
        
igniteConfiguration.setDataStorageConfiguration(dataStorageConfiguration);
        igniteConfiguration.setDeploymentMode(DeploymentMode.SHARED);
        igniteConfiguration.setWorkDirectory(workDir);
        igniteConfiguration.setGridLogger(new Slf4jLogger());
        igniteConfiguration.setClientMode(false);

        Ignite ignite = Ignition.getOrStart(igniteConfiguration);
        ignite.cluster().active(true);

        return ignite;
    }

    @Bean
    public SequenceNumberProvider sequenceNumberStore(Ignite ignite) {
        IgniteCache<SequenceNumberKey, Integer> igniteCache = 
ignite.getOrCreateCache(CACHE_NAME);
        return new SequenceNumberProvider(igniteCache);
    }

}
```

Reply via email to