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);
}
}
```