Author: manik.surtani(a)jboss.com
Date: 2009-02-19 07:48:29 -0500 (Thu, 19 Feb 2009)
New Revision: 7729
Added:
core/branches/3.0.X/src/test/java/org/jboss/cache/loader/deadlock/ConcurrentReadsDeadlockTest.java
Log:
JBCACHE-1479 - added test
Added:
core/branches/3.0.X/src/test/java/org/jboss/cache/loader/deadlock/ConcurrentReadsDeadlockTest.java
===================================================================
---
core/branches/3.0.X/src/test/java/org/jboss/cache/loader/deadlock/ConcurrentReadsDeadlockTest.java
(rev 0)
+++
core/branches/3.0.X/src/test/java/org/jboss/cache/loader/deadlock/ConcurrentReadsDeadlockTest.java 2009-02-19
12:48:29 UTC (rev 7729)
@@ -0,0 +1,84 @@
+/*
+ *
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at
gnu.org.
+ */
+
+package org.jboss.cache.loader.deadlock;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.cache.AbstractSingleCacheTest;
+import org.jboss.cache.CacheSPI;
+import org.jboss.cache.DefaultCacheFactory;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.config.CacheLoaderConfig;
+import org.jboss.cache.config.Configuration;
+import org.jboss.cache.factories.UnitTestConfigurationFactory;
+import org.jboss.cache.loader.testloaders.DummyInMemoryCacheLoader;
+import org.jboss.cache.lock.IsolationLevel;
+import org.jboss.cache.transaction.TransactionSetup;
+import org.testng.annotations.Test;
+
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
+@Test(groups = {"functional", "transaction"}, sequential = true,
enabled = true, testName = "loader.deadlock.ConcurrentReadsDeadlockTest")
+public class ConcurrentReadsDeadlockTest extends AbstractSingleCacheTest {
+ final Fqn NODE = Fqn.fromString("/a");
+ final Log log = LogFactory.getLog(ConcurrentReadsDeadlockTest.class);
+
+ protected CacheSPI createCache() throws Exception {
+ Configuration c = new Configuration();
+ c.setCacheMode(Configuration.CacheMode.LOCAL);
+ c.setTransactionManagerLookupClass(TransactionSetup.getManagerLookup());
+ c.setIsolationLevel(IsolationLevel.READ_COMMITTED);
+ c.setLockAcquisitionTimeout(3000);
+ CacheLoaderConfig clc =
UnitTestConfigurationFactory.buildSingleCacheLoaderConfig(false, "",
DummyInMemoryCacheLoader.class.getName(), "", false, true, false, false,
false);
+
+ c.setCacheLoaderConfig(clc);
+ return (CacheSPI<String, String>) new DefaultCacheFactory<String,
String>().createCache(c, true);
+ }
+
+ /**
+ * Deadlock on two concurrent read transactions in the same thread.
+ */
+ public void testConcurrentReadDeadlock() throws Exception {
+ TransactionManager tm =
cache.getConfiguration().getRuntimeConfig().getTransactionManager();
+
+ tm.begin();
+ cache.put(NODE, "x", "x");
+ tm.commit();
+
+ // two loops just in case
+ for (int i = 0; i < 2; i++) {
+ try {
+ tm.begin();
+ Transaction t1 = tm.suspend();
+ tm.begin();
+ Transaction t2 = tm.suspend();
+
+ tm.resume(t1);
+ cache.getData(NODE);
+ tm.suspend();
+
+ tm.resume(t2);
+ cache.getData(NODE);
+ tm.suspend();
+
+ tm.resume(t1);
+ tm.rollback();
+
+ tm.resume(t2);
+ tm.rollback();
+ }
+ catch (Exception ex) {
+ Exception exx = new Exception("loop " + i + ": " +
ex.getMessage(), ex.getCause());
+ exx.setStackTrace(ex.getStackTrace());
+ throw exx;
+ }
+ }
+ }
+}