package org.infinispan.xsite;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertNull;
import javax.transaction.TransactionManager;
import org.infinispan.commands.VisitableCommand;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.factories.ComponentRegistry;
import org.infinispan.factories.GlobalComponentRegistry;
import org.infinispan.manager.CacheContainer;
import org.testng.annotations.Test;
@Test(groups = "xsite", testName = "xsite.RollbackNoPrepareOptimisticTest")
public class RollbackNoPrepareOptimisticTest extends AbstractTwoSitesTest {
public RollbackNoPrepareOptimisticTest() {
use2Pc = true;
}
public void testRollbackNoCommit() throws Throwable {
String key = key("LON");
String val = val("LON");
ComponentRegistry cr = backup("LON").getAdvancedCache().getComponentRegistry();
GlobalComponentRegistry gcr = cr.getGlobalComponentRegistry();
BackupReceiverRepositoryImpl brr = (BackupReceiverRepositoryImpl) gcr.getComponent(BackupReceiverRepository.class);
BackupReceiver backupCacheManager = brr.getBackupReceiver("LON", CacheContainer.DEFAULT_CACHE_NAME);
BackupReceiverWrapper brWrapper = new BackupReceiverWrapper(backupCacheManager);
brr.replace("LON", CacheContainer.DEFAULT_CACHE_NAME, brWrapper);
assertNull(brWrapper.received);
cache("LON", 0).put(key, val);
assertNotNull(brWrapper.received);
assertEquals(backup("LON").get(key), val);
brWrapper.received = null;
TransactionManager tmLon0 = cache("LON", 0).getAdvancedCache().getTransactionManager();
assertNull(brWrapper.received);
tmLon0.begin();
cache("LON", 0).put(key, val);
log.trace("Before rollback!");
tmLon0.rollback();
assertNull(brWrapper.received);
}
public class BackupReceiverWrapper extends BackupReceiverDelegator {
volatile VisitableCommand received;
public BackupReceiverWrapper(BackupReceiver br) {
super(br);
}
@Override
public Object handleRemoteCommand(VisitableCommand command) throws Throwable {
received = command;
return super.handleRemoteCommand(command);
}
}
@Override
protected ConfigurationBuilder getNycActiveConfig() {
return getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, true);
}
@Override
protected ConfigurationBuilder getLonActiveConfig() {
return getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, true);
}
}