[jboss-user] [JBossCache] - Unexpected (?) TimeoutException

jacek187 do-not-reply at jboss.com
Thu Aug 16 18:15:12 EDT 2007


Could anybody tel me, why I got TimeoutException when 2 Threads are executing this code?


  | 				for (int x = 0; x < 1000; x++) {
  | 					tm.begin();
  | 					System.out.println("R" + Thread.currentThread().getName());
  | 					//inside transaction
  | 					cache.remove("/a");
  | 					System.out.println("AR" + Thread.currentThread().getName());
  | 					tm.commit();
  | 					//outside transaction
  | 					System.out.println("P" + Thread.currentThread().getName());
  | 					cache.putObject("/a/b/c/d", "text"+x);
  | 					System.out.println("AP" + Thread.currentThread().getName());
  | 				}
  | 

Console Output:
RThread:0
RThread:1
ARThread:1
ARThread:0
PThread:1
PThread:0
APThread:1
RThread:1

org.jboss.cache.lock.TimeoutException: failure acquiring lock: fqn=/a, caller=GlobalTransaction::3, lock=read owners=[GlobalTransaction::3], write owner=GlobalTransaction::5 (org.jboss.cache.lock.LockStrategyReadCommitted at d02b51)
	at org.jboss.cache.Node.acquire(Node.java:500)
	at org.jboss.cache.interceptors.PessimisticLockInterceptor.acquireNodeLock(PessimisticLockInterceptor.java:379)
	at org.jboss.cache.interceptors.PessimisticLockInterceptor.lock(PessimisticLockInterceptor.java:307)
	at 
(...)

Complete code:

  | package org.jboss.cache.aop;
  | 
  | import java.util.ArrayList;
  | import java.util.List;
  | 
  | import javax.transaction.TransactionManager;
  | 
  | import junit.framework.TestCase;
  | 
  | import org.jboss.cache.DummyTransactionManagerLookup;
  | import org.jboss.cache.TreeCache;
  | import org.jboss.cache.lock.IsolationLevel;
  | 
  | public class ConcurentPutRemoveTest extends TestCase {
  | 
  | 	private TransactionManager tm;
  | 
  | 	public ConcurentPutRemoveTest(String s) {
  | 		super(s);
  | 	}
  | 
  | 	private PojoCache cache;
  | 
  | 	protected void setUp() throws Exception {
  | 		cache = new PojoCache();
  | 		cache.setCacheMode(TreeCache.LOCAL);
  | 		cache.setIsolationLevel(IsolationLevel.READ_COMMITTED);
  | 		cache.setTransactionManagerLookup(new DummyTransactionManagerLookup());
  | 		cache.setLockAcquisitionTimeout(10000);
  | 		cache.create();
  | 		cache.start();
  | 		tm = cache.getTransactionManager();
  | 	}
  | 
  | 	protected void tearDown() throws Exception {
  | 		super.tearDown();
  | 		cache.stop();
  | 		cache.destroy();
  | 	}
  | 
  | 	public void testLock() throws Exception {
  | 		List<SeparateThread> threads = new ArrayList<SeparateThread>();
  | 		for (int x = 0; x < 2; x++) {
  | 			SeparateThread t = new SeparateThread(x);
  | 			threads.add(t);
  | 			t.start();
  | 		}
  | 		for (SeparateThread separateThread : threads) {
  | 			separateThread.join();
  | 			if (separateThread.getException() != null) {
  | 				throw separateThread.getException();
  | 			}
  | 		}
  | 
  | 	}
  | 
  | 	private class SeparateThread extends Thread {
  | 		Exception e = null;
  | 
  | 		private int num = 0;
  | 
  | 		public SeparateThread(int num) {
  | 			this.num = num;
  | 		}
  | 
  | 		public Exception getException() {
  | 			return e;
  | 		}
  | 
  | 		public void run() {
  | 			Thread.currentThread().setName("Thread:" + num);
  | 			try {
  | 				for (int x = 0; x < 1000; x++) {
  | 					tm.begin();
  | 					System.out.println("R" + Thread.currentThread().getName());
  | 					//inside transaction
  | 					cache.remove("/a");
  | 					System.out.println("AR" + Thread.currentThread().getName());
  | 					tm.commit();
  | 					//outside transaction
  | 					System.out.println("P" + Thread.currentThread().getName());
  | 					cache.putObject("/a/b/c/d", "text"+x);
  | 					System.out.println("AP" + Thread.currentThread().getName());
  | 				}
  | 			} catch (Exception e) {
  | 				this.e = e;
  | 			}
  | 		}
  | 	}
  | 
  | }
  | 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4075025#4075025

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4075025



More information about the jboss-user mailing list