AMBARI-9736 - Ambari Exhausts Connection Pool When Using MySQL Due To Invalid Connections (jonathanhurley)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6d7d82ce Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6d7d82ce Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6d7d82ce Branch: refs/heads/trunk Commit: 6d7d82ce4d8c9eb510193c0754ff8d8fe4ee4e5a Parents: 6e23af6 Author: Jonathan Hurley <[email protected]> Authored: Fri Feb 20 15:41:19 2015 -0500 Committer: Jonathan Hurley <[email protected]> Committed: Fri Feb 20 20:53:43 2015 -0500 ---------------------------------------------------------------------- .../server/configuration/Configuration.java | 368 ++++++++++++++----- .../AmbariManagementControllerImpl.java | 97 ++--- .../server/controller/ControllerModule.java | 75 +++- .../orm/EclipseLinkSessionCustomizer.java | 58 +++ .../scheduler/ExecutionSchedulerImpl.java | 21 +- .../server/upgrade/AbstractUpgradeCatalog.java | 101 +++-- .../server/upgrade/UpgradeCatalog150.java | 113 +++--- .../server/upgrade/UpgradeCatalog151.java | 22 +- .../server/upgrade/UpgradeCatalog160.java | 7 +- .../server/upgrade/UpgradeCatalog161.java | 35 +- .../server/upgrade/UpgradeCatalog170.java | 43 ++- .../src/main/resources/META-INF/persistence.xml | 12 +- .../server/configuration/ConfigurationTest.java | 53 +++ .../scheduler/ExecutionSchedulerTest.java | 23 +- 14 files changed, 692 insertions(+), 336 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/6d7d82ce/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java b/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java index 495c1e4..e6f4125 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java @@ -21,6 +21,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.util.EnumSet; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -85,14 +86,11 @@ public class Configuration { public static final String SRVR_CRT_NAME_KEY = "security.server.cert_name"; public static final String SRVR_CSR_NAME_KEY = "security.server.csr_name"; public static final String SRVR_KEY_NAME_KEY = "security.server.key_name"; - public static final String KSTR_NAME_KEY = - "security.server.keystore_name"; - public static final String SRVR_CRT_PASS_FILE_KEY = - "security.server.crt_pass_file"; + public static final String KSTR_NAME_KEY = "security.server.keystore_name"; + public static final String SRVR_CRT_PASS_FILE_KEY = "security.server.crt_pass_file"; public static final String SRVR_CRT_PASS_KEY = "security.server.crt_pass"; public static final String SRVR_CRT_PASS_LEN_KEY = "security.server.crt_pass.len"; - public static final String PASSPHRASE_ENV_KEY = - "security.server.passphrase_env_var"; + public static final String PASSPHRASE_ENV_KEY = "security.server.passphrase_env_var"; public static final String PASSPHRASE_KEY = "security.server.passphrase"; public static final String SRVR_DISABLED_CIPHERS = "security.server.disabled.ciphers"; public static final String SRVR_DISABLED_PROTOCOLS = "security.server.disabled.protocols"; @@ -120,58 +118,46 @@ public class Configuration { public static final String REQUEST_CONNECT_TIMEOUT = "views.request.connect.timeout.millis"; public static final String REQUEST_CONNECT_TIMEOUT_DEFAULT = "5000"; public static final String SERVER_JDBC_POSTGRES_SCHEMA_NAME = "server.jdbc.postgres.schema"; - public static final String POSTGRES_DB_NAME = "postgres"; - public static final String ORACLE_DB_NAME = "oracle"; - public static final String MYSQL_DB_NAME = "mysql"; - public static final String DERBY_DB_NAME = "derby"; public static final String OJDBC_JAR_NAME_KEY = "db.oracle.jdbc.name"; public static final String OJDBC_JAR_NAME_DEFAULT = "ojdbc6.jar"; public static final String MYSQL_JAR_NAME_KEY = "db.mysql.jdbc.name"; public static final String MYSQL_JAR_NAME_DEFAULT = "mysql-connector-java.jar"; public static final String IS_LDAP_CONFIGURED = "ambari.ldap.isConfigured"; public static final String LDAP_USE_SSL_KEY = "authentication.ldap.useSSL"; - public static final String LDAP_PRIMARY_URL_KEY = - "authentication.ldap.primaryUrl"; - public static final String LDAP_SECONDARY_URL_KEY = - "authentication.ldap.secondaryUrl"; - public static final String LDAP_BASE_DN_KEY = - "authentication.ldap.baseDn"; - public static final String LDAP_BIND_ANONYMOUSLY_KEY = - "authentication.ldap.bindAnonymously"; - public static final String LDAP_MANAGER_DN_KEY = - "authentication.ldap.managerDn"; - public static final String LDAP_MANAGER_PASSWORD_KEY = - "authentication.ldap.managerPassword"; - public static final String LDAP_DN_ATTRIBUTE_KEY = - "authentication.ldap.dnAttribute"; - public static final String LDAP_USERNAME_ATTRIBUTE_KEY = - "authentication.ldap.usernameAttribute"; - public static final String LDAP_USER_BASE_KEY = - "authentication.ldap.userBase"; - public static final String LDAP_USER_OBJECT_CLASS_KEY = - "authentication.ldap.userObjectClass"; - public static final String LDAP_GROUP_BASE_KEY = - "authentication.ldap.groupBase"; - public static final String LDAP_GROUP_OBJECT_CLASS_KEY = - "authentication.ldap.groupObjectClass"; - public static final String LDAP_GROUP_NAMING_ATTR_KEY = - "authentication.ldap.groupNamingAttr"; - public static final String LDAP_GROUP_MEMEBERSHIP_ATTR_KEY = - "authentication.ldap.groupMembershipAttr"; - public static final String LDAP_ADMIN_GROUP_MAPPING_RULES_KEY = - "authorization.ldap.adminGroupMappingRules"; - public static final String LDAP_GROUP_SEARCH_FILTER_KEY = - "authorization.ldap.groupSearchFilter"; + public static final String LDAP_PRIMARY_URL_KEY = "authentication.ldap.primaryUrl"; + public static final String LDAP_SECONDARY_URL_KEY = "authentication.ldap.secondaryUrl"; + public static final String LDAP_BASE_DN_KEY = "authentication.ldap.baseDn"; + public static final String LDAP_BIND_ANONYMOUSLY_KEY = "authentication.ldap.bindAnonymously"; + public static final String LDAP_MANAGER_DN_KEY = "authentication.ldap.managerDn"; + public static final String LDAP_MANAGER_PASSWORD_KEY = "authentication.ldap.managerPassword"; + public static final String LDAP_DN_ATTRIBUTE_KEY = "authentication.ldap.dnAttribute"; + public static final String LDAP_USERNAME_ATTRIBUTE_KEY = "authentication.ldap.usernameAttribute"; + public static final String LDAP_USER_BASE_KEY = "authentication.ldap.userBase"; + public static final String LDAP_USER_OBJECT_CLASS_KEY = "authentication.ldap.userObjectClass"; + public static final String LDAP_GROUP_BASE_KEY = "authentication.ldap.groupBase"; + public static final String LDAP_GROUP_OBJECT_CLASS_KEY = "authentication.ldap.groupObjectClass"; + public static final String LDAP_GROUP_NAMING_ATTR_KEY = "authentication.ldap.groupNamingAttr"; + public static final String LDAP_GROUP_MEMEBERSHIP_ATTR_KEY = "authentication.ldap.groupMembershipAttr"; + public static final String LDAP_ADMIN_GROUP_MAPPING_RULES_KEY = "authorization.ldap.adminGroupMappingRules"; + public static final String LDAP_GROUP_SEARCH_FILTER_KEY = "authorization.ldap.groupSearchFilter"; public static final String SERVER_EC_CACHE_SIZE = "server.ecCacheSize"; - public static final String SERVER_STALE_CONFIG_CACHE_ENABLED_KEY = - "server.cache.isStale.enabled"; + public static final String SERVER_STALE_CONFIG_CACHE_ENABLED_KEY = "server.cache.isStale.enabled"; public static final String SERVER_PERSISTENCE_TYPE_KEY = "server.persistence.type"; public static final String SERVER_JDBC_USER_NAME_KEY = "server.jdbc.user.name"; public static final String SERVER_JDBC_USER_PASSWD_KEY = "server.jdbc.user.passwd"; public static final String SERVER_JDBC_DRIVER_KEY = "server.jdbc.driver"; public static final String SERVER_JDBC_URL_KEY = "server.jdbc.url"; public static final String SERVER_JDBC_PROPERTIES_PREFIX = "server.jdbc.properties."; - // public static final String SERVER_RCA_PERSISTENCE_TYPE_KEY = "server.rca.persistence.type"; + + public static final String SERVER_JDBC_CONNECTION_POOL = "server.jdbc.connection-pool"; + public static final String SERVER_JDBC_CONNECTION_POOL_MIN_SIZE = "server.jdbc.connection-pool.min-size"; + public static final String SERVER_JDBC_CONNECTION_POOL_MAX_SIZE = "server.jdbc.connection-pool.max-size"; + public static final String SERVER_JDBC_CONNECTION_POOL_AQUISITION_SIZE = "server.jdbc.connection-pool.acquisition-size"; + public static final String SERVER_JDBC_CONNECTION_POOL_MAX_AGE = "server.jdbc.connection-pool.max-age"; + public static final String SERVER_JDBC_CONNECTION_POOL_MAX_IDLE_TIME = "server.jdbc.connection-pool.max-idle-time"; + public static final String SERVER_JDBC_CONNECTION_POOL_MAX_IDLE_TIME_EXCESS = "server.jdbc.connection-pool.max-idle-time-excess"; + public static final String SERVER_JDBC_CONNECTION_POOL_IDLE_TEST_INTERVAL = "server.jdbc.connection-pool.idle-test-interval"; + public static final String SERVER_JDBC_RCA_USER_NAME_KEY = "server.jdbc.rca.user.name"; public static final String SERVER_JDBC_RCA_USER_PASSWD_KEY = "server.jdbc.rca.user.passwd"; public static final String SERVER_JDBC_RCA_DRIVER_KEY = "server.jdbc.rca.driver"; @@ -187,8 +173,7 @@ public class Configuration { public static final String JDBC_RCA_LOCAL_DRIVER = "org.postgresql.Driver"; public static final String OS_FAMILY_KEY = "server.os_family"; public static final String OS_VERSION_KEY = "server.os_type"; - public static final String SRVR_HOSTS_MAPPING = - "server.hosts.mapping"; + public static final String SRVR_HOSTS_MAPPING = "server.hosts.mapping"; // Command parameter names public static final String UPGRADE_FROM_STACK = "source_stack_version"; public static final String UPGRADE_TO_STACK = "target_stack_version"; @@ -213,30 +198,23 @@ public class Configuration { public static final String MAPREDUCE2_LOG4J_CONFIG_TAG = "mapreduce2-log4j"; public static final String RCA_ENABLED_PROPERTY = "rca_enabled"; public static final String HIVE_CONFIG_TAG = "hive-site"; - public static final String HIVE_METASTORE_PASSWORD_PROPERTY = - "javax.jdo.option.ConnectionPassword"; - public static final String MASTER_KEY_PERSISTED = "security.master" + - ".key.ispersisted"; - public static final String MASTER_KEY_LOCATION = "security.master.key" + - ".location"; - public static final String MASTER_KEY_ENV_PROP = - "AMBARI_SECURITY_MASTER_KEY"; + public static final String HIVE_METASTORE_PASSWORD_PROPERTY = "javax.jdo.option.ConnectionPassword"; + public static final String MASTER_KEY_PERSISTED = "security.master.key.ispersisted"; + public static final String MASTER_KEY_LOCATION = "security.master.key.location"; + public static final String MASTER_KEY_ENV_PROP = "AMBARI_SECURITY_MASTER_KEY"; public static final String MASTER_KEY_FILENAME_DEFAULT = "master"; + /** * Key for repo validation suffixes. */ public static final String REPO_SUFFIX_KEY_UBUNTU = "repo.validation.suffixes.ubuntu"; public static final String REPO_SUFFIX_KEY_DEFAULT = "repo.validation.suffixes.default"; - public static final String EXECUTION_SCHEDULER_CLUSTERED = - "server.execution.scheduler.isClustered"; - public static final String EXECUTION_SCHEDULER_THREADS = - "server.execution.scheduler.maxThreads"; - public static final String EXECUTION_SCHEDULER_CONNECTIONS = - "server.execution.scheduler.maxDbConnections"; - public static final String EXECUTION_SCHEDULER_MISFIRE_TOLERATION = - "server.execution.scheduler.misfire.toleration.minutes"; - public static final String EXECUTION_SCHEDULER_START_DELAY = - "server.execution.scheduler.start.delay.seconds"; + + public static final String EXECUTION_SCHEDULER_CLUSTERED = "server.execution.scheduler.isClustered"; + public static final String EXECUTION_SCHEDULER_THREADS = "server.execution.scheduler.maxThreads"; + public static final String EXECUTION_SCHEDULER_CONNECTIONS = "server.execution.scheduler.maxDbConnections"; + public static final String EXECUTION_SCHEDULER_MISFIRE_TOLERATION = "server.execution.scheduler.misfire.toleration.minutes"; + public static final String EXECUTION_SCHEDULER_START_DELAY = "server.execution.scheduler.start.delay.seconds"; public static final String DEFAULT_SCHEDULER_THREAD_COUNT = "5"; public static final String DEFAULT_SCHEDULER_MAX_CONNECTIONS = "5"; public static final String DEFAULT_EXECUTION_SCHEDULER_MISFIRE_TOLERATION = "480"; @@ -260,15 +238,13 @@ public class Configuration { * parallel or sequentally. Only stages from different requests * running on not interfering host sets may be executed in parallel. */ - public static final String PARALLEL_STAGE_EXECUTION_KEY = - "server.stages.parallel"; + public static final String PARALLEL_STAGE_EXECUTION_KEY = "server.stages.parallel"; public static final String AGENT_TASK_TIMEOUT_KEY = "agent.task.timeout"; public static final String AGENT_TASK_TIMEOUT_DEFAULT = "900"; public static final String CUSTOM_ACTION_DEFINITION_KEY = "custom.action.definitions"; public static final String SHARED_RESOURCES_DIR_KEY = "shared.resources.dir"; - private static final String CUSTOM_ACTION_DEFINITION_DEF_VALUE = - "/var/lib/ambari-server/resources/custom_action_definitions"; + private static final String CUSTOM_ACTION_DEFINITION_DEF_VALUE = "/var/lib/ambari-server/resources/custom_action_definitions"; private static final long SERVER_EC_CACHE_SIZE_DEFAULT = 10000L; private static final String SERVER_STALE_CONFIG_CACHE_ENABLED_DEFAULT = "true"; @@ -284,8 +260,7 @@ public class Configuration { private static final String SRVR_DISABLED_CIPHERS_DEFAULT = ""; private static final String SRVR_DISABLED_PROTOCOLS_DEFAULT = ""; private static final String PASSPHRASE_ENV_DEFAULT = "AMBARI_PASSPHRASE"; - private static final String RESOURCES_DIR_DEFAULT = - "/var/lib/ambari-server/resources/"; + private static final String RESOURCES_DIR_DEFAULT = "/var/lib/ambari-server/resources/"; private static final String SHARED_RESOURCES_DIR_DEFAULT = "/usr/lib/ambari-server/lib/ambari_commons/resources"; private static final String ANONYMOUS_AUDIT_NAME_KEY = "anonymous.audit.name"; @@ -293,27 +268,29 @@ public class Configuration { private static final int CLIENT_API_SSL_PORT_DEFAULT = 8443; private static final String LDAP_BIND_ANONYMOUSLY_DEFAULT = "true"; - //TODO For embedded server only - should be removed later + /** + * !!! TODO: For embedded server only - should be removed later + */ private static final String LDAP_PRIMARY_URL_DEFAULT = "localhost:33389"; private static final String LDAP_BASE_DN_DEFAULT = "dc=ambari,dc=apache,dc=org"; private static final String LDAP_USERNAME_ATTRIBUTE_DEFAULT = "uid"; private static final String LDAP_DN_ATTRIBUTE_DEFAULT = "dn"; - private static final String LDAP_USER_BASE_DEFAULT = - "ou=people,dc=ambari,dc=apache,dc=org"; + private static final String LDAP_USER_BASE_DEFAULT = "ou=people,dc=ambari,dc=apache,dc=org"; private static final String LDAP_USER_OBJECT_CLASS_DEFAULT = "person"; - private static final String LDAP_GROUP_BASE_DEFAULT = - "ou=groups,dc=ambari,dc=apache,dc=org"; + private static final String LDAP_GROUP_BASE_DEFAULT = "ou=groups,dc=ambari,dc=apache,dc=org"; private static final String LDAP_GROUP_OBJECT_CLASS_DEFAULT = "group"; private static final String LDAP_GROUP_NAMING_ATTR_DEFAULT = "cn"; private static final String LDAP_GROUP_MEMBERSHIP_ATTR_DEFAULT = "member"; - private static final String LDAP_ADMIN_GROUP_MAPPING_RULES_DEFAULT = - "Ambari Administrators"; + private static final String LDAP_ADMIN_GROUP_MAPPING_RULES_DEFAULT = "Ambari Administrators"; private static final String LDAP_GROUP_SEARCH_FILTER_DEFAULT = ""; + + /** + * !!! TODO: for development purposes only, should be changed to 'false' + */ private static final String IS_LDAP_CONFIGURED_DEFAULT = "false"; - //TODO for development purposes only, should be changed to 'false' + private static final String SERVER_PERSISTENCE_TYPE_DEFAULT = "local"; - private static final String SERVER_CONNECTION_MAX_IDLE_TIME = - "server.connection.max.idle.millis"; + private static final String SERVER_CONNECTION_MAX_IDLE_TIME = "server.connection.max.idle.millis"; private static final String UBUNTU_OS = "ubuntu12"; @@ -339,6 +316,15 @@ public class Configuration { private static final String SERVER_HTTP_SESSION_INACTIVE_TIMEOUT = "server.http.session.inactive_timeout"; + // database pooling defaults + private static final String DEFAULT_JDBC_POOL_MIN_CONNECTIONS = "5"; + private static final String DEFAULT_JDBC_POOL_MAX_CONNECTIONS = "32"; + private static final String DEFAULT_JDBC_POOL_ACQUISITION_SIZE = "5"; + private static final String DEFAULT_JDBC_POOL_MAX_IDLE_TIME_SECONDS = "14400"; + private static final String DEFAULT_JDBC_POOL_EXCESS_MAX_IDLE_TIME_SECONDS = "0"; + private static final String DEFAULT_JDBC_POOL_MAX_AGE_SECONDS = "0"; + private static final String DEFAULT_JDBC_POOL_IDLE_TEST_INTERVAL = "7200"; + /** * The full path to the XML file that describes the different alert templates. */ @@ -364,6 +350,83 @@ public class Configuration { } } + /** + * The {@link DatabaseType} enum represents the database being used. + */ + public enum DatabaseType { + POSTGRES("postgres"), + ORACLE("oracle"), + MYSQL("mysql"), + DERBY("derby"), + SQL_SERVER("sqlserver"); + + private static final Map<String, DatabaseType> m_mappedTypes = + new HashMap<String, Configuration.DatabaseType>(5); + + static { + for (DatabaseType databaseType : EnumSet.allOf(DatabaseType.class)) { + m_mappedTypes.put(databaseType.getName(), databaseType); + } + } + + /** + * The JDBC URL type name. + */ + private String m_databaseType; + + /** + * Constructor. + * + */ + private DatabaseType(String databaseType) { + m_databaseType = databaseType; + } + + /** + * Gets an internal name for this database type. + * + * @return the internal name for this database type. + */ + public String getName() { + return m_databaseType; + } + + public DatabaseType get(String databaseTypeName) { + return m_mappedTypes.get(databaseTypeName); + } + } + + /** + * The {@link ConnectionPoolType} is used to define which pooling mechanism + * JDBC should use. + */ + public enum ConnectionPoolType { + INTERNAL("internal"), C3P0("c3p0"); + + /** + * The connection pooling name. + */ + private String m_name; + + /** + * Constructor. + * + * @param name + */ + private ConnectionPoolType(String name) { + m_name = name; + } + + /** + * Gets an internal name for this connection pool type. + * + * @return the internal name for this connection pool type. + */ + public String getName() { + return m_name; + } + } + public Configuration() { this(readConfigFile()); } @@ -432,10 +495,10 @@ public class Configuration { configsMap.put(SHARED_RESOURCES_DIR_KEY, properties.getProperty( SHARED_RESOURCES_DIR_KEY, SHARED_RESOURCES_DIR_DEFAULT)); - + configsMap.put(KDC_PORT_KEY, properties.getProperty( KDC_PORT_KEY, KDC_PORT_KEY_DEFAULT)); - + File passFile = new File(configsMap.get(SRVR_KSTR_DIR_KEY) + File.separator + configsMap.get(SRVR_CRT_PASS_FILE_KEY)); @@ -1230,10 +1293,10 @@ public class Configuration { public String getAlertTemplateFile() { return properties.getProperty(ALERT_TEMPLATE_FILE); } - + /** * Gets the default KDC port to use when no port is specified in KDC hostname - * + * * @return the default KDC port to use. */ public String getDefaultKdcPort() { @@ -1243,12 +1306,143 @@ public class Configuration { /** * Gets the inactivity timeout value, in milliseconds, for socket connection * made to KDC Server for its reachability verification. - * - * @return the timeout value as configured in {@code ambari.properties} + * + * @return the timeout value as configured in {@code ambari.properties} * or {@code 10000 ms} for default. */ public int getKdcConnectionCheckTimeout() { return Integer.parseInt(properties.getProperty( KDC_CONNECTION_CHECK_TIMEOUT_KEY, KDC_CONNECTION_CHECK_TIMEOUT_DEFAULT)); } + + /** + * Gets the type of database by examining the {@link #getDatabaseUrl()} JDBC + * URL. + * + * @return the database type (never {@code null}). + * @throws RuntimeException + * if there no known database type. + */ + public DatabaseType getDatabaseType() { + String dbUrl = getDatabaseUrl(); + DatabaseType databaseType; + + if (dbUrl.contains(DatabaseType.POSTGRES.getName())) { + databaseType = DatabaseType.POSTGRES; + } else if (dbUrl.contains(DatabaseType.ORACLE.getName())) { + databaseType = DatabaseType.ORACLE; + } else if (dbUrl.contains(DatabaseType.MYSQL.getName())) { + databaseType = DatabaseType.MYSQL; + } else if (dbUrl.contains(DatabaseType.DERBY.getName())) { + databaseType = DatabaseType.DERBY; + } else { + throw new RuntimeException( + "The database type could be not determined from the JDBC URL " + + dbUrl); + } + + return databaseType; + } + + /** + * Gets the type of connection pool that EclipseLink should use. + * + * @return default of {@link ConnectionPoolType#INTERNAL}. + */ + public ConnectionPoolType getConnectionPoolType(){ + String connectionPoolType = properties.getProperty( + SERVER_JDBC_CONNECTION_POOL, ConnectionPoolType.INTERNAL.getName()); + + if (connectionPoolType.equals(ConnectionPoolType.C3P0.getName())) { + return ConnectionPoolType.C3P0; + } + + return ConnectionPoolType.INTERNAL; + } + + /** + * Gets the minimum number of connections that should always exist in the + * connection pool. + * + * @return default of {@value #DEFAULT_JDBC_POOL_MIN_CONNECTIONS} + */ + public int getConnectionPoolMinimumSize() { + return Integer.parseInt(properties.getProperty( + SERVER_JDBC_CONNECTION_POOL_MIN_SIZE, DEFAULT_JDBC_POOL_MIN_CONNECTIONS)); + } + + /** + * Gets the maximum number of connections that should even exist in the + * connection pool. + * + * @return default of {@value #DEFAULT_JDBC_POOL_MAX_CONNECTIONS} + */ + public int getConnectionPoolMaximumSize() { + return Integer.parseInt(properties.getProperty( + SERVER_JDBC_CONNECTION_POOL_MAX_SIZE, DEFAULT_JDBC_POOL_MAX_CONNECTIONS)); + } + + /** + * Gets the maximum amount of time in seconds any connection, whether its been + * idle or active, should even be in the pool. This will terminate the + * connection after the expiration age and force new connections to be opened. + * + * @return default of {@value #DEFAULT_JDBC_POOL_MAX_AGE_SECONDS} + */ + public int getConnectionPoolMaximumAge() { + return Integer.parseInt(properties.getProperty( + SERVER_JDBC_CONNECTION_POOL_MAX_AGE, DEFAULT_JDBC_POOL_MAX_AGE_SECONDS)); + } + + /** + * Gets the maximum amount of time in seconds that an idle connection can + * remain in the pool. This should always be greater than the value returned + * from {@link #getConnectionPoolMaximumExcessIdle()} + * + * @return default of {@value #DEFAULT_JDBC_POOL_MAX_IDLE_TIME_SECONDS} + */ + public int getConnectionPoolMaximumIdle() { + return Integer.parseInt(properties.getProperty( + SERVER_JDBC_CONNECTION_POOL_MAX_IDLE_TIME, + DEFAULT_JDBC_POOL_MAX_IDLE_TIME_SECONDS)); + } + + /** + * Gets the maximum amount of time in seconds that connections beyond the + * minimum pool size should remain in the pool. This should always be less + * than than the value returned from {@link #getConnectionPoolMaximumIdle()} + * + * @return default of {@value #DEFAULT_JDBC_POOL_EXCESS_MAX_IDLE_TIME_SECONDS} + */ + public int getConnectionPoolMaximumExcessIdle() { + return Integer.parseInt(properties.getProperty( + SERVER_JDBC_CONNECTION_POOL_MAX_IDLE_TIME_EXCESS, + DEFAULT_JDBC_POOL_EXCESS_MAX_IDLE_TIME_SECONDS)); + } + + /** + * Gets the number of connections that should be retrieved when the pool size + * must increase. It's wise to set this higher than 1 since the assumption is + * that a pool that needs to grow should probably grow by more than 1. + * + * @return default of {@value #DEFAULT_JDBC_POOL_ACQUISITION_SIZE} + */ + public int getConnectionPoolAcquisitionSize() { + return Integer.parseInt(properties.getProperty( + SERVER_JDBC_CONNECTION_POOL_AQUISITION_SIZE, + DEFAULT_JDBC_POOL_ACQUISITION_SIZE)); + } + + /** + * Gets the number of seconds in between testing each idle connection in the + * connection pool for validity. + * + * @return default of {@value #DEFAULT_JDBC_POOL_IDLE_TEST_INTERVAL} + */ + public int getConnectionPoolIdleTestInternval() { + return Integer.parseInt(properties.getProperty( + SERVER_JDBC_CONNECTION_POOL_IDLE_TEST_INTERVAL, + DEFAULT_JDBC_POOL_IDLE_TEST_INTERVAL)); + } + } http://git-wip-us.apache.org/repos/asf/ambari/blob/6d7d82ce/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java index 3b59fed..b9f04f1 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java @@ -18,13 +18,43 @@ package org.apache.ambari.server.controller; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.google.gson.Gson; -import com.google.inject.Inject; -import com.google.inject.Injector; -import com.google.inject.Singleton; -import com.google.inject.persist.Transactional; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_DRIVER; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_PASSWORD; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_URL; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_USERNAME; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.CLIENTS_TO_UPDATE_CONFIGS; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_TIMEOUT; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_DRIVER_FILENAME; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.GROUP_LIST; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.PACKAGE_LIST; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.REPO_INFO; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT_TYPE; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_REPO_INFO; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_LIST; + +import java.io.File; +import java.io.IOException; +import java.net.InetAddress; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.TimeUnit; + import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.ClusterNotFoundException; import org.apache.ambari.server.DuplicateResourceException; @@ -45,6 +75,7 @@ import org.apache.ambari.server.actionmanager.StageFactory; import org.apache.ambari.server.agent.ExecutionCommand; import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.configuration.Configuration; +import org.apache.ambari.server.configuration.Configuration.DatabaseType; import org.apache.ambari.server.controller.internal.RequestOperationLevel; import org.apache.ambari.server.controller.internal.RequestResourceFilter; import org.apache.ambari.server.controller.internal.RequestStageContainer; @@ -110,42 +141,13 @@ import org.apache.http.client.utils.URIBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; -import java.io.IOException; -import java.net.InetAddress; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.TimeUnit; - -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_DRIVER; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_PASSWORD; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_URL; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_USERNAME; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.CLIENTS_TO_UPDATE_CONFIGS; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_TIMEOUT; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_DRIVER_FILENAME; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.GROUP_LIST; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.PACKAGE_LIST; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.REPO_INFO; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT_TYPE; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_REPO_INFO; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_LIST; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.gson.Gson; +import com.google.inject.Inject; +import com.google.inject.Injector; +import com.google.inject.Singleton; +import com.google.inject.persist.Transactional; @Singleton public class AmbariManagementControllerImpl implements AmbariManagementController { @@ -1721,11 +1723,10 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle String groupList = gson.toJson(groupSet); hostParams.put(GROUP_LIST, groupList); - if (configs.getServerDBName().equalsIgnoreCase(Configuration - .ORACLE_DB_NAME)) { + DatabaseType databaseType = configs.getDatabaseType(); + if (databaseType == DatabaseType.ORACLE) { hostParams.put(DB_DRIVER_FILENAME, configs.getOjdbcJarName()); - } else if (configs.getServerDBName().equalsIgnoreCase(Configuration - .MYSQL_DB_NAME)) { + } else if (databaseType == DatabaseType.MYSQL) { hostParams.put(DB_DRIVER_FILENAME, configs.getMySQLJarName()); } @@ -3118,7 +3119,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle String formatted_suffix = String.format(suffix, repoName); String spec = request.getBaseUrl().trim(); - // This logic is to identify if the end of baseurl has a slash ('/') and/or the beginning of suffix String (e.g. "/repodata/repomd.xml") + // This logic is to identify if the end of baseurl has a slash ('/') and/or the beginning of suffix String (e.g. "/repodata/repomd.xml") // has a slash and they can form a good url. // e.g. "http://baseurl.com/" + "/repodata/repomd.xml" becomes "http://baseurl.com/repodata/repomd.xml" but not "http://baseurl.com//repodata/repomd.xml" if (spec.charAt(spec.length() - 1) != '/' && formatted_suffix.charAt(0) != '/') { http://git-wip-us.apache.org/repos/asf/ambari/blob/6d7d82ce/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java index 85ae85b..9c8bcd7 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java @@ -30,8 +30,10 @@ import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_DRIV import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_PASSWORD; import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_URL; import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_USER; +import static org.eclipse.persistence.config.PersistenceUnitProperties.NON_JTA_DATASOURCE; import static org.eclipse.persistence.config.PersistenceUnitProperties.THROW_EXCEPTIONS; +import java.beans.PropertyVetoException; import java.lang.annotation.Annotation; import java.security.SecureRandom; import java.text.MessageFormat; @@ -54,6 +56,8 @@ import org.apache.ambari.server.actionmanager.HostRoleCommandFactoryImpl; import org.apache.ambari.server.actionmanager.RequestFactory; import org.apache.ambari.server.actionmanager.StageFactory; import org.apache.ambari.server.configuration.Configuration; +import org.apache.ambari.server.configuration.Configuration.ConnectionPoolType; +import org.apache.ambari.server.configuration.Configuration.DatabaseType; import org.apache.ambari.server.controller.internal.ComponentResourceProvider; import org.apache.ambari.server.controller.internal.HostComponentResourceProvider; import org.apache.ambari.server.controller.internal.HostResourceProvider; @@ -123,6 +127,7 @@ import com.google.inject.assistedinject.FactoryModuleBuilder; import com.google.inject.name.Names; import com.google.inject.persist.PersistModule; import com.google.inject.persist.jpa.AmbariJpaPersistModule; +import com.mchange.v2.c3p0.ComboPooledDataSource; /** * Used for injection purposes. @@ -162,11 +167,15 @@ public class ControllerModule extends AbstractModule { public static Properties getPersistenceProperties(Configuration configuration) { Properties properties = new Properties(); + // log what database type has been calculated + DatabaseType databaseType = configuration.getDatabaseType(); + LOG.info("Detected {} as the database type from the JDBC URL", databaseType); + // custom jdbc properties - Map<String, String> custom = configuration.getDatabaseCustomProperties(); + Map<String, String> customProperties = configuration.getDatabaseCustomProperties(); - if (0 != custom.size()) { - for (Entry<String, String> entry : custom.entrySet()) { + if (0 != customProperties.size()) { + for (Entry<String, String> entry : customProperties.entrySet()) { properties.setProperty("eclipselink.jdbc.property." + entry.getKey(), entry.getValue()); } @@ -187,6 +196,61 @@ public class ControllerModule extends AbstractModule { properties.setProperty(JDBC_DRIVER, Configuration.JDBC_LOCAL_DRIVER); break; } + + // determine the type of pool to use + boolean isConnectionPoolingExternal = false; + ConnectionPoolType connectionPoolType = configuration.getConnectionPoolType(); + if (connectionPoolType == ConnectionPoolType.C3P0) { + isConnectionPoolingExternal = true; + } + + // force the use of c3p0 with MySQL + if (databaseType == DatabaseType.MYSQL) { + isConnectionPoolingExternal = true; + } + + // use c3p0 + if (isConnectionPoolingExternal) { + LOG.info("Using c3p0 {} as the EclipsLink DataSource", + ComboPooledDataSource.class.getSimpleName()); + + // Oracle requires a different validity query + String testQuery = "SELECT 1"; + if (databaseType == DatabaseType.ORACLE) { + testQuery = "SELECT 1 FROM DUAL"; + } + + ComboPooledDataSource dataSource = new ComboPooledDataSource(); + + // attempt to load the driver; if this fails, warn and move on + try { + dataSource.setDriverClass(configuration.getDatabaseDriver()); + } catch (PropertyVetoException pve) { + LOG.warn("Unable to initialize c3p0", pve); + return properties; + } + + // basic configuration stuff + dataSource.setJdbcUrl(configuration.getDatabaseUrl()); + dataSource.setUser(configuration.getDatabaseUser()); + dataSource.setPassword(configuration.getDatabasePassword()); + + // pooling + dataSource.setMinPoolSize(configuration.getConnectionPoolMinimumSize()); + dataSource.setInitialPoolSize(configuration.getConnectionPoolMinimumSize()); + dataSource.setMaxPoolSize(configuration.getConnectionPoolMaximumSize()); + dataSource.setAcquireIncrement(configuration.getConnectionPoolAcquisitionSize()); + + // validity + dataSource.setMaxConnectionAge(configuration.getConnectionPoolMaximumAge()); + dataSource.setMaxIdleTime(configuration.getConnectionPoolMaximumIdle()); + dataSource.setMaxIdleTimeExcessConnections(configuration.getConnectionPoolMaximumExcessIdle()); + dataSource.setPreferredTestQuery(testQuery); + dataSource.setIdleConnectionTestPeriod(configuration.getConnectionPoolIdleTestInternval()); + + properties.put(NON_JTA_DATASOURCE, dataSource); + } + return properties; } @@ -261,7 +325,7 @@ public class ControllerModule extends AbstractModule { PersistenceType persistenceType = configuration.getPersistenceType(); AmbariJpaPersistModule jpaPersistModule = new AmbariJpaPersistModule(Configuration.JDBC_UNIT_NAME); - Properties persistenceProperties = getPersistenceProperties(configuration); + Properties persistenceProperties = ControllerModule.getPersistenceProperties(configuration); if (!persistenceType.equals(PersistenceType.IN_MEMORY)) { persistenceProperties.setProperty(JDBC_USER, configuration.getDatabaseUser()); @@ -289,7 +353,6 @@ public class ControllerModule extends AbstractModule { } jpaPersistModule.properties(persistenceProperties); - return jpaPersistModule; } @@ -341,7 +404,7 @@ public class ControllerModule extends AbstractModule { * A second example of where this is needed is when classes require static * members that are available via injection. * <p/> - * If {@code beanDefinitions} is empty or null this will scan + * If {@code beanDefinitions} is empty or null this will scan * {@code org.apache.ambari.server} (currently) for any {@link EagerSingleton} * or {@link StaticallyInject} or {@link AmbariService} instances. * http://git-wip-us.apache.org/repos/asf/ambari/blob/6d7d82ce/ambari-server/src/main/java/org/apache/ambari/server/orm/EclipseLinkSessionCustomizer.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/EclipseLinkSessionCustomizer.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/EclipseLinkSessionCustomizer.java new file mode 100644 index 0000000..2f4aacb --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/EclipseLinkSessionCustomizer.java @@ -0,0 +1,58 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ambari.server.orm; + +import javax.activation.DataSource; + +import org.eclipse.persistence.config.SessionCustomizer; +import org.eclipse.persistence.sessions.JNDIConnector; +import org.eclipse.persistence.sessions.Session; + +/** + * The {@link EclipseLinkSessionCustomizer} is used as a way to quickly override + * the way that EclipseLink interacts with the database. Some possible uses of + * this class are: + * <ul> + * <li>Setting runtime analysis properties such as log levels and profilers</li> + * <li>Providing a custom {@link DataSource} via {@link JNDIConnector}</li> + * <li>Changing JDBC driver properties.</li> + * </ul> + * For example: + * + * <pre> + * DatabaseLogin login = (DatabaseLogin) session.getDatasourceLogin(); + * ComboPooledDataSource source = new ComboPooledDataSource(); + * source.setDriverClass(login.getDriverClassName()); + * source.setMaxConnectionAge(100); + * ... + * login.setConnector(new JNDIConnector(source)); + * + * <pre> + */ +public class EclipseLinkSessionCustomizer implements SessionCustomizer { + + /** + * {@inheritDoc} + * <p/> + * Currently a NOOP, this class exists for quick customization purposes. + */ + @Override + public void customize(Session session) throws Exception { + // NOOP + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/6d7d82ce/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionSchedulerImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionSchedulerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionSchedulerImpl.java index 324ee27..76ebac6 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionSchedulerImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionSchedulerImpl.java @@ -17,15 +17,13 @@ */ package org.apache.ambari.server.scheduler; -import com.google.inject.Inject; -import com.google.inject.Injector; -import com.google.inject.Singleton; +import java.util.List; +import java.util.Properties; + import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.configuration.Configuration; +import org.apache.ambari.server.configuration.Configuration.DatabaseType; import org.apache.ambari.server.state.scheduler.GuiceJobFactory; -import org.apache.ambari.server.state.scheduler.RequestExecution; -import org.apache.ambari.server.state.scheduler.Schedule; -import org.quartz.Job; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; @@ -35,8 +33,9 @@ import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; -import java.util.Properties; +import com.google.inject.Inject; +import com.google.inject.Injector; +import com.google.inject.Singleton; @Singleton public class ExecutionSchedulerImpl implements ExecutionScheduler { @@ -134,13 +133,13 @@ public class ExecutionSchedulerImpl implements ExecutionScheduler { protected String[] getQuartzDbDelegateClassAndValidationQuery() { - String dbUrl = configuration.getDatabaseUrl(); String dbDelegate = "org.quartz.impl.jdbcjobstore.StdJDBCDelegate"; String dbValidate = "select 0"; - if (dbUrl.contains(Configuration.POSTGRES_DB_NAME)) { + DatabaseType databaseType = configuration.getDatabaseType(); + if (databaseType == DatabaseType.POSTGRES) { dbDelegate = "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate"; - } else if (dbUrl.contains(Configuration.ORACLE_DB_NAME)) { + } else if (databaseType == DatabaseType.ORACLE) { dbDelegate = "org.quartz.impl.jdbcjobstore.oracle.OracleDelegate"; dbValidate = "select 0 from dual"; } http://git-wip-us.apache.org/repos/asf/ambari/blob/6d7d82ce/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java index 71049b2..1479840 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java @@ -17,14 +17,20 @@ */ package org.apache.ambari.server.upgrade; -import com.google.common.collect.Maps; -import com.google.inject.Inject; -import com.google.inject.Injector; -import com.google.inject.Provider; -import com.google.inject.persist.Transactional; +import java.sql.SQLException; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import javax.persistence.EntityManager; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.configuration.Configuration; +import org.apache.ambari.server.configuration.Configuration.DatabaseType; import org.apache.ambari.server.controller.AmbariManagementController; import org.apache.ambari.server.controller.ConfigurationRequest; import org.apache.ambari.server.orm.DBAccessor; @@ -35,24 +41,16 @@ import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.Config; import org.apache.ambari.server.state.ConfigHelper; import org.apache.ambari.server.state.PropertyInfo; -import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceInfo; -import org.apache.ambari.server.state.StackId; -import org.apache.ambari.server.state.StackInfo; import org.apache.ambari.server.utils.VersionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.persistence.EntityManager; - -import java.sql.SQLException; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.Map.Entry; +import com.google.common.collect.Maps; +import com.google.inject.Inject; +import com.google.inject.Injector; +import com.google.inject.Provider; +import com.google.inject.persist.Transactional; public abstract class AbstractUpgradeCatalog implements UpgradeCatalog { @Inject @@ -126,25 +124,6 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog { return rows; } - protected String getDbType() { - String dbUrl = configuration.getDatabaseUrl(); - String dbType; - - if (dbUrl.contains(Configuration.POSTGRES_DB_NAME)) { - dbType = Configuration.POSTGRES_DB_NAME; - } else if (dbUrl.contains(Configuration.ORACLE_DB_NAME)) { - dbType = Configuration.ORACLE_DB_NAME; - } else if (dbUrl.contains(Configuration.MYSQL_DB_NAME)) { - dbType = Configuration.MYSQL_DB_NAME; - } else if (dbUrl.contains(Configuration.DERBY_DB_NAME)) { - dbType = Configuration.DERBY_DB_NAME; - } else { - throw new RuntimeException("Unable to determine database type."); - } - - return dbType; - } - protected Provider<EntityManager> getEntityManagerProvider() { return injector.getProvider(EntityManager.class); } @@ -183,11 +162,11 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog { dbAccessor.executeQuery(String.format("ALTER ROLE %s SET search_path to '%s';", dbUser, schemaName)); } } - + public void addNewConfigurationsFromXml() throws AmbariException { ConfigHelper configHelper = injector.getInstance(ConfigHelper.class); AmbariManagementController controller = injector.getInstance(AmbariManagementController.class); - + Clusters clusters = controller.getClusters(); if (clusters == null) { return; @@ -197,23 +176,23 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog { if (clusterMap != null && !clusterMap.isEmpty()) { for (Cluster cluster : clusterMap.values()) { Map<String, Set<String>> newProperties = new HashMap<String, Set<String>>(); - + Set<PropertyInfo> stackProperties = configHelper.getStackProperties(cluster); for(String serviceName: cluster.getServices().keySet()) { Set<PropertyInfo> properties = configHelper.getServiceProperties(cluster, serviceName); - + if(properties == null) { continue; } properties.addAll(stackProperties); - + for(PropertyInfo property:properties) { String configType = ConfigHelper.fileNameToConfigType(property.getFilename()); Config clusterConfigs = cluster.getDesiredConfigByType(configType); if(clusterConfigs == null || !clusterConfigs.getProperties().containsKey(property.getName())) { LOG.info("Config " + property.getName() + " from " + configType + " from xml configurations" + " is not found on the cluster. Adding it..."); - + if(!newProperties.containsKey(configType)) { newProperties.put(configType, new HashSet<String>()); } @@ -221,22 +200,22 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog { } } } - - - + + + for (Entry<String, Set<String>> newProperty : newProperties.entrySet()) { updateConfigurationPropertiesWithValuesFromXml(newProperty.getKey(), newProperty.getValue(), false, true); } } } } - + /** * Create a new cluster scoped configuration with the new properties added * with the values from the coresponding xml files. - * + * * If xml owner service is not in the cluster, the configuration won't be added. - * + * * @param configType Configuration type. (hdfs-site, etc.) * @param properties Set property names. */ @@ -244,7 +223,7 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog { Set<String> propertyNames, boolean updateIfExists, boolean createNewConfigType) throws AmbariException { ConfigHelper configHelper = injector.getInstance(ConfigHelper.class); AmbariManagementController controller = injector.getInstance(AmbariManagementController.class); - + Clusters clusters = controller.getClusters(); if (clusters == null) { return; @@ -254,43 +233,43 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog { if (clusterMap != null && !clusterMap.isEmpty()) { for (Cluster cluster : clusterMap.values()) { Map<String, String> properties = new HashMap<String, String>(); - + for(String propertyName:propertyNames) { String propertyValue = configHelper.getPropertyValueFromStackDefinitions(cluster, configType, propertyName); - + if(propertyValue == null) { LOG.info("Config " + propertyName + " from " + configType + " is not found in xml definitions." + "Skipping configuration property update"); continue; } - + ServiceInfo propertyService = configHelper.getPropertyOwnerService(cluster, configType, propertyName); if(propertyService != null && !cluster.getServices().containsKey(propertyService.getName())) { LOG.info("Config " + propertyName + " from " + configType + " with value = " + propertyValue + " " + "Is not added due to service " + propertyService.getName() + " is not in the cluster."); continue; } - + properties.put(propertyName, propertyValue); } - + updateConfigurationPropertiesForCluster(cluster, configType, properties, updateIfExists, createNewConfigType); } } } - + protected void updateConfigurationPropertiesForCluster(Cluster cluster, String configType, Map<String, String> properties, boolean updateIfExists, boolean createNewConfigType) throws AmbariException { AmbariManagementController controller = injector.getInstance(AmbariManagementController.class); String newTag = "version" + System.currentTimeMillis(); - + if (properties != null) { Map<String, Config> all = cluster.getConfigsByType(configType); if (all == null || !all.containsKey(newTag) || properties.size() > 0) { Map<String, String> oldConfigProperties; Config oldConfig = cluster.getDesiredConfigByType(configType); - + if (oldConfig == null && !createNewConfigType) { LOG.info("Config " + configType + " not found. Assuming service not installed. " + "Skipping configuration properties update"); @@ -376,11 +355,13 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog { @Override public void upgradeSchema() throws AmbariException, SQLException { - if (getDbType().equals(Configuration.POSTGRES_DB_NAME)) { + DatabaseType databaseType = configuration.getDatabaseType(); + + if (databaseType == DatabaseType.POSTGRES) { changePostgresSearchPath(); } - this.executeDDLUpdates(); + executeDDLUpdates(); } @Override http://git-wip-us.apache.org/repos/asf/ambari/blob/6d7d82ce/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java index 2ccf16b..4ecfe44 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java @@ -17,14 +17,29 @@ */ package org.apache.ambari.server.upgrade; -import com.google.gson.Gson; -import com.google.inject.Inject; -import com.google.inject.Injector; +import java.io.File; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.persistence.EntityManager; +import javax.persistence.Query; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.actionmanager.HostRoleStatus; import org.apache.ambari.server.api.services.AmbariMetaInfo; -import org.apache.ambari.server.configuration.Configuration; +import org.apache.ambari.server.configuration.Configuration.DatabaseType; import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo; import org.apache.ambari.server.orm.dao.ClusterDAO; import org.apache.ambari.server.orm.dao.ClusterServiceDAO; @@ -57,20 +72,9 @@ import org.eclipse.persistence.jpa.JpaEntityManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.persistence.EntityManager; -import javax.persistence.Query; -import javax.persistence.TypedQuery; -import javax.persistence.criteria.*; - -import java.io.File; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Collection; -import java.util.HashMap; +import com.google.gson.Gson; +import com.google.inject.Inject; +import com.google.inject.Injector; public class UpgradeCatalog150 extends AbstractUpgradeCatalog { private static final Logger LOG = LoggerFactory.getLogger(UpgradeCatalog150.class); @@ -86,7 +90,7 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { @Override public void executeDDLUpdates() throws AmbariException, SQLException { LOG.debug("Upgrading schema..."); - String dbType = getDbType(); + DatabaseType databaseType = configuration.getDatabaseType(); List<DBColumnInfo> columns = new ArrayList<DBColumnInfo>(); // ======================================================================== @@ -276,7 +280,7 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { // Alter columns - if (dbType.equals(Configuration.POSTGRES_DB_NAME)) { + if (databaseType == DatabaseType.POSTGRES) { if (dbAccessor.tableExists("hostcomponentdesiredconfigmapping")) { dbAccessor.executeQuery("ALTER TABLE hostcomponentdesiredconfigmapping rename to hcdesiredconfigmapping", true); } @@ -284,8 +288,7 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { dbAccessor.executeQuery("ALTER TABLE users ALTER column ldap_user TYPE INTEGER USING CASE WHEN ldap_user=true THEN 1 ELSE 0 END", true); } - if (Configuration.ORACLE_DB_NAME.equals(dbType) || - Configuration.POSTGRES_DB_NAME.equals(dbType)) { + if (databaseType == DatabaseType.ORACLE || databaseType == DatabaseType.POSTGRES) { if (dbAccessor.tableHasColumn("hosts", "disks_info")) { dbAccessor.executeQuery("ALTER TABLE hosts DROP COLUMN disks_info", true); } @@ -293,7 +296,7 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { //Move tables from ambarirca db to ambari db; drop ambarirca; Mysql - if (dbType.equals(Configuration.MYSQL_DB_NAME)) { + if (databaseType == DatabaseType.MYSQL) { String dbName = configuration.getServerJDBCPostgresSchemaName(); moveRCATableInMySQL("workflow", dbName); moveRCATableInMySQL("job", dbName); @@ -314,11 +317,11 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { throw new AmbariException(msg); } else if (!dbAccessor.tableHasData(tableName)) { String query = null; - if (dbType.equals(Configuration.POSTGRES_DB_NAME)) { + if (databaseType == DatabaseType.POSTGRES) { query = getPostgresRequestUpgradeQuery(); - } else if (dbType.equals(Configuration.ORACLE_DB_NAME)) { + } else if (databaseType == DatabaseType.ORACLE) { query = getOracleRequestUpgradeQuery(); - } else if (Configuration.MYSQL_DB_NAME.equals(dbType)) { + } else if (databaseType == DatabaseType.MYSQL) { query = getMysqlRequestUpgradeQuery(); } @@ -331,9 +334,9 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { // Drop old constraints // ======================================================================== - if (Configuration.POSTGRES_DB_NAME.equals(dbType) - || Configuration.MYSQL_DB_NAME.equals(dbType) - || Configuration.DERBY_DB_NAME.equals(dbType)) { + if (databaseType == DatabaseType.POSTGRES + || databaseType == DatabaseType.MYSQL + || databaseType == DatabaseType.DERBY) { //recreate old constraints to sync with oracle dbAccessor.dropConstraint("clusterconfigmapping", "FK_clusterconfigmapping_cluster_id"); @@ -410,7 +413,7 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { public void executeDMLUpdates() throws AmbariException, SQLException { // Service Config mapping String tableName = "serviceconfigmapping"; - String dbType = getDbType(); + DatabaseType databaseType = configuration.getDatabaseType(); EntityManager em = getEntityManagerProvider().get(); @@ -420,7 +423,7 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { && dbAccessor.tableHasData(tableName) && dbAccessor.tableExists("clusterconfigmapping")) { - if (dbType.equals(Configuration.POSTGRES_DB_NAME)) { + if (databaseType == DatabaseType.POSTGRES) { // Service config mapping entity object will be deleted so need to // proceed with executing as query @@ -430,13 +433,13 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { } else { LOG.warn("Unsupported database for service config mapping query. " + - "database = " + dbType); + "database = " + databaseType); } } // Sequences if (dbAccessor.tableExists("ambari_sequences")) { - if (dbType.equals(Configuration.POSTGRES_DB_NAME)) { + if (databaseType == DatabaseType.POSTGRES) { ResultSet resultSet = dbAccessor.executeSelect("select * from ambari_sequences where sequence_name in " + "('cluster_id_seq','user_id_seq','host_role_command_id_seq')"); @@ -539,7 +542,7 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { } } }); - + // add history server on the host where jobtracker is executeInTransaction(new Runnable() { @Override @@ -574,46 +577,48 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { ClusterDAO clusterDAO = injector.getInstance(ClusterDAO.class); ClusterServiceDAO clusterServiceDAO = injector.getInstance(ClusterServiceDAO.class); ServiceComponentDesiredStateDAO serviceComponentDesiredStateDAO = injector.getInstance(ServiceComponentDesiredStateDAO.class); - + List<ClusterEntity> clusterEntities = clusterDAO.findAll(); for (final ClusterEntity clusterEntity : clusterEntities) { ServiceComponentDesiredStateEntityPK pkHS = new ServiceComponentDesiredStateEntityPK(); pkHS.setComponentName("HISTORYSERVER"); pkHS.setClusterId(clusterEntity.getClusterId()); pkHS.setServiceName("MAPREDUCE"); - + ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntityHS = serviceComponentDesiredStateDAO.findByPK(pkHS); - + // already have historyserver - if(serviceComponentDesiredStateEntityHS != null) + if(serviceComponentDesiredStateEntityHS != null) { continue; - + } + ServiceComponentDesiredStateEntityPK pkJT = new ServiceComponentDesiredStateEntityPK(); pkJT.setComponentName("JOBTRACKER"); pkJT.setClusterId(clusterEntity.getClusterId()); pkJT.setServiceName("MAPREDUCE"); - + ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntityJT = serviceComponentDesiredStateDAO.findByPK(pkJT); - + // no jobtracker present probably mapreduce is not installed - if(serviceComponentDesiredStateEntityJT == null) + if(serviceComponentDesiredStateEntityJT == null) { continue; + } + - HostComponentStateEntity jtHostComponentStateEntity = serviceComponentDesiredStateEntityJT.getHostComponentStateEntities().iterator().next(); HostComponentDesiredStateEntity jtHostComponentDesiredStateEntity = serviceComponentDesiredStateEntityJT.getHostComponentDesiredStateEntities().iterator().next(); String jtHostname = jtHostComponentStateEntity.getHostName(); State jtCurrState = jtHostComponentStateEntity.getCurrentState(); State jtHostComponentDesiredState = jtHostComponentDesiredStateEntity.getDesiredState(); State jtServiceComponentDesiredState = serviceComponentDesiredStateEntityJT.getDesiredState(); - + ClusterServiceEntityPK pk = new ClusterServiceEntityPK(); pk.setClusterId(clusterEntity.getClusterId()); pk.setServiceName("MAPREDUCE"); - + ClusterServiceEntity clusterServiceEntity = clusterServiceDAO.findByPK(pk); - - + + final ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity = new ServiceComponentDesiredStateEntity(); serviceComponentDesiredStateEntity.setComponentName("HISTORYSERVER"); serviceComponentDesiredStateEntity.setDesiredStackVersion(clusterEntity.getDesiredStackVersion()); @@ -625,21 +630,21 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { stateEntity.setHostName(jtHostname); stateEntity.setCurrentState(jtCurrState); stateEntity.setCurrentStackVersion(clusterEntity.getDesiredStackVersion()); - + final HostComponentDesiredStateEntity desiredStateEntity = new HostComponentDesiredStateEntity(); desiredStateEntity.setDesiredState(jtHostComponentDesiredState); desiredStateEntity.setDesiredStackVersion(clusterEntity.getDesiredStackVersion()); - + persistComponentEntities(stateEntity, desiredStateEntity, serviceComponentDesiredStateEntity); } } - + private void persistComponentEntities(HostComponentStateEntity stateEntity, HostComponentDesiredStateEntity desiredStateEntity, ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity) { ServiceComponentDesiredStateDAO serviceComponentDesiredStateDAO = injector.getInstance(ServiceComponentDesiredStateDAO.class); HostComponentStateDAO hostComponentStateDAO = injector.getInstance(HostComponentStateDAO.class); HostComponentDesiredStateDAO hostComponentDesiredStateDAO = injector.getInstance(HostComponentDesiredStateDAO.class); HostDAO hostDAO = injector.getInstance(HostDAO.class); - + HostEntity hostEntity = hostDAO.findByName(stateEntity.getHostName()); hostEntity.getHostComponentStateEntities().add(stateEntity); hostEntity.getHostComponentDesiredStateEntities().add(desiredStateEntity); @@ -697,7 +702,7 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { for (String configType : configTypes) { if (configType.contains(log4jConfigTypeContains)) { ClusterConfigEntity configEntity = clusterDAO.findConfig(clusterId, configType, defaultVersionTag); - + if (configEntity == null) { String filename = configType + ".xml"; Map<String, String> properties = new HashMap<String, String>(); @@ -856,12 +861,12 @@ public class UpgradeCatalog150 extends AbstractUpgradeCatalog { } private void createQuartzTables() throws SQLException { - String dbType = getDbType(); + DatabaseType databaseType = configuration.getDatabaseType(); // Run script to create quartz tables String scriptPath = configuration.getResourceDirPath() + File.separator + "upgrade" + File.separator + "ddl" + - File.separator + String.format(quartzScriptFilePattern, dbType); + File.separator + String.format(quartzScriptFilePattern, databaseType.getName()); try { dbAccessor.executeScript(scriptPath); http://git-wip-us.apache.org/repos/asf/ambari/blob/6d7d82ce/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog151.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog151.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog151.java index 72305c5..afe27b5 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog151.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog151.java @@ -17,21 +17,22 @@ */ package org.apache.ambari.server.upgrade; -import com.google.inject.Inject; -import com.google.inject.Injector; -import org.apache.ambari.server.AmbariException; -import org.apache.ambari.server.configuration.Configuration; -import org.apache.ambari.server.orm.DBAccessor; - import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import org.apache.ambari.server.AmbariException; +import org.apache.ambari.server.configuration.Configuration.DatabaseType; +import org.apache.ambari.server.orm.DBAccessor; + +import com.google.inject.Inject; +import com.google.inject.Injector; + /** * Upgrade catalog for version 1.5.1. */ public class UpgradeCatalog151 extends AbstractUpgradeCatalog { - + //SourceVersion is only for book-keeping purpose @Override public String getSourceVersion() { @@ -52,6 +53,7 @@ public class UpgradeCatalog151 extends AbstractUpgradeCatalog { @Override protected void executeDDLUpdates() throws AmbariException, SQLException { List<DBAccessor.DBColumnInfo> columns = new ArrayList<DBAccessor.DBColumnInfo>(); + DatabaseType databaseType = configuration.getDatabaseType(); // ======================================================================== // Create tables @@ -108,12 +110,12 @@ public class UpgradeCatalog151 extends AbstractUpgradeCatalog { columns.add(new DBAccessor.DBColumnInfo("subResource_names", String.class, 255, null, true)); columns.add(new DBAccessor.DBColumnInfo("provider", String.class, 255, null, true)); columns.add(new DBAccessor.DBColumnInfo("service", String.class, 255, null, true)); - if (Configuration.MYSQL_DB_NAME.equals(getDbType())) { + if (databaseType == DatabaseType.MYSQL) { columns.add(new DBAccessor.DBColumnInfo("`resource`", String.class, 255, null, true)); //TODO incorrect name for MySQL - + } else{ - columns.add(new DBAccessor.DBColumnInfo("\"resource\"", String.class, 255, null, true)); + columns.add(new DBAccessor.DBColumnInfo("\"resource\"", String.class, 255, null, true)); //TODO incorrect name for oracle } dbAccessor.createTable("viewresource", columns, "view_name", "name"); http://git-wip-us.apache.org/repos/asf/ambari/blob/6d7d82ce/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog160.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog160.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog160.java index cd01779..a1f11d8 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog160.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog160.java @@ -24,7 +24,7 @@ import java.util.Collections; import java.util.List; import org.apache.ambari.server.AmbariException; -import org.apache.ambari.server.configuration.Configuration; +import org.apache.ambari.server.configuration.Configuration.DatabaseType; import org.apache.ambari.server.orm.DBAccessor; import com.google.inject.Inject; @@ -100,8 +100,9 @@ public class UpgradeCatalog160 extends AbstractUpgradeCatalog { protected void fixViewTablesForMysql() throws SQLException { //fixes 1.5.1 issue for mysql with non-default db name //view tables were not created - - if (!Configuration.MYSQL_DB_NAME.equals(getDbType()) || "ambari".equals(configuration.getServerDBName())) { + DatabaseType databaseType = configuration.getDatabaseType(); + if (!(databaseType == DatabaseType.MYSQL) + || "ambari".equals(configuration.getServerDBName())) { //no need to run for non-mysql dbms or default db name return; } http://git-wip-us.apache.org/repos/asf/ambari/blob/6d7d82ce/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog161.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog161.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog161.java index f5afb46..4ab0cb6 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog161.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog161.java @@ -24,11 +24,12 @@ import java.sql.Types; import java.util.ArrayList; import java.util.Collections; import java.util.List; + import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import org.apache.ambari.server.AmbariException; -import org.apache.ambari.server.configuration.Configuration; +import org.apache.ambari.server.configuration.Configuration.DatabaseType; import org.apache.ambari.server.orm.DBAccessor; import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo; import org.apache.ambari.server.orm.entities.ClusterEntity; @@ -68,7 +69,7 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog { @Override protected void executeDDLUpdates() throws AmbariException, SQLException { - String dbType = getDbType(); + DatabaseType databaseType = configuration.getDatabaseType(); List<DBColumnInfo> columns; @@ -86,7 +87,7 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog { // 1.6.0 initially shipped with restart_required as a BOOELAN so some // upgrades might be BOOLEAN but most are probably SMALLINT - if (Configuration.POSTGRES_DB_NAME.equals(dbType)) { + if (databaseType == DatabaseType.POSTGRES) { int columnType = dbAccessor.getColumnType("hostcomponentdesiredstate", "restart_required"); @@ -97,7 +98,7 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog { } } - if (Configuration.ORACLE_DB_NAME.equals(dbType)) { + if (databaseType == DatabaseType.ORACLE) { dbAccessor.executeQuery( "ALTER TABLE hostcomponentdesiredstate MODIFY (restart_required DEFAULT 0)", true); @@ -125,12 +126,12 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog { dbAccessor.dropConstraint("viewinstance", "FK_viewinst_view_name"); //modify primary key of viewinstancedata - if (Configuration.ORACLE_DB_NAME.equals(dbType) - || Configuration.MYSQL_DB_NAME.equals(dbType) - || Configuration.DERBY_DB_NAME.equals(dbType)) { + if (databaseType == DatabaseType.ORACLE + || databaseType == DatabaseType.MYSQL + || databaseType == DatabaseType.DERBY) { dbAccessor.executeQuery("ALTER TABLE viewinstance DROP PRIMARY KEY", true); dbAccessor.executeQuery("ALTER TABLE viewinstancedata DROP PRIMARY KEY", true); - } else if (Configuration.POSTGRES_DB_NAME.equals(dbType)) { + } else if (databaseType == DatabaseType.POSTGRES) { dbAccessor.executeQuery("ALTER TABLE viewinstance DROP CONSTRAINT viewinstance_pkey CASCADE", true); dbAccessor.executeQuery("ALTER TABLE viewinstancedata DROP CONSTRAINT viewinstancedata_pkey CASCADE", true); } @@ -140,7 +141,7 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog { dbAccessor.addColumn("viewinstancedata", new DBAccessor.DBColumnInfo("view_instance_id", Long.class, null, null, true)); - if (Configuration.ORACLE_DB_NAME.equals(dbType)) { + if (databaseType == DatabaseType.ORACLE) { //sequence looks to be simpler than rownum if (dbAccessor.tableHasData("viewinstancedata")) { dbAccessor.executeQuery("CREATE SEQUENCE TEMP_SEQ " + @@ -153,12 +154,12 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog { dbAccessor.executeQuery("UPDATE viewinstance SET view_instance_id = TEMP_SEQ.NEXTVAL"); dbAccessor.dropSequence("TEMP_SEQ"); } - } else if (Configuration.MYSQL_DB_NAME.equals(dbType)) { + } else if (databaseType == DatabaseType.MYSQL) { if (dbAccessor.tableHasData("viewinstance")) { dbAccessor.executeQuery("UPDATE viewinstance " + "SET view_instance_id = (SELECT @a := @a + 1 FROM (SELECT @a := 1) s)"); } - } else if (Configuration.POSTGRES_DB_NAME.equals(dbType)) { + } else if (databaseType == DatabaseType.POSTGRES) { if (dbAccessor.tableHasData("viewinstance")) { //window functions like row_number were added in 8.4, workaround for earlier versions (redhat/centos 5) dbAccessor.executeQuery("CREATE SEQUENCE temp_seq START WITH 1"); @@ -169,7 +170,7 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog { } - if (Configuration.DERBY_DB_NAME.equals(dbType)) { + if (databaseType == DatabaseType.DERBY) { dbAccessor.executeQuery("ALTER TABLE viewinstance ALTER COLUMN view_instance_id DEFAULT 0"); dbAccessor.executeQuery("ALTER TABLE viewinstance ALTER COLUMN view_instance_id NOT NULL"); dbAccessor.executeQuery("ALTER TABLE viewinstancedata ALTER COLUMN view_instance_id DEFAULT 0"); @@ -188,14 +189,14 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog { new String[]{"view_name", "view_instance_name"}, "viewinstance", new String[]{"view_name", "name"}, true); dbAccessor.addFKConstraint("viewinstance", "FK_viewinst_view_name", "view_name", "viewmain", "view_name", true); - if (Configuration.POSTGRES_DB_NAME.equals(dbType)) { + if (databaseType == DatabaseType.POSTGRES) { dbAccessor.executeQuery("UPDATE viewinstancedata " + "SET view_instance_id = vi.view_instance_id FROM viewinstance AS vi " + "WHERE vi.name = viewinstancedata.view_instance_name AND vi.view_name = viewinstancedata.view_name"); - } else if (Configuration.ORACLE_DB_NAME.equals(dbType)) { + } else if (databaseType == DatabaseType.ORACLE) { dbAccessor.executeQuery("UPDATE viewinstancedata vid SET view_instance_id = (" + "SELECT view_instance_id FROM viewinstance vi WHERE vi.name = vid.view_instance_name AND vi.view_name = vid.view_name)"); - } else if (Configuration.MYSQL_DB_NAME.equals(dbType)) { + } else if (databaseType == DatabaseType.MYSQL) { dbAccessor.executeQuery("UPDATE viewinstancedata AS vid JOIN viewinstance AS vi " + "ON vi.name = vid.view_instance_name AND vi.view_name = vid.view_name " + "SET vid.view_instance_id = vi.view_instance_id"); @@ -221,8 +222,8 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog { } String valueColumnName = "\"value\""; - if (Configuration.ORACLE_DB_NAME.equals(dbType) - || Configuration.MYSQL_DB_NAME.equals(dbType)) { + if (databaseType == DatabaseType.ORACLE + || databaseType == DatabaseType.MYSQL) { valueColumnName = "value"; } http://git-wip-us.apache.org/repos/asf/ambari/blob/6d7d82ce/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java index 47f4587..98ac89f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java @@ -44,6 +44,7 @@ import javax.persistence.criteria.Root; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.configuration.Configuration; +import org.apache.ambari.server.configuration.Configuration.DatabaseType; import org.apache.ambari.server.controller.AmbariManagementController; import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo; import org.apache.ambari.server.orm.dao.ClusterDAO; @@ -164,10 +165,12 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog { @Override protected void executeDDLUpdates() throws AmbariException, SQLException { + DatabaseType databaseType = configuration.getDatabaseType(); + // needs to be executed first renameSequenceValueColumnName(); - String dbType = getDbType(); + List<DBColumnInfo> columns; // add group and members tables @@ -250,7 +253,7 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog { dbAccessor.insertRow("adminprivilege", new String[]{"privilege_id", "permission_id", "resource_id", "principal_id"}, new String[]{"1", "1", "1", "1"}, true); - if (dbType.equals(Configuration.ORACLE_DB_NAME)) { + if (databaseType == DatabaseType.ORACLE) { dbAccessor.executeQuery("ALTER TABLE clusterconfig ADD config_attributes CLOB NULL"); } else { DBColumnInfo clusterConfigAttributesColumn = new DBColumnInfo( @@ -316,17 +319,17 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog { dbAccessor.dropConstraint("confgroupclusterconfigmapping", "FK_confg"); - if (Configuration.ORACLE_DB_NAME.equals(dbType) - || Configuration.MYSQL_DB_NAME.equals(dbType) - || Configuration.DERBY_DB_NAME.equals(dbType)) { + if (databaseType == DatabaseType.ORACLE + || databaseType == DatabaseType.MYSQL + || databaseType == DatabaseType.DERBY) { dbAccessor.executeQuery("ALTER TABLE clusterconfig DROP PRIMARY KEY", true); - } else if (Configuration.POSTGRES_DB_NAME.equals(dbType)) { + } else if (databaseType == DatabaseType.POSTGRES) { dbAccessor.executeQuery("ALTER TABLE clusterconfig DROP CONSTRAINT clusterconfig_pkey CASCADE", true); } dbAccessor.addColumn("clusterconfig", new DBColumnInfo("config_id", Long.class, null, null, true)); - if (Configuration.ORACLE_DB_NAME.equals(dbType)) { + if (databaseType == DatabaseType.ORACLE) { //sequence looks to be simpler than rownum if (dbAccessor.tableHasData("clusterconfig")) { dbAccessor.executeQuery("CREATE SEQUENCE TEMP_SEQ " + @@ -339,12 +342,12 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog { dbAccessor.executeQuery("UPDATE clusterconfig SET config_id = TEMP_SEQ.NEXTVAL"); dbAccessor.dropSequence("TEMP_SEQ"); } - } else if (Configuration.MYSQL_DB_NAME.equals(dbType)) { + } else if (databaseType == DatabaseType.MYSQL) { if (dbAccessor.tableHasData("clusterconfig")) { dbAccessor.executeQuery("UPDATE clusterconfig " + "SET config_id = (SELECT @a := @a + 1 FROM (SELECT @a := 1) s)"); } - } else if (Configuration.POSTGRES_DB_NAME.equals(dbType)) { + } else if (databaseType == DatabaseType.POSTGRES) { if (dbAccessor.tableHasData("clusterconfig")) { //window functions like row_number were added in 8.4, workaround for earlier versions (redhat/centos 5) dbAccessor.executeQuery("CREATE SEQUENCE temp_seq START WITH 1"); @@ -354,20 +357,20 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog { } // alter view tables description columns size - if (dbType.equals(Configuration.ORACLE_DB_NAME) || - dbType.equals(Configuration.MYSQL_DB_NAME)) { + if (databaseType == DatabaseType.ORACLE + || databaseType == DatabaseType.MYSQL) { dbAccessor.executeQuery("ALTER TABLE viewinstance MODIFY description VARCHAR(2048)"); dbAccessor.executeQuery("ALTER TABLE viewparameter MODIFY description VARCHAR(2048)"); - } else if (Configuration.POSTGRES_DB_NAME.equals(dbType)) { + } else if (databaseType == DatabaseType.POSTGRES) { dbAccessor.executeQuery("ALTER TABLE viewinstance ALTER COLUMN description TYPE VARCHAR(2048)"); dbAccessor.executeQuery("ALTER TABLE viewparameter ALTER COLUMN description TYPE VARCHAR(2048)"); - } else if (dbType.equals(Configuration.DERBY_DB_NAME)) { + } else if (databaseType == DatabaseType.DERBY) { dbAccessor.executeQuery("ALTER TABLE viewinstance ALTER COLUMN description SET DATA TYPE VARCHAR(2048)"); dbAccessor.executeQuery("ALTER TABLE viewparameter ALTER COLUMN description SET DATA TYPE VARCHAR(2048)"); } //upgrade unit test workaround - if (Configuration.DERBY_DB_NAME.equals(dbType)) { + if (databaseType == DatabaseType.DERBY) { dbAccessor.executeQuery("ALTER TABLE clusterconfig ALTER COLUMN config_id DEFAULT 0"); dbAccessor.executeQuery("ALTER TABLE clusterconfig ALTER COLUMN config_id NOT NULL"); } @@ -384,7 +387,7 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog { dbAccessor.executeQuery("ALTER TABLE clusterconfig ADD CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag)", true); dbAccessor.executeQuery("ALTER TABLE clusterconfig ADD CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version)", true); - if (!Configuration.ORACLE_DB_NAME.equals(dbType)) { + if (databaseType != DatabaseType.ORACLE) { dbAccessor.alterColumn("clusterconfig", new DBColumnInfo("config_data", char[].class, null, null, false)); dbAccessor.alterColumn("blueprint_configuration", new DBColumnInfo("config_data", char[].class, null, null, false)); dbAccessor.alterColumn("hostgroup_configuration", new DBColumnInfo("config_data", char[].class, null, null, false)); @@ -493,12 +496,12 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog { * thus requires custom approach for every database type. */ private void renameSequenceValueColumnName() throws AmbariException, SQLException { - final String dbType = getDbType(); - if (Configuration.MYSQL_DB_NAME.equals(dbType)) { + final DatabaseType databaseType = configuration.getDatabaseType(); + if (databaseType == DatabaseType.MYSQL) { dbAccessor.executeQuery("ALTER TABLE ambari_sequences CHANGE value sequence_value DECIMAL(38) NOT NULL"); - } else if (Configuration.DERBY_DB_NAME.equals(dbType)) { + } else if (databaseType == DatabaseType.DERBY) { dbAccessor.executeQuery("RENAME COLUMN ambari_sequences.\"value\" to sequence_value"); - } else if (Configuration.ORACLE_DB_NAME.equals(dbType)) { + } else if (databaseType == DatabaseType.ORACLE) { dbAccessor.executeQuery("ALTER TABLE ambari_sequences RENAME COLUMN value to sequence_value"); } else { // Postgres @@ -1254,7 +1257,7 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog { result.put("zk_data_dir","dataDir"); return result; } - + private void upgradePermissionModel() throws SQLException { final UserDAO userDAO = injector.getInstance(UserDAO.class); final PrincipalDAO principalDAO = injector.getInstance(PrincipalDAO.class); http://git-wip-us.apache.org/repos/asf/ambari/blob/6d7d82ce/ambari-server/src/main/resources/META-INF/persistence.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/META-INF/persistence.xml b/ambari-server/src/main/resources/META-INF/persistence.xml index d89f5d5..8c0d85f 100644 --- a/ambari-server/src/main/resources/META-INF/persistence.xml +++ b/ambari-server/src/main/resources/META-INF/persistence.xml @@ -79,19 +79,13 @@ <class>org.apache.ambari.server.orm.entities.ViewResourceEntity</class> <class>org.apache.ambari.server.orm.entities.ArtifactEntity</class> - - <properties> - <!--<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/ambari" />--> - <!--<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />--> + <properties> <property name="eclipselink.cache.size.default" value="10000" /> <property name="eclipselink.jdbc.batch-writing" value="JDBC"/> <property name="eclipselink.jdbc.batch-writing.size" value="4000"/> - <property name="eclipselink.jdbc.sequence-connection-pool" value="true" /> + <property name="eclipselink.connection-pool.sequence" value="true" /> <property name="eclipselink.weaving" value="static" /> - - <!--<property name="eclipselink.logging.level.sql" value="FINEST" />--> - <!--<property name="eclipselink.id-validation" value="NULL" />--> - + <property name="eclipselink.session.customizer" value="org.apache.ambari.server.orm.EclipseLinkSessionCustomizer"/> </properties> </persistence-unit>
