package org.infinispan.tx.locking; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNull; import javax.transaction.Transaction; import org.infinispan.util.concurrent.IsolationLevel; import org.testng.annotations.Test; /** * @author Martin Gencur */ @Test(groups = "functional", testName = "tx.locking.SizeDistTxReadCommittedTest") public class SizeDistTxReadCommittedTest extends SizeDistTxRepeatableReadTest { public SizeDistTxReadCommittedTest() { isolation = IsolationLevel.READ_COMMITTED; } /** * Manifestation of inconsistent behaviour of READ_COMMITTED mode. More information * in https://issues.jboss.org/browse/ISPN-4910 and in comments below. */ @Override public void testSizeWithPreviousRead() throws Exception { preloadCacheAndCheckSize(); tm(0).begin(); //make sure we read k1 in this transaction assertEquals("v1", cache(0).get(k1)); final Transaction tx1 = tm(0).suspend(); //another tx working on the same keys tm(0).begin(); //remove the key that was previously read in another tx cache(0).remove(k1); cache(0).put(k0, "v2"); tm(0).commit(); tm(0).resume(tx1); //We read k1 earlier and in READ_COMMITTED mode, the size() method should return the most //up-to-date size. However, the current transaction does not see the parallel changes //and still returns incorrect size == 2. The expected size would be 1. //assertEquals(1, cache(0).size()); //This assertion would fail assertEquals(2, cache(0).size()); assertEquals("v2", cache(0).get(k0)); //The current transaction does not see changes made to k1 in the parallel transaction. //As a result, the get() operation returns k1 instead of expected null. //assertNull(cache(0).get(k1)); //This assertion would fail assertEquals("v1", cache(0).get(k1)); tm(0).commit(); assertNull(cache(1).get(k1)); } @Override public void testSizeWithReadFromRemoteNode() throws Exception { preloadCacheAndCheckSize(); tm(0).begin(); assertEquals("v1", cache(0).get(k1)); assertEquals(2, cache(0).size()); tm(0).rollback(); } }