[infinispan-issues] [JBoss JIRA] (ISPN-9412) HotRod Transaction Cache PESSIMISTIC locking mode is not locking the key in another transaction
Diego Lovison (JIRA)
issues at jboss.org
Wed Aug 8 12:01:00 EDT 2018
[ https://issues.jboss.org/browse/ISPN-9412?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13616550#comment-13616550 ]
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)
More information about the infinispan-issues
mailing list