From 30f1779a952d957b4093360ecd9ad497dd5c448e Mon Sep 17 00:00:00 2001 From: Britt Park Date: Tue, 4 Jul 2006 17:05:12 +0000 Subject: [PATCH] Turned off pessimistic locking as now, for some reason I can't fathom, they don't seem to prevent deadlocks. Also made HibernateTxn derive from HibernateTemplate, mostly to be able to sort out recoverable and non-recoverable DB exceptions. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3279 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/repo/avm/DirectoryNodeImpl.java | 4 +- .../alfresco/repo/avm/SuperRepository.java | 7 +- .../repo/avm/hibernate/HibernateTxn.java | 73 +++++++++---------- 3 files changed, 39 insertions(+), 45 deletions(-) diff --git a/source/java/org/alfresco/repo/avm/DirectoryNodeImpl.java b/source/java/org/alfresco/repo/avm/DirectoryNodeImpl.java index dec6c2aad0..20dd7c840b 100644 --- a/source/java/org/alfresco/repo/avm/DirectoryNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/DirectoryNodeImpl.java @@ -58,8 +58,8 @@ abstract class DirectoryNodeImpl extends AVMNodeImpl implements DirectoryNode { // TODO This may be very Dangerous! Session sess = SuperRepository.GetInstance().getSession(); - ChildEntry entry = (ChildEntry)sess.get(ChildEntryImpl.class, new ChildEntryImpl(name, this, null), - (write && getIsNew()) ? LockMode.UPGRADE : LockMode.READ); + ChildEntry entry = (ChildEntry)sess.get(ChildEntryImpl.class, new ChildEntryImpl(name, this, null)); + // (write && getIsNew()) ? LockMode.UPGRADE : LockMode.READ); return entry; } diff --git a/source/java/org/alfresco/repo/avm/SuperRepository.java b/source/java/org/alfresco/repo/avm/SuperRepository.java index ef1dbed174..c23326c77c 100644 --- a/source/java/org/alfresco/repo/avm/SuperRepository.java +++ b/source/java/org/alfresco/repo/avm/SuperRepository.java @@ -440,7 +440,6 @@ class SuperRepository for (String repName : repositories) { Repository repo = getRepositoryByName(repName, true); - fSession.get().lock(repo, LockMode.UPGRADE); // fSession.get().lock(repo, LockMode.UPGRADE); result.add(repo.createSnapshot()); } @@ -455,7 +454,7 @@ class SuperRepository public int createSnapshot(String repository) { Repository repo = getRepositoryByName(repository, true); - fSession.get().lock(repo, LockMode.UPGRADE); +// fSession.get().lock(repo, LockMode.UPGRADE); // fSession.get().lock(repo, LockMode.UPGRADE); return repo.createSnapshot(); } @@ -716,8 +715,8 @@ class SuperRepository private Repository getRepositoryByName(String name, boolean write) { Repository rep = (Repository)fSession.get().get(RepositoryImpl.class, - name, LockMode.READ /*, - write ? LockMode.UPGRADE : LockMode.READ*/); + name); /* LockMode.READ , + write ? LockMode.UPGRADE : LockMode.READ); */ if (rep == null) { throw new AVMNotFoundException("Repository not found: " + name); diff --git a/source/java/org/alfresco/repo/avm/hibernate/HibernateTxn.java b/source/java/org/alfresco/repo/avm/hibernate/HibernateTxn.java index 295bf7de70..65fa8bb5b9 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/HibernateTxn.java +++ b/source/java/org/alfresco/repo/avm/hibernate/HibernateTxn.java @@ -22,6 +22,7 @@ import java.util.Random; import org.alfresco.repo.avm.AVMException; import org.alfresco.repo.avm.AVMNotFoundException; import org.hibernate.HibernateException; +import org.hibernate.JDBCException; import org.hibernate.ObjectNotFoundException; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -29,12 +30,16 @@ import org.hibernate.StaleStateException; import org.hibernate.Transaction; import org.hibernate.exception.GenericJDBCException; import org.hibernate.exception.LockAcquisitionException; +import org.springframework.dao.DataRetrievalFailureException; +import org.springframework.dao.DeadlockLoserDataAccessException; +import org.springframework.dao.OptimisticLockingFailureException; +import org.springframework.orm.hibernate3.HibernateTemplate; /** * Helper for DAOs. * @author britt */ -public class HibernateTxn +public class HibernateTxn extends HibernateTemplate { /** * The SessionFactory. @@ -61,6 +66,7 @@ public class HibernateTxn */ public void setSessionFactory(SessionFactory factory) { + super.setSessionFactory(factory); fSessionFactory = factory; } @@ -97,59 +103,48 @@ public class HibernateTxn { // Do nothing. } - // If we've lost a race or we've deadlocked, retry. - if (t instanceof StaleStateException || - t instanceof GenericJDBCException || - t instanceof LockAcquisitionException) + // Translate the exception. + if (t instanceof JDBCException) { - if (t instanceof StaleStateException) + t = convertJdbcAccessException((JDBCException)t); + } + else if (t instanceof HibernateException) + { + t = convertHibernateAccessException((HibernateException)t); + } + // If we've lost a race or we've deadlocked, retry. + if (t instanceof DeadlockLoserDataAccessException) + { + try { -// System.err.println("Lost Race"); -// StackTraceElement [] stack = t.getStackTrace(); -// long threadID = Thread.currentThread().getId(); -// for (StackTraceElement frame : stack) -// { -// System.err.println(threadID + " " + frame); -// } + long interval; + synchronized (fRandom) + { + interval = fRandom.nextInt(1000); + } + Thread.sleep(interval); + continue; } - else + catch (InterruptedException ie) { -// System.err.println("Deadlock"); -// StackTraceElement [] stack = t.getStackTrace(); -// long threadID = Thread.currentThread().getId(); -// for (StackTraceElement frame : stack) -// { -// System.err.println(threadID + " " + frame); -// } - try - { - long interval; - synchronized (fRandom) - { - interval = fRandom.nextInt(1000); - } - Thread.sleep(interval); - continue; - } - catch (InterruptedException ie) - { - // Do nothing. - } + // Do nothing. } continue; } + if (t instanceof OptimisticLockingFailureException) + { + continue; + } } if (t instanceof AVMException) { throw (AVMException)t; } - // TODO Crack t into more useful exception types. - // Otherwise nothing we can do except throw. - if (t instanceof ObjectNotFoundException) + if (t instanceof DataRetrievalFailureException) { throw new AVMNotFoundException("Object not found.", t); } - throw new AVMException("Unrecoverable error."); + throw new AVMException("Unrecoverable error.", t); } finally {