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 <[email protected]> Authored: Mon Sep 5 17:54:37 2016 +0300 Committer: Andrus Adamchik <[email protected]> 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;
