Repository: ode Updated Branches: refs/heads/ode-1.3.x 28085edc2 -> 3339a65f2
ODE-1033: incremented version number by holding DB exclusive lock Project: http://git-wip-us.apache.org/repos/asf/ode/repo Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/9760c4f2 Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/9760c4f2 Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/9760c4f2 Branch: refs/heads/ode-1.3.x Commit: 9760c4f252e21a539cc44be846d0f6a628d4373a Parents: 28085ed Author: sathwik <[email protected]> Authored: Tue Aug 18 12:52:25 2015 +0530 Committer: sathwik <[email protected]> Committed: Tue Aug 18 12:52:25 2015 +0530 ---------------------------------------------------------------------- .../org/apache/ode/store/ProcessStoreImpl.java | 27 ++++++++----- .../ode/store/hib/ConfStoreConnectionHib.java | 27 +++++++++---- .../ode/store/jpa/ConfStoreConnectionJpa.java | 40 +++++++++++++++----- .../store/jpa/DbConfStoreConnectionFactory.java | 1 + 4 files changed, 68 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ode/blob/9760c4f2/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java ---------------------------------------------------------------------- diff --git a/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java b/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java index 156a727..9a4c8d8 100644 --- a/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java +++ b/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java @@ -102,7 +102,7 @@ public class ProcessStoreImpl implements ProcessStore { */ private DataSource _inMemDs; - + private static final ThreadLocal<Long> _currentVersion = new ThreadLocal<Long>(); public ProcessStoreImpl() { this(null, null, "", new OdeConfigProperties(new Properties(), ""), true); @@ -190,18 +190,19 @@ public class ProcessStoreImpl implements ProcessStore { // Create the DU and compile/scan it before acquiring lock. final DeploymentUnitDir du = new DeploymentUnitDir(deploymentUnitDirectory); if( duName != null ) { - // Override the package name if given from the parameter - du.setName(duName); + // Override the package name if given from the parameter + du.setName(duName); } long version; if (autoincrementVersion || du.getStaticVersion() == -1) { // Process and DU use a monotonically increased single version number by default. - version = exec(new Callable<Long>() { - public Long call(ConfStoreConnection conn) { - return conn.getNextVersion(); - } - }); + try { + version = getCurrentVersion(); + } finally { + //we need to reset the current version thread local value. + _currentVersion.set(null); + } } else { version = du.getStaticVersion(); @@ -299,7 +300,7 @@ public class ProcessStoreImpl implements ProcessStore { newDao.setProperty(prop.getKey(), DOMUtils.domToString(prop.getValue())); } deployed.add(pc.getProcessId()); - conn.setVersion(pc.getVersion()); + } catch (Throwable e) { String errmsg = "Error persisting deployment record for " + pc.getProcessId() + "; process will not be available after restart!"; @@ -586,12 +587,18 @@ public class ProcessStoreImpl implements ProcessStore { } public long getCurrentVersion() { + if (_currentVersion.get() != null){ + return _currentVersion.get(); + } + long version = exec(new Callable<Long>() { public Long call(ConfStoreConnection conn) { return conn.getNextVersion(); } }); - return version; + + _currentVersion.set(version); + return _currentVersion.get(); } protected void fireEvent(ProcessStoreEvent pse) { http://git-wip-us.apache.org/repos/asf/ode/blob/9760c4f2/bpel-store/src/main/java/org/apache/ode/store/hib/ConfStoreConnectionHib.java ---------------------------------------------------------------------- diff --git a/bpel-store/src/main/java/org/apache/ode/store/hib/ConfStoreConnectionHib.java b/bpel-store/src/main/java/org/apache/ode/store/hib/ConfStoreConnectionHib.java index 5b5bea9..134d6d3 100644 --- a/bpel-store/src/main/java/org/apache/ode/store/hib/ConfStoreConnectionHib.java +++ b/bpel-store/src/main/java/org/apache/ode/store/hib/ConfStoreConnectionHib.java @@ -25,6 +25,8 @@ import org.apache.ode.store.DeploymentUnitDAO; import org.apache.ode.store.ProcessConfDAO; import org.hibernate.Criteria; import org.hibernate.HibernateException; +import org.hibernate.LockMode; +import org.hibernate.Query; import org.hibernate.Session; import javax.xml.namespace.QName; @@ -77,20 +79,29 @@ public class ConfStoreConnectionHib implements ConfStoreConnection { } public long getNextVersion() { - VersionTrackerDAOImpl vt = (VersionTrackerDAOImpl) - _session.createQuery("from VersionTrackerDAOImpl v ").uniqueResult(); - if (vt == null) return 1; - else return vt.getVersion() + 1; + Query q = _session.createQuery("from VersionTrackerDAOImpl v "); + q.setLockMode("v", LockMode.UPGRADE); + VersionTrackerDAOImpl vt = (VersionTrackerDAOImpl) q.uniqueResult(); + if (vt == null) { + vt = new VersionTrackerDAOImpl(); + vt.setVersion(1); + }else { + vt.setVersion(vt.getVersion() + 1); + } + _session.save(vt); + return vt.getVersion(); } public void setVersion(long version) { - VersionTrackerDAOImpl vt = (VersionTrackerDAOImpl) - _session.createQuery("from VersionTrackerDAOImpl v ").uniqueResult(); + Query q = _session.createQuery("from VersionTrackerDAOImpl v "); + q.setLockMode("v", LockMode.UPGRADE); + VersionTrackerDAOImpl vt = (VersionTrackerDAOImpl) q.uniqueResult(); if (vt == null) { vt = new VersionTrackerDAOImpl(); - vt.setId(1); + vt.setVersion(1); + } else { + vt.setVersion(version); } - vt.setVersion(version); _session.save(vt); } http://git-wip-us.apache.org/repos/asf/ode/blob/9760c4f2/bpel-store/src/main/java/org/apache/ode/store/jpa/ConfStoreConnectionJpa.java ---------------------------------------------------------------------- diff --git a/bpel-store/src/main/java/org/apache/ode/store/jpa/ConfStoreConnectionJpa.java b/bpel-store/src/main/java/org/apache/ode/store/jpa/ConfStoreConnectionJpa.java index cb7c284..b7fcfd0 100644 --- a/bpel-store/src/main/java/org/apache/ode/store/jpa/ConfStoreConnectionJpa.java +++ b/bpel-store/src/main/java/org/apache/ode/store/jpa/ConfStoreConnectionJpa.java @@ -25,6 +25,8 @@ import org.apache.ode.store.ConfStoreConnection; import org.apache.ode.store.DeploymentUnitDAO; import javax.persistence.EntityManager; +import javax.persistence.Query; + import java.util.Collection; import java.util.Date; import java.util.List; @@ -64,19 +66,39 @@ public class ConfStoreConnectionJpa implements ConfStoreConnection { } public long getNextVersion() { - List<VersionTrackerDAOImpl> res = _em.createQuery("select v from VersionTrackerDAOImpl v").getResultList(); - if (res.size() == 0) return 1; - else { - VersionTrackerDAOImpl vt = res.get(0); - return vt.getVersion() + 1; + VersionTrackerDAOImpl vt = null; + Query query = _em.createQuery("select v from VersionTrackerDAOImpl v"); + query.setHint("openjpa.FetchPlan.ReadLockMode", "WRITE"); + + List<VersionTrackerDAOImpl> res = query.getResultList(); + + if(!res.isEmpty()) + vt = res.get(0); + + if (vt == null) { + vt = new VersionTrackerDAOImpl(); + vt.setVersion(1); + } else { + vt.setVersion(vt.getVersion() + 1); } + + _em.persist(vt); + return vt.getVersion(); } public void setVersion(long version) { - List<VersionTrackerDAOImpl> res = _em.createQuery("select v from VersionTrackerDAOImpl v").getResultList(); - VersionTrackerDAOImpl vt; - if (res.size() == 0) vt = new VersionTrackerDAOImpl(); - else vt = res.get(0); + VersionTrackerDAOImpl vt = null; + Query query = _em.createQuery("select v from VersionTrackerDAOImpl v"); + query.setHint("openjpa.FetchPlan.ReadLockMode", "WRITE"); + + List<VersionTrackerDAOImpl> res = query.getResultList(); + + if(!res.isEmpty()) + vt = res.get(0); + + if (vt == null) + vt = new VersionTrackerDAOImpl(); + vt.setVersion(version); _em.persist(vt); } http://git-wip-us.apache.org/repos/asf/ode/blob/9760c4f2/bpel-store/src/main/java/org/apache/ode/store/jpa/DbConfStoreConnectionFactory.java ---------------------------------------------------------------------- diff --git a/bpel-store/src/main/java/org/apache/ode/store/jpa/DbConfStoreConnectionFactory.java b/bpel-store/src/main/java/org/apache/ode/store/jpa/DbConfStoreConnectionFactory.java index d71ce50..8239608 100644 --- a/bpel-store/src/main/java/org/apache/ode/store/jpa/DbConfStoreConnectionFactory.java +++ b/bpel-store/src/main/java/org/apache/ode/store/jpa/DbConfStoreConnectionFactory.java @@ -61,6 +61,7 @@ public class DbConfStoreConnectionFactory implements ConfStoreConnectionFactory propMap.put("openjpa.ConnectionFactoryMode", "managed"); propMap.put("openjpa.FlushBeforeQueries", "false"); propMap.put("openjpa.FetchBatchSize", 1000); + propMap.put("openjpa.LockManager","pessimistic"); //dirty hack for ODE-1015 String skipIsolation = System.getProperty("openjpa.connection.isolation.skip", "N");
