From a404238f4dbe50c6d31bf80bfbaa679eeda64ebd Mon Sep 17 00:00:00 2001 From: Ruben Vargas Date: Thu, 2 Jun 2016 18:35:28 -0500 Subject: [PATCH] Bug 1213812 - After upgrade from JBoss ON 3.2 to 3.3, some rhq column families are unavailable and compaction operations fail --- .../installer/InstallerServiceImpl.java | 2 + .../server/installer/ServerInstallUtil.java | 88 +++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java index 4a4f1de910e..7d792e4b177 100644 --- a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java +++ b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java @@ -711,6 +711,8 @@ public void updateStorageSchema(HashMap serverProperties) throws ExistingSchemaOption.KEEP); ServerInstallUtil.persistStorageNodesIfNecessary(serverProperties, clearTextDbPassword, parseNodeInformation(serverProperties, storageNodeAddresses)); + + ServerInstallUtil.removeObsoleteStorageColumnFamilies(serverProperties, clearTextDbPassword); } private Set prepareStorageSchema(HashMap serverProperties, String clearTextDbPassword, diff --git a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java index 5c352e00f06..7b82d79dc8a 100644 --- a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java +++ b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java @@ -75,6 +75,7 @@ import org.rhq.core.db.upgrade.ServerVersionColumnUpgrader; import org.rhq.core.domain.cloud.StorageNode; import org.rhq.core.domain.cloud.StorageNode.OperationMode; +import org.rhq.core.domain.resource.InventoryStatus; import org.rhq.core.util.PropertiesFileUpdate; import org.rhq.core.util.exception.ThrowableUtil; import org.rhq.core.util.file.FileUtil; @@ -1053,6 +1054,93 @@ public static void persistAdminPasswordIfNecessary(HashMap serve } } + /** + * Mark as uninventoried the obsolete column families for RHQ storage node resources. + * + * @param serverProperties the server properties + * @param dbpassword clear text password to connect to the database + * @throws Exception + */ + public static void removeObsoleteStorageColumnFamilies(HashMap serverProperties, String password) + throws Exception { + + DatabaseType db = null; + Connection connection = null; + Statement queryTypeStatement = null; + ResultSet resultSet = null; + + PreparedStatement uninventoriedStatement = null; + String[] columnKeys = { "one_hour_metrics", "six_hour_metrics", "twenty_four_hour_metrics", "metrics_index" }; + + try { + + LOG.info("Uninventory obsolete column families... "); + + String dbUrl = serverProperties.get(ServerProperties.PROP_DATABASE_CONNECTION_URL); + String userName = serverProperties.get(ServerProperties.PROP_DATABASE_USERNAME); + connection = getDatabaseConnection(dbUrl, userName, password); + db = DatabaseTypeFactory.getDatabaseType(connection); + + if (!(db instanceof PostgresqlDatabaseType || db instanceof OracleDatabaseType)) { + throw new IllegalArgumentException("Unknown database type, can't continue: " + db); + } + + queryTypeStatement = connection.createStatement(); + + // Get resource type id for ColumnFamily and RHQStorage plugin so we can make sure that + // we are going to uninventory only those resource types. + + resultSet = queryTypeStatement + .executeQuery("SELECT id FROM rhq_resource_type WHERE name='ColumnFamily' AND plugin='RHQStorage'"); + + if (!resultSet.next()) { + return; + } + + int resource_type_id = resultSet.getInt(1); + + if (resource_type_id != 0) { + + connection.setAutoCommit(false); + + // Mark obsolete column family resources as uninventoried + try { + + uninventoriedStatement = connection.prepareStatement( + "UPDATE rhq_resource SET inventory_status= ?, agent_id= ?, parent_resource_id = ?, resource_key = ? " + + " WHERE resource_type_id = ? AND resource_key= ?"); + + String uninventoryStatus = InventoryStatus.UNINVENTORIED.name(); + + uninventoriedStatement.setString(1, uninventoryStatus); + uninventoriedStatement.setNull(2, java.sql.Types.INTEGER); + uninventoriedStatement.setNull(3, java.sql.Types.INTEGER); + uninventoriedStatement.setString(4, "deleted"); + uninventoriedStatement.setInt(5, resource_type_id); + + for (String key : columnKeys) { + uninventoriedStatement.setString(6, key); + uninventoriedStatement.executeUpdate(); + } + + connection.commit(); + + } catch (SQLException e) { + connection.rollback(); + LOG.error("Failed uninventoried obsolete column families. Transaction will be rolled back.", e); + throw e; + } + } + } finally { + if (db != null) { + db.closeResultSet(resultSet); + db.closeStatement(queryTypeStatement); + db.closeStatement(uninventoriedStatement); + db.closeConnection(connection); + } + } + } + /** * Delete all of the current storage nodes defined in the database, unless they are already managed (meaning, * at least one is linked to a resource). This can be useful for re-installs where the original install