This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch 4.18
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.18 by this push:
new 0cbe77024a8 Fix foreign key constraints and the mysql procedure that
is used (#7381)
0cbe77024a8 is described below
commit 0cbe77024a82cebf8734ed2a619eaa2ee8b3a602
Author: Harikrishna <[email protected]>
AuthorDate: Thu Jul 6 12:13:49 2023 +0530
Fix foreign key constraints and the mysql procedure that is used (#7381)
---
.../cloud/upgrade/dao/DatabaseAccessObject.java | 11 ++++++++
.../java/com/cloud/upgrade/dao/DbUpgradeUtils.java | 5 +++-
.../com/cloud/upgrade/dao/Upgrade41800to41810.java | 29 ++++++++++++++++++++++
.../resources/META-INF/db/schema-41720to41800.sql | 14 -----------
4 files changed, 44 insertions(+), 15 deletions(-)
diff --git
a/engine/schema/src/main/java/com/cloud/upgrade/dao/DatabaseAccessObject.java
b/engine/schema/src/main/java/com/cloud/upgrade/dao/DatabaseAccessObject.java
index 5d0edddb02e..21d5a205a09 100644
---
a/engine/schema/src/main/java/com/cloud/upgrade/dao/DatabaseAccessObject.java
+++
b/engine/schema/src/main/java/com/cloud/upgrade/dao/DatabaseAccessObject.java
@@ -26,6 +26,17 @@ public class DatabaseAccessObject {
private static Logger s_logger =
Logger.getLogger(DatabaseAccessObject.class);
+ public void addForeignKey(Connection conn, String tableName, String
tableColumn, String foreignTableName, String foreignColumnName) {
+ String addForeignKeyStmt = String.format("ALTER TABLE `cloud`.`%s` ADD
CONSTRAINT `fk_%s__%s` FOREIGN KEY `fk_%s__%s`(`%s`) REFERENCES `%s`(`%s`)",
tableName, tableName, tableColumn, tableName, tableColumn, tableColumn,
foreignTableName, foreignColumnName);
+ try(PreparedStatement pstmt =
conn.prepareStatement(addForeignKeyStmt);)
+ {
+ pstmt.executeUpdate();
+ s_logger.debug(String.format("Foreign key is added successfully
from the table %s", tableName));
+ } catch (SQLException e) {
+ s_logger.error("Ignored SQL Exception when trying to add foreign
key on table " + tableName + " exception: " + e.getMessage());
+ }
+ }
+
public void dropKey(Connection conn, String tableName, String key, boolean
isForeignKey)
{
String alter_sql_str;
diff --git
a/engine/schema/src/main/java/com/cloud/upgrade/dao/DbUpgradeUtils.java
b/engine/schema/src/main/java/com/cloud/upgrade/dao/DbUpgradeUtils.java
index 38ca5c9c272..02dad6250dc 100644
--- a/engine/schema/src/main/java/com/cloud/upgrade/dao/DbUpgradeUtils.java
+++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/DbUpgradeUtils.java
@@ -23,7 +23,10 @@ public class DbUpgradeUtils {
private static DatabaseAccessObject dao = new DatabaseAccessObject();
- public static void dropKeysIfExist(Connection conn, String tableName,
List<String> keys, boolean isForeignKey) {
+ public static void addForeignKey(Connection conn, String tableName, String
tableColumn, String foreignTableName, String foreignColumnName) {
+ dao.addForeignKey(conn, tableName, tableColumn, foreignTableName,
foreignColumnName);
+ }
+ public static void dropKeysIfExist(Connection conn, String tableName,
List<String> keys, boolean isForeignKey) {
for (String key : keys) {
dao.dropKey(conn, tableName, key, isForeignKey);
}
diff --git
a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41800to41810.java
b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41800to41810.java
index c4fbeb73eb2..ab493da8cd8 100644
--- a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41800to41810.java
+++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41800to41810.java
@@ -22,6 +22,8 @@ import org.apache.log4j.Logger;
import java.io.InputStream;
import java.sql.Connection;
+import java.util.ArrayList;
+import java.util.List;
public class Upgrade41800to41810 implements DbUpgrade,
DbUpgradeSystemVmTemplate {
final static Logger LOG = Logger.getLogger(Upgrade41800to41810.class);
@@ -55,6 +57,7 @@ public class Upgrade41800to41810 implements DbUpgrade,
DbUpgradeSystemVmTemplate
@Override
public void performDataMigration(Connection conn) {
+ fixForeignKeyNames(conn);
}
@Override
@@ -82,4 +85,30 @@ public class Upgrade41800to41810 implements DbUpgrade,
DbUpgradeSystemVmTemplate
throw new CloudRuntimeException("Failed to find / register
SystemVM template(s)");
}
}
+
+ private void fixForeignKeyNames(Connection conn) {
+ //Alter foreign key name for user_vm table from fk_user_data_id to
fk_user_vm__user_data_id (if exists)
+ List<String> keys = new ArrayList<String>();
+ keys.add("fk_user_data_id");
+ keys.add("fk_user_vm__user_data_id");
+ DbUpgradeUtils.dropKeysIfExist(conn, "cloud.user_vm", keys, true);
+ DbUpgradeUtils.dropKeysIfExist(conn, "cloud.user_vm", keys, false);
+ DbUpgradeUtils.addForeignKey(conn, "user_vm", "user_data_id",
"user_data", "id");
+
+ //Alter foreign key name for vm_template table from fk_user_data_id to
fk_vm_template__user_data_id (if exists)
+ keys = new ArrayList<>();
+ keys.add("fk_user_data_id");
+ keys.add("fk_vm_template__user_data_id");
+ DbUpgradeUtils.dropKeysIfExist(conn, "cloud.vm_template", keys, true);
+ DbUpgradeUtils.dropKeysIfExist(conn, "cloud.vm_template", keys, false);
+ DbUpgradeUtils.addForeignKey(conn, "vm_template", "user_data_id",
"user_data", "id");
+
+ //Alter foreign key name for volumes table from fk_passphrase_id to
fk_volumes__passphrase_id (if exists)
+ keys = new ArrayList<>();
+ keys.add("fk_passphrase_id");
+ keys.add("fk_volumes__passphrase_id");
+ DbUpgradeUtils.dropKeysIfExist(conn, "cloud.volumes", keys, true);
+ DbUpgradeUtils.dropKeysIfExist(conn, "cloud.volumes", keys, false);
+ DbUpgradeUtils.addForeignKey(conn, "volumes",
"passphrase_id","passphrase", "id");
+ }
}
diff --git
a/engine/schema/src/main/resources/META-INF/db/schema-41720to41800.sql
b/engine/schema/src/main/resources/META-INF/db/schema-41720to41800.sql
index b8eee33cad7..2af6723c134 100644
--- a/engine/schema/src/main/resources/META-INF/db/schema-41720to41800.sql
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41720to41800.sql
@@ -224,17 +224,6 @@ CREATE PROCEDURE `cloud`.`IDEMPOTENT_ADD_COLUMN` (
BEGIN
DECLARE CONTINUE HANDLER FOR 1060 BEGIN END; SET @ddl = CONCAT('ALTER
TABLE ', in_table_name); SET @ddl = CONCAT(@ddl, ' ', 'ADD COLUMN') ; SET @ddl
= CONCAT(@ddl, ' ', in_column_name); SET @ddl = CONCAT(@ddl, ' ',
in_column_definition); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE
stmt; END;
-
--- Add foreign key procedure to link volumes to passphrase table
-DROP PROCEDURE IF EXISTS `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`;
-CREATE PROCEDURE `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY` (
- IN in_table_name VARCHAR(200),
- IN in_foreign_table_name VARCHAR(200),
- IN in_foreign_column_name VARCHAR(200)
-)
-BEGIN
- DECLARE CONTINUE HANDLER FOR 1005,1826 BEGIN END; SET @ddl = CONCAT('ALTER
TABLE ', in_table_name); SET @ddl = CONCAT(@ddl, ' ', ' ADD CONSTRAINT '); SET
@ddl = CONCAT(@ddl, 'fk_', in_foreign_table_name, '_', in_foreign_column_name);
SET @ddl = CONCAT(@ddl, ' FOREIGN KEY (', in_foreign_table_name, '_',
in_foreign_column_name, ')'); SET @ddl = CONCAT(@ddl, ' REFERENCES ',
in_foreign_table_name, '(', in_foreign_column_name, ')'); PREPARE stmt FROM
@ddl; EXECUTE stmt; DEALLOCATE PREPARE [...]
-
-- Add passphrase table
CREATE TABLE IF NOT EXISTS `cloud`.`passphrase` (
`id` bigint unsigned NOT NULL auto_increment,
@@ -244,7 +233,6 @@ CREATE TABLE IF NOT EXISTS `cloud`.`passphrase` (
-- Add passphrase column to volumes table
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.volumes', 'passphrase_id', 'bigint
unsigned DEFAULT NULL COMMENT "encryption passphrase id" ');
-CALL `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`('cloud.volumes', 'passphrase', 'id');
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.volumes', 'encrypt_format',
'varchar(64) DEFAULT NULL COMMENT "encryption format" ');
-- Add encrypt column to disk_offering
@@ -653,11 +641,9 @@ CREATE TABLE IF NOT EXISTS `cloud`.`user_data` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.user_vm', 'user_data_id', 'bigint
unsigned DEFAULT NULL COMMENT "id of the user data" AFTER `user_data`');
-CALL `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`('cloud.user_vm', 'user_data', 'id');
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.user_vm', 'user_data_details',
'mediumtext DEFAULT NULL COMMENT "value of the comma-separated list of
parameters" AFTER `user_data_id`');
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.vm_template', 'user_data_id',
'bigint unsigned DEFAULT NULL COMMENT "id of the user data"');
-CALL `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`('cloud.vm_template', 'user_data',
'id');
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.vm_template',
'user_data_link_policy', 'varchar(255) DEFAULT NULL COMMENT "user data link
policy with template"');
-- Added userdata details to template