[
https://issues.jboss.org/browse/ISPN-9412?page=com.atlassian.jira.plugin....
]
Diego Lovison commented on ISPN-9412:
-------------------------------------
The pseudo-code above is not easy to reproduce and I used System.out.println(new Date())
in a sample application to be able to find this bug.
I would like to be able to reproduce this error in an integration test.
I created the method `public void testMultiThreadsPessimisticLockMode(Method method)` in
the class `TxFunctionalTest`
{code:java}
public void testMultiThreadsPessimisticLockMode(Method method) throws
ExecutionException, InterruptedException {
final K k1 = kvGenerator.generateKey(method, 1);
final V v1 = kvGenerator.generateValue(method, 1);
final V v2 = kvGenerator.generateValue(method, 2);
RemoteCache<K, V> remoteCache = remoteCacheWithForceReturnValue();
final TransactionManager tm = remoteCache.getTransactionManager();
ExecutorService executorService = Executors.newFixedThreadPool(2);
Future<V> f1 = executorService.submit(() -> {
try {
tm.begin();
V returnValue = remoteCache.put(k1, v1);
Thread.sleep(2000);
tm.commit();
return returnValue;
} catch (Throwable t) {
try {
tm.rollback();
} catch (SystemException e) {
throw new IllegalStateException(e);
}
throw new IllegalStateException(t);
}
});
Future<V> f2 = executorService.submit(() -> {
try {
Thread.sleep(500);
tm.begin();
V returnValue = remoteCache.put(k1, v2);
tm.commit();
return returnValue;
} catch (Throwable t) {
try {
tm.rollback();
} catch (SystemException e) {
throw new IllegalStateException(e);
}
throw new IllegalStateException(t);
}
});
Assert.assertNull(f1.get());
Assert.assertNotNull(f2.get());
}
{code}
The problem is that my integration test is failing due:
{noformat}
java.util.concurrent.ExecutionException: java.lang.IllegalStateException:
BaseTransaction.rollback - ARJUNA016074: no transaction!
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at
org.infinispan.client.hotrod.tx.TxFunctionalTest.testMultiThreadsPessimisticLockMode(TxFunctionalTest.java:456)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
at
org.testng.internal.MethodInvocationHelper$1.runTestMethod(MethodInvocationHelper.java:196)
at org.infinispan.commons.test.TestNGLongTestsHook.run(TestNGLongTestsHook.java:24)
at
org.testng.internal.MethodInvocationHelper.invokeHookable(MethodInvocationHelper.java:208)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:635)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:816)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1124)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:774)
at org.testng.TestRunner.run(TestRunner.java:624)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:359)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:312)
at org.testng.SuiteRunner.run(SuiteRunner.java:261)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1215)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.run(TestNG.java:1048)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
Caused by: java.lang.IllegalStateException: BaseTransaction.rollback - ARJUNA016074: no
transaction!
at
com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.rollback(BaseTransaction.java:139)
at
org.infinispan.client.hotrod.tx.TxFunctionalTest.lambda$testMultiThreadsPessimisticLockMode$0(TxFunctionalTest.java:432)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
{noformat}
Here is the branch:
https://github.com/diegolovison/infinispan/tree/ISPN_9412_pessimistic_lock
HotRod Transaction Cache PESSIMISTIC locking mode is not locking the
key in another transaction
-----------------------------------------------------------------------------------------------
Key: ISPN-9412
URL:
https://issues.jboss.org/browse/ISPN-9412
Project: Infinispan
Issue Type: Bug
Reporter: Diego Lovison
Priority: Critical
I am expecting the thread 2 be blocked in `cache.put(k1, v1)` until thread 1 has
committed the transaction
According to the docs, using Pessimistic transactional cache, when cache.put(k1,v1)
returns, k1 is locked and no other transaction running anywhere in the cluster can write
to it. Reading k1 is still possible. The lock on k1 is released when the transaction
completes (commits or rollbacks).
Cache Configuration
{code:java}
return new org.infinispan.configuration.cache.ConfigurationBuilder()
.clustering().cacheMode(CacheMode.DIST_SYNC)
.jmxStatistics().enable()
.transaction()
.cacheStopTimeout(0L)
.transactionManagerLookup(new EmbeddedTransactionManagerLookup())
.lockingMode(LockingMode.PESSIMISTIC)
.locking().isolationLevel(IsolationLevel.REPEATABLE_READ)
.build();
{code}
Steps to reproduce
{noformat}
Thread t1 = {
tm.begin()
cache.put(k1, v1)
long operation like 1 minute
tm.commit()
}
Thread t2 = {
long operation like 15 seconds
tm.begin()
cache.put(k1, v1)
tm.commit()
}
t1.start()
t2.start()
{noformat}
--
This message was sent by Atlassian JIRA
(v7.5.0#75005)