From a3603cee4f4de11122029cf93af20d2e1a4d9d75 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Wed, 20 Jun 2018 22:34:26 -0300 Subject: [PATCH 1/3] Update Apache DBCP version --- developer/pom.xml | 8 +- framework/db/pom.xml | 8 +- .../com/cloud/utils/db/TransactionLegacy.java | 103 +++++++++++------- pom.xml | 16 +-- 4 files changed, 79 insertions(+), 56 deletions(-) diff --git a/developer/pom.xml b/developer/pom.xml index 3f6236fd6903..97ec9ed1b0f7 100644 --- a/developer/pom.xml +++ b/developer/pom.xml @@ -22,12 +22,12 @@ - commons-dbcp - commons-dbcp + org.apache.commons + commons-dbcp2 - commons-pool - commons-pool + org.apache.commons + commons-pool2 org.jasypt diff --git a/framework/db/pom.xml b/framework/db/pom.xml index 6483f4f9b037..7bf184c6d38e 100644 --- a/framework/db/pom.xml +++ b/framework/db/pom.xml @@ -28,8 +28,8 @@ javax.persistence - commons-dbcp - commons-dbcp + org.apache.commons + commons-dbcp2 commons-io @@ -37,8 +37,8 @@ ${cs.commons-io.version} - commons-pool - commons-pool + org.apache.commons + commons-pool2 org.apache.cloudstack diff --git a/framework/db/src/main/java/com/cloud/utils/db/TransactionLegacy.java b/framework/db/src/main/java/com/cloud/utils/db/TransactionLegacy.java index 6a422d30fc36..ea208e0ecdae 100644 --- a/framework/db/src/main/java/com/cloud/utils/db/TransactionLegacy.java +++ b/framework/db/src/main/java/com/cloud/utils/db/TransactionLegacy.java @@ -33,13 +33,13 @@ import javax.sql.DataSource; -import org.apache.commons.dbcp.ConnectionFactory; -import org.apache.commons.dbcp.DriverManagerConnectionFactory; -import org.apache.commons.dbcp.PoolableConnectionFactory; -import org.apache.commons.dbcp.PoolingDataSource; -import org.apache.commons.pool.KeyedObjectPoolFactory; -import org.apache.commons.pool.impl.GenericObjectPool; -import org.apache.commons.pool.impl.StackKeyedObjectPoolFactory; +import org.apache.commons.dbcp2.ConnectionFactory; +import org.apache.commons.dbcp2.DriverManagerConnectionFactory; +import org.apache.commons.dbcp2.PoolableConnectionFactory; +import org.apache.commons.dbcp2.PoolingDataSource; +import org.apache.commons.dbcp2.managed.PoolableManagedConnectionFactory; +import org.apache.commons.pool2.impl.GenericObjectPool; +import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.apache.log4j.Logger; import com.cloud.utils.Pair; @@ -1079,24 +1079,15 @@ public static void initDataSource(Properties dbProps) { System.setProperty("javax.net.ssl.trustStorePassword", dbProps.getProperty("db.cloud.trustStorePassword")); } - final GenericObjectPool cloudConnectionPool = - new GenericObjectPool(null, cloudMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION, cloudMaxWait, cloudMaxIdle, cloudTestOnBorrow, false, - cloudTimeBtwEvictionRunsMillis, 1, cloudMinEvcitableIdleTimeMillis, cloudTestWhileIdle); - final String cloudConnectionUri = cloudDriver + "://" + cloudHost + (s_dbHAEnabled ? "," + cloudSlaves : "") + ":" + cloudPort + "/" + cloudDbName + "?autoReconnect=" + cloudAutoReconnect + (url != null ? "&" + url : "") + (useSSL ? "&useSSL=true" : "") + (s_dbHAEnabled ? "&" + cloudDbHAParams : "") + (s_dbHAEnabled ? "&loadBalanceStrategy=" + loadBalanceStrategy : ""); DriverLoader.loadDriver(cloudDriver); - final ConnectionFactory cloudConnectionFactory = new DriverManagerConnectionFactory(cloudConnectionUri, cloudUsername, cloudPassword); - - final KeyedObjectPoolFactory poolableObjFactory = (cloudPoolPreparedStatements ? new StackKeyedObjectPoolFactory() : null); - - final PoolableConnectionFactory cloudPoolableConnectionFactory = - new PoolableConnectionFactory(cloudConnectionFactory, cloudConnectionPool, poolableObjFactory, cloudValidationQuery, false, false, isolationLevel); - // Default Data Source for CloudStack - s_ds = new PoolingDataSource(cloudPoolableConnectionFactory.getPool()); + s_ds = createDataSource(cloudConnectionUri, cloudUsername, cloudPassword, + cloudMaxActive, cloudMaxIdle, cloudMaxWait, + cloudTimeBtwEvictionRunsMillis, cloudMinEvcitableIdleTimeMillis, cloudTestWhileIdle, cloudTestOnBorrow); // Configure the usage db final int usageMaxActive = Integer.parseInt(dbProps.getProperty("db.usage.maxActive")); @@ -1111,21 +1102,14 @@ public static void initDataSource(Properties dbProps) { final boolean usageAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.usage.autoReconnect")); final String usageUrl = dbProps.getProperty("db.usage.url.params"); - final GenericObjectPool usageConnectionPool = - new GenericObjectPool(null, usageMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION, usageMaxWait, usageMaxIdle); - final String usageConnectionUri = usageDriver + "://" + usageHost + (s_dbHAEnabled ? "," + dbProps.getProperty("db.cloud.slaves") : "") + ":" + usagePort + "/" + usageDbName + "?autoReconnect=" + usageAutoReconnect + (usageUrl != null ? "&" + usageUrl : "") + (s_dbHAEnabled ? "&" + getDBHAParams("usage", dbProps) : "") + (s_dbHAEnabled ? "&loadBalanceStrategy=" + loadBalanceStrategy : ""); DriverLoader.loadDriver(usageDriver); - final ConnectionFactory usageConnectionFactory = new DriverManagerConnectionFactory(usageConnectionUri, usageUsername, usagePassword); - - final PoolableConnectionFactory usagePoolableConnectionFactory = - new PoolableConnectionFactory(usageConnectionFactory, usageConnectionPool, new StackKeyedObjectPoolFactory(), null, false, false); - // Data Source for usage server - s_usageDS = new PoolingDataSource(usagePoolableConnectionFactory.getPool()); + s_usageDS = createDataSource(usageConnectionUri, usageUsername, usagePassword, + usageMaxActive, usageMaxIdle, usageMaxWait, null, null, null, null); try { // Configure the simulator db @@ -1140,18 +1124,12 @@ public static void initDataSource(Properties dbProps) { final String simulatorDbName = dbProps.getProperty("db.simulator.name"); final boolean simulatorAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.simulator.autoReconnect")); - final GenericObjectPool simulatorConnectionPool = - new GenericObjectPool(null, simulatorMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION, simulatorMaxWait, simulatorMaxIdle); - final String simulatorConnectionUri = simulatorDriver + "://" + simulatorHost + ":" + simulatorPort + "/" + simulatorDbName + "?autoReconnect=" + simulatorAutoReconnect; DriverLoader.loadDriver(simulatorDriver); - final ConnectionFactory simulatorConnectionFactory = new DriverManagerConnectionFactory(simulatorConnectionUri, simulatorUsername, simulatorPassword); - - final PoolableConnectionFactory simulatorPoolableConnectionFactory = - new PoolableConnectionFactory(simulatorConnectionFactory, simulatorConnectionPool, new StackKeyedObjectPoolFactory(), null, false, false); - s_simulatorDS = new PoolingDataSource(simulatorPoolableConnectionFactory.getPool()); + s_simulatorDS = createDataSource(simulatorConnectionUri, simulatorUsername, simulatorPassword, + simulatorMaxActive, simulatorMaxIdle, simulatorMaxWait, null, null, null, null); } catch (Exception e) { s_logger.debug("Simulator DB properties are not available. Not initializing simulator DS"); } @@ -1165,6 +1143,52 @@ public static void initDataSource(Properties dbProps) { } } + /** + * Creates a data source + */ + private static DataSource createDataSource(String connectionUri, String username, String password, + Integer maxActive, Integer maxIdle, Long maxWait, + Long timeBtwnEvictionRuns, Long minEvictableIdleTime, + Boolean testWhileIdle, Boolean testOnBorrow) { + PoolableManagedConnectionFactory connectionFactory = createPoolableManagedConnectionFactory(connectionUri, username, password); + GenericObjectPool connectionPool = createConnectionPool(connectionFactory, maxActive, maxIdle, maxWait, + timeBtwnEvictionRuns, minEvictableIdleTime, testWhileIdle, testOnBorrow); + return new PoolingDataSource(connectionPool); + } + + /** + * Create a connection pool from a poolable connection factory and its configuration values + */ + private static GenericObjectPool createConnectionPool(PoolableManagedConnectionFactory connectionFactory, Integer maxActive, Integer maxIdle, Long maxWait, Long timeBtwnEvictionRuns, Long minEvictableIdleTime, Boolean testWhileIdle, Boolean testOnBorrow) { + GenericObjectPoolConfig config = createPoolConfig(maxActive, maxIdle, maxWait, timeBtwnEvictionRuns, minEvictableIdleTime, testWhileIdle, testOnBorrow); + return new GenericObjectPool<>(connectionFactory, config); + } + + /** + * Create a poolable connection factory + */ + private static PoolableManagedConnectionFactory createPoolableManagedConnectionFactory(String connectionUri, String username, String password) { + ConnectionFactory cloudConnectionFactory = new DriverManagerConnectionFactory(connectionUri, username, password); + return (PoolableManagedConnectionFactory) new PoolableConnectionFactory(cloudConnectionFactory, null); + } + + /** + * Return a GenericObjectPoolConfig configuration usable on connection pool creation + */ + private static GenericObjectPoolConfig createPoolConfig(Integer maxActive, Integer maxIdle, Long maxWait, + Long timeBtwnEvictionRuns, Long minEvictableIdleTime, + Boolean testWhileIdle, Boolean testOnBorrow) { + GenericObjectPoolConfig config = new GenericObjectPoolConfig(); + config.setMaxTotal(maxActive); + config.setMaxIdle(maxIdle); + config.setMaxWaitMillis(maxWait); + config.setTimeBetweenEvictionRunsMillis(timeBtwnEvictionRuns); + config.setMinEvictableIdleTimeMillis(minEvictableIdleTime); + config.setTestWhileIdle(testWhileIdle); + config.setTestOnBorrow(testOnBorrow); + return config; + } + private static String getDBHAParams(String dbName, Properties dbProps) { StringBuilder sb = new StringBuilder(); sb.append("failOverReadOnly=" + dbProps.getProperty("db." + dbName + ".failOverReadOnly")); @@ -1178,11 +1202,10 @@ private static String getDBHAParams(String dbName, Properties dbProps) { @SuppressWarnings({"unchecked", "rawtypes"}) private static DataSource getDefaultDataSource(final String database) { - final GenericObjectPool connectionPool = new GenericObjectPool(null, 5); final ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://localhost:3306/" + database, "cloud", "cloud"); - final PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false, true); - return new PoolingDataSource( - /* connectionPool */poolableConnectionFactory.getPool()); + final PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, null); + final GenericObjectPool connectionPool = new GenericObjectPool(poolableConnectionFactory); + return new PoolingDataSource(connectionPool); } /** diff --git a/pom.xml b/pom.xml index 2e61773623e0..fcae2bede7ed 100644 --- a/pom.xml +++ b/pom.xml @@ -50,8 +50,8 @@ 1.2.17 1.2.17 3.2.5 - 1.4 - 1.6 + 2.2.0 + 2.4.3 1.11 1.10 1.1.1 @@ -271,13 +271,13 @@ ${cs.cglib.version} - commons-dbcp - commons-dbcp + org.apache.commons + commons-dbcp2 ${cs.dbcp.version} - commons-pool - commons-pool + org.apache.commons + commons-pool2 @@ -297,8 +297,8 @@ ${cs.commons-fileupload.version} - commons-pool - commons-pool + org.apache.commons + commons-pool2 ${cs.pool.version} From 14ab00e713885aedf989e7edded70f074b7f7438 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Fri, 22 Jun 2018 13:24:42 -0300 Subject: [PATCH 2/3] Fix DB connection --- .../com/cloud/utils/db/TransactionLegacy.java | 66 ++++++++++--------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/framework/db/src/main/java/com/cloud/utils/db/TransactionLegacy.java b/framework/db/src/main/java/com/cloud/utils/db/TransactionLegacy.java index ea208e0ecdae..6777077c3d17 100644 --- a/framework/db/src/main/java/com/cloud/utils/db/TransactionLegacy.java +++ b/framework/db/src/main/java/com/cloud/utils/db/TransactionLegacy.java @@ -35,9 +35,10 @@ import org.apache.commons.dbcp2.ConnectionFactory; import org.apache.commons.dbcp2.DriverManagerConnectionFactory; +import org.apache.commons.dbcp2.PoolableConnection; import org.apache.commons.dbcp2.PoolableConnectionFactory; import org.apache.commons.dbcp2.PoolingDataSource; -import org.apache.commons.dbcp2.managed.PoolableManagedConnectionFactory; +import org.apache.commons.pool2.ObjectPool; import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.apache.log4j.Logger; @@ -1085,9 +1086,9 @@ public static void initDataSource(Properties dbProps) { DriverLoader.loadDriver(cloudDriver); // Default Data Source for CloudStack - s_ds = createDataSource(cloudConnectionUri, cloudUsername, cloudPassword, - cloudMaxActive, cloudMaxIdle, cloudMaxWait, - cloudTimeBtwEvictionRunsMillis, cloudMinEvcitableIdleTimeMillis, cloudTestWhileIdle, cloudTestOnBorrow); + s_ds = createDataSource(cloudConnectionUri, cloudUsername, cloudPassword, cloudMaxActive, cloudMaxIdle, cloudMaxWait, + cloudTimeBtwEvictionRunsMillis, cloudMinEvcitableIdleTimeMillis, cloudTestWhileIdle, cloudTestOnBorrow, + cloudValidationQuery, isolationLevel); // Configure the usage db final int usageMaxActive = Integer.parseInt(dbProps.getProperty("db.usage.maxActive")); @@ -1109,7 +1110,8 @@ public static void initDataSource(Properties dbProps) { // Data Source for usage server s_usageDS = createDataSource(usageConnectionUri, usageUsername, usagePassword, - usageMaxActive, usageMaxIdle, usageMaxWait, null, null, null, null); + usageMaxActive, usageMaxIdle, usageMaxWait, null, null, null, null, + null, isolationLevel); try { // Configure the simulator db @@ -1129,7 +1131,7 @@ public static void initDataSource(Properties dbProps) { DriverLoader.loadDriver(simulatorDriver); s_simulatorDS = createDataSource(simulatorConnectionUri, simulatorUsername, simulatorPassword, - simulatorMaxActive, simulatorMaxIdle, simulatorMaxWait, null, null, null, null); + simulatorMaxActive, simulatorMaxIdle, simulatorMaxWait, null, null, null, null, cloudValidationQuery, isolationLevel); } catch (Exception e) { s_logger.debug("Simulator DB properties are not available. Not initializing simulator DS"); } @@ -1146,30 +1148,23 @@ public static void initDataSource(Properties dbProps) { /** * Creates a data source */ - private static DataSource createDataSource(String connectionUri, String username, String password, + private static DataSource createDataSource(String uri, String username, String password, Integer maxActive, Integer maxIdle, Long maxWait, Long timeBtwnEvictionRuns, Long minEvictableIdleTime, - Boolean testWhileIdle, Boolean testOnBorrow) { - PoolableManagedConnectionFactory connectionFactory = createPoolableManagedConnectionFactory(connectionUri, username, password); - GenericObjectPool connectionPool = createConnectionPool(connectionFactory, maxActive, maxIdle, maxWait, - timeBtwnEvictionRuns, minEvictableIdleTime, testWhileIdle, testOnBorrow); - return new PoolingDataSource(connectionPool); - } - - /** - * Create a connection pool from a poolable connection factory and its configuration values - */ - private static GenericObjectPool createConnectionPool(PoolableManagedConnectionFactory connectionFactory, Integer maxActive, Integer maxIdle, Long maxWait, Long timeBtwnEvictionRuns, Long minEvictableIdleTime, Boolean testWhileIdle, Boolean testOnBorrow) { + Boolean testWhileIdle, Boolean testOnBorrow, + String validationQuery, Integer isolationLevel) { + ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(uri, username, password); + PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, null); GenericObjectPoolConfig config = createPoolConfig(maxActive, maxIdle, maxWait, timeBtwnEvictionRuns, minEvictableIdleTime, testWhileIdle, testOnBorrow); - return new GenericObjectPool<>(connectionFactory, config); - } - - /** - * Create a poolable connection factory - */ - private static PoolableManagedConnectionFactory createPoolableManagedConnectionFactory(String connectionUri, String username, String password) { - ConnectionFactory cloudConnectionFactory = new DriverManagerConnectionFactory(connectionUri, username, password); - return (PoolableManagedConnectionFactory) new PoolableConnectionFactory(cloudConnectionFactory, null); + ObjectPool connectionPool = new GenericObjectPool<>(poolableConnectionFactory, config); + poolableConnectionFactory.setPool(connectionPool); + if (validationQuery != null) { + poolableConnectionFactory.setValidationQuery(validationQuery); + } + if (isolationLevel != null) { + poolableConnectionFactory.setDefaultTransactionIsolation(isolationLevel); + } + return new PoolingDataSource<>(connectionPool); } /** @@ -1182,10 +1177,19 @@ private static GenericObjectPoolConfig createPoolConfig(Integer maxActive, Integ config.setMaxTotal(maxActive); config.setMaxIdle(maxIdle); config.setMaxWaitMillis(maxWait); - config.setTimeBetweenEvictionRunsMillis(timeBtwnEvictionRuns); - config.setMinEvictableIdleTimeMillis(minEvictableIdleTime); - config.setTestWhileIdle(testWhileIdle); - config.setTestOnBorrow(testOnBorrow); + + if (timeBtwnEvictionRuns != null) { + config.setTimeBetweenEvictionRunsMillis(timeBtwnEvictionRuns); + } + if (minEvictableIdleTime != null) { + config.setMinEvictableIdleTimeMillis(minEvictableIdleTime); + } + if (testWhileIdle != null) { + config.setTestWhileIdle(testWhileIdle); + } + if (testOnBorrow != null) { + config.setTestOnBorrow(testOnBorrow); + } return config; } From 999834c68c0c31fea541c0a0aa9ae9ce9ac734ef Mon Sep 17 00:00:00 2001 From: nvazquez Date: Sat, 23 Jun 2018 12:09:03 -0300 Subject: [PATCH 3/3] Prevent hang on the db creation --- .../schema/src/main/java/com/cloud/upgrade/DatabaseCreator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseCreator.java b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseCreator.java index 2509d6972c3f..2281e1d2399e 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseCreator.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseCreator.java @@ -230,5 +230,6 @@ public static void main(String[] args) { } finally { txn.close(); } + System.exit(0); } }