You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2016/09/05 15:04:37 UTC

[3/5] cayenne git commit: disable concurrent PK tests for HSQLDB whose PK generator has no DB locks

disable concurrent PK tests for HSQLDB whose PK generator has no DB locks


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/66d3f0a9
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/66d3f0a9
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/66d3f0a9

Branch: refs/heads/master
Commit: 66d3f0a95768890b4d1aba0fbab2418b323b41be
Parents: 574eefb
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Mon Sep 5 17:54:37 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Mon Sep 5 17:54:37 2016 +0300

----------------------------------------------------------------------
 .../org/apache/cayenne/dba/JdbcPkGenerator.java | 29 +++++++++---------
 .../cayenne/dba/ConcurrentPkGeneratorIT.java    |  9 ++++++
 .../cayenne/unit/HSQLDBUnitDbAdapter.java       |  6 ++++
 .../org/apache/cayenne/unit/UnitDbAdapter.java  | 32 +++++++++++---------
 4 files changed, 47 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/66d3f0a9/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
index 4d9393f..9e159d2 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
@@ -19,19 +19,6 @@
 
 package org.apache.cayenne.dba;
 
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.sql.Types;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ObjectId;
@@ -45,6 +32,20 @@ import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.util.IDUtil;
 
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ConcurrentMap;
+
 /**
  * Default primary key generator implementation. Uses a lookup table named
  * "AUTO_PK_SUPPORT" to search and increment primary keys for tables.
@@ -55,7 +56,7 @@ public class JdbcPkGenerator implements PkGenerator {
 	static final long DEFAULT_PK_START_VALUE = 200;
 
 	protected JdbcAdapter adapter;
-	protected ConcurrentHashMap<String, Queue<Long>> pkCache = new ConcurrentHashMap<>();
+	protected ConcurrentMap<String, Queue<Long>> pkCache = new ConcurrentHashMap<>();
 	protected int pkCacheSize = DEFAULT_PK_CACHE_SIZE;
 	protected long pkStartValue = DEFAULT_PK_START_VALUE;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/66d3f0a9/cayenne-server/src/test/java/org/apache/cayenne/dba/ConcurrentPkGeneratorIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/dba/ConcurrentPkGeneratorIT.java b/cayenne-server/src/test/java/org/apache/cayenne/dba/ConcurrentPkGeneratorIT.java
index 7d2c06e..74bddb3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/dba/ConcurrentPkGeneratorIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/dba/ConcurrentPkGeneratorIT.java
@@ -27,6 +27,7 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.testdo.qualified.Qualified1;
+import org.apache.cayenne.unit.UnitDbAdapter;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
 import org.apache.cayenne.unit.di.server.ServerCase;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
@@ -47,12 +48,20 @@ public class ConcurrentPkGeneratorIT extends ServerCase {
 
     @Inject
     private ServerRuntime runtime;
+
+	@Inject
+	private UnitDbAdapter unitDbAdapter;
     
     /*
      * Attempts to discover any problems regarding thread locking in the PkGenerator
      */
     @Test
     public void testConcurrentInserts() throws Exception {
+
+    	if(!unitDbAdapter.supportsPKGeneratorConcurrency()) {
+    		return;
+		}
+
 		final DataMap dataMap = runtime.getDataDomain().getDataMap("qualified");
 		
 		// clear out the table

http://git-wip-us.apache.org/repos/asf/cayenne/blob/66d3f0a9/cayenne-server/src/test/java/org/apache/cayenne/unit/HSQLDBUnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/HSQLDBUnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/HSQLDBUnitDbAdapter.java
index c78791f..4fb5e94 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/HSQLDBUnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/HSQLDBUnitDbAdapter.java
@@ -56,4 +56,10 @@ public class HSQLDBUnitDbAdapter extends UnitDbAdapter {
             executeDDL(con, "hsqldb", "create-sp-aliases.sql");
         }
     }
+
+    @Override
+    public boolean supportsPKGeneratorConcurrency() {
+        // HSQL is not locking AUTO_PK_TABLE, so running PkGenerator in parallel may result in conflicting ranges
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/66d3f0a9/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
index b6ff454..6230943 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
@@ -19,6 +19,18 @@
 
 package org.apache.cayenne.unit;
 
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.configuration.Constants;
+import org.apache.cayenne.configuration.RuntimeProperties;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.QuotingStrategy;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.Procedure;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
@@ -33,18 +45,6 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.configuration.Constants;
-import org.apache.cayenne.configuration.RuntimeProperties;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.Procedure;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 /**
  * Defines API and a common superclass for testing various database features.
  * Different databases support different feature sets that need to be tested
@@ -53,7 +53,7 @@ import org.apache.commons.logging.LogFactory;
  */
 public class UnitDbAdapter {
 
-    private static Log logger = LogFactory.getLog(UnitDbAdapter.class);
+    private static final Log logger = LogFactory.getLog(UnitDbAdapter.class);
 
     @Inject
     protected RuntimeProperties runtimeProperties;
@@ -66,6 +66,10 @@ public class UnitDbAdapter {
         }
         this.adapter = adapter;
     }
+
+    public boolean supportsPKGeneratorConcurrency() {
+        return true;
+    }
     
     public String getIdentifiersStartQuote() {
         return "\"";
@@ -78,8 +82,6 @@ public class UnitDbAdapter {
     /**
      * Returns whether the target DB treats REAL values as DOUBLEs. Default is
      * false, i.e. REALs are treated as FLOATs.
-     * 
-     * @return
      */
     public boolean realAsDouble() {
         return false;