Skip to content

Commit

Permalink
ISPN-13461 Cache should stop if the initial state transfer times out
Browse files Browse the repository at this point in the history
  • Loading branch information
wburns authored and tristantarrant committed Sep 27, 2022
1 parent 8f26523 commit 2856ff9
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 1 deletion.
8 changes: 7 additions & 1 deletion core/src/main/java/org/infinispan/cache/impl/CacheImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -1009,7 +1009,13 @@ public void start() {
componentRegistry.start();

if (stateTransferManager != null) {
stateTransferManager.waitForInitialStateTransferToComplete();
try {
stateTransferManager.waitForInitialStateTransferToComplete();
} catch (Throwable t) {
log.debugf("Stopping cache as exception encountered waiting for state transfer", t);
componentRegistry.stop();
throw t;
}
}
log.debugf("Started cache %s on %s", getName(), managerIdentifier());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

import javax.transaction.SystemException;
import javax.transaction.TransactionManager;

import org.infinispan.Cache;
import org.infinispan.commons.test.Exceptions;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.protostream.SerializationContextInitializer;
import org.infinispan.protostream.annotations.AutoProtoSchemaBuilder;
Expand All @@ -21,8 +24,10 @@
import org.infinispan.test.MultipleCacheManagersTest;
import org.infinispan.test.TestingUtil;
import org.infinispan.test.data.DelayedMarshallingPojo;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.infinispan.test.fwk.TransportFlags;
import org.infinispan.transaction.LockingMode;
import org.infinispan.util.concurrent.TimeoutException;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
import org.testng.annotations.Test;
Expand Down Expand Up @@ -265,6 +270,35 @@ public void testInitialStateTransferAfterRestart(Method m) throws Exception {
logTestEnd(m);
}

public void testStateTransferException(Method m) {
testCount++;
logTestStart(m);

Cache<Object, Object> cache1;
cache1 = createCacheManager(cacheName).getCache(cacheName);
writeInitialData(cache1);

GlobalConfigurationBuilder globalBuilder = defaultGlobalConfigurationBuilder();
if (sci != null) globalBuilder.serialization().addContextInitializer(sci);

EmbeddedCacheManager embeddedCacheManager = TestCacheManagerFactory.createClusteredCacheManager(false,
// Use an empty configuration builder
globalBuilder, new ConfigurationBuilder(), new TransportFlags().withMerge(true));
amendCacheManagerBeforeStart(embeddedCacheManager);
embeddedCacheManager.start();

ConfigurationBuilder configToUse = new ConfigurationBuilder();
configToUse.read(configurationBuilder.build())
.clustering().remoteTimeout(1, TimeUnit.NANOSECONDS).stateTransfer().timeout(1, TimeUnit.NANOSECONDS);

assertEquals(1, cache1.getAdvancedCache().getDistributionManager().getCacheTopology().getMembers().size());

embeddedCacheManager.defineConfiguration(cacheName, configToUse.build());
Exceptions.expectException(TimeoutException.class, () -> embeddedCacheManager.getCache(cacheName));

assertEquals(1, cache1.getAdvancedCache().getDistributionManager().getCacheTopology().getMembers().size());
}

private void logTestStart(Method m) {
logTestLifecycle(m, "start");
}
Expand Down

0 comments on commit 2856ff9

Please sign in to comment.