weizhouapache opened a new issue, #7370:
URL: https://github.com/apache/cloudstack/issues/7370

   
   #### ISSUE TYPE
   <!-- Pick one below and delete the rest -->
    * Bug Report
    
   The table "user_vm" and "vm_template" are expected to have the contraint 
foreign key, which link to "user_data.id".
   However, the key exist in "user_vm" table, but missing in "vm_template" 
table.
   
   ##### Reason
   
   The SQL procedure `IDEMPOTENT_ADD_FOREIGN_KEY` is used in the following SQL 
statements
   
   ```
   CALL `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`('cloud.volumes', 'passphrase', 
'id');
   CALL `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`('cloud.user_vm', 'user_data', 
'id');
   CALL `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`('cloud.vm_template', 'user_data', 
'id');
   ```
   
   The results are
   
   | table name  | constraint foreign key | note |
   | ------------- | ------------- | ------------- |
   | volumes  | fk_passphrase_id  | OK |
   | user_vm  | fk_user_data_id  | OK |
   | vm_template | fk_user_data_id | Missing on mysql 5.5/mysql 8, <br> Error 
on mysql 5.6/5.7 (#7358) |
   
   The keys are same in "user_vm" and "vm_template" table, which causes MySQL 
error `Can't write; duplicate key in table '#sql-3755_b'`
   
   The error is ignored in mysql 5.5 and 8.0, but throws an exception in mysql 
5.6/5.7 as the error codes are different 
   (1005 on mysql 5.5, 1826 on mysql 8.x, 1022 on mysql 5.6/5.7)
   
   ##### Suggestion
   
   The key name should be renamed to `f_<table name>_<foreign table 
name>_<foreign column name>`, for example `f_user_vm_user_data_id`, instead of 
`f_user_data_id` 
   
   (refer to the old key names in #7255)
   
   If so, need to 
   - create a new procedure ot remove the foreign keys if exists
   - update the procedure to create new keys with new names
   
   ##### Related PRs:
   
   - #6522 
   - #7252
   - #7255 
   
   
   
   ##### user_vm table
   ```
   
   MariaDB [cloud]> show create table user_vm\G
   *************************** 1. row ***************************
          Table: user_vm
   Create Table: CREATE TABLE `user_vm` (
     `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
     `iso_id` bigint(20) unsigned DEFAULT NULL,
     `display_name` varchar(255) DEFAULT NULL,
     `user_data` mediumtext,
     `user_data_id` bigint(20) unsigned DEFAULT NULL COMMENT 'id of the user 
data',
     `user_data_details` mediumtext COMMENT 'value of the comma-separated list 
of parameters',
     `update_parameters` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'Defines if 
the parameters have been updated for the vm',
     `user_vm_type` varchar(255) DEFAULT 'UserVM' COMMENT 'Defines the type of 
UserVM',
     PRIMARY KEY (`id`),
     KEY `fk_user_data_id` (`user_data_id`),
     CONSTRAINT `fk_user_data_id` FOREIGN KEY (`user_data_id`) REFERENCES 
`user_data` (`id`),
     CONSTRAINT `fk_user_vm__id` FOREIGN KEY (`id`) REFERENCES `vm_instance` 
(`id`) ON DELETE CASCADE
   ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8
   1 row in set (0.00 sec)
   
   ```
   
   ######  vm_template table
   ```
   MariaDB [cloud]> show create table vm_template\G
   *************************** 1. row ***************************
          Table: vm_template
   Create Table: CREATE TABLE `vm_template` (
     `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
     `unique_name` varchar(255) NOT NULL,
     `name` varchar(255) NOT NULL,
     `uuid` varchar(40) DEFAULT NULL,
     `public` int(1) unsigned NOT NULL,
     `featured` int(1) unsigned NOT NULL,
     `type` varchar(32) DEFAULT NULL,
     `hvm` int(1) unsigned NOT NULL COMMENT 'requires HVM',
     `bits` int(6) unsigned NOT NULL COMMENT '32 bit or 64 bit',
     `url` varchar(255) DEFAULT NULL COMMENT 'the url where the template exists 
externally',
     `format` varchar(32) NOT NULL COMMENT 'format for the template',
     `created` datetime NOT NULL COMMENT 'Date created',
     `removed` datetime DEFAULT NULL COMMENT 'Date removed if not null',
     `account_id` bigint(20) unsigned NOT NULL COMMENT 'id of the account that 
created this template',
     `checksum` varchar(255) DEFAULT NULL COMMENT 'checksum for the template 
root disk',
     `display_text` varchar(4096) DEFAULT NULL COMMENT 'Description text set by 
the admin for display purpose only',
     `enable_password` int(1) unsigned NOT NULL DEFAULT '1' COMMENT 'true if 
this template supports password reset',
     `enable_sshkey` int(1) unsigned NOT NULL DEFAULT '0' COMMENT 'true if this 
template supports sshkey reset',
     `guest_os_id` bigint(20) unsigned NOT NULL COMMENT 'the OS of the 
template',
     `bootable` int(1) unsigned NOT NULL DEFAULT '1' COMMENT 'true if this 
template represents a bootable ISO',
     `prepopulate` int(1) unsigned NOT NULL DEFAULT '0' COMMENT 'prepopulate 
this template to primary storage',
     `cross_zones` int(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Make this 
template available in all zones',
     `extractable` int(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Is this 
template extractable',
     `hypervisor_type` varchar(32) DEFAULT NULL COMMENT 'hypervisor that the 
template belongs to',
     `source_template_id` bigint(20) unsigned DEFAULT NULL COMMENT 'Id of the 
original template, if this template is created from snapshot',
     `template_tag` varchar(255) DEFAULT NULL COMMENT 'template tag',
     `sort_key` int(32) NOT NULL DEFAULT '0' COMMENT 'sort key used for 
customising sort method',
     `size` bigint(20) unsigned DEFAULT NULL,
     `state` varchar(255) DEFAULT NULL,
     `update_count` bigint(20) unsigned DEFAULT NULL,
     `updated` datetime DEFAULT NULL,
     `dynamically_scalable` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 
'true if template contains XS/VMWare tools inorder to support dynamic scaling 
of VM cpu/memory',
     `parent_template_id` bigint(20) unsigned DEFAULT NULL COMMENT 'If datadisk 
template, then id of the root template this template belongs to',
     `direct_download` tinyint(1) DEFAULT '0' COMMENT 'Indicates if Secondary 
Storage is bypassed and template is downloaded to Primary Storage',
     `deploy_as_is` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'True if the 
template should be deployed with disks and networks as defined by OVF',
     `user_data_id` bigint(20) unsigned DEFAULT NULL COMMENT 'id of the user 
data',
     `user_data_link_policy` varchar(255) DEFAULT NULL COMMENT 'user data link 
policy with template',
     PRIMARY KEY (`id`),
     UNIQUE KEY `uc_vm_template__uuid` (`uuid`),
     KEY `i_vm_template__removed` (`removed`),
     KEY `i_vm_template__public` (`public`)
   ) ENGINE=InnoDB AUTO_INCREMENT=202 DEFAULT CHARSET=utf8
   1 row in set (0.00 sec)
   ```
   
   
   
   ##### COMPONENT NAME
   <!--
   Categorize the issue, e.g. API, VR, VPN, UI, etc.
   -->
   ~~~
   DB
   ~~~
   
   ##### CLOUDSTACK VERSION
   <!--
   New line separated list of affected versions, commit ID for issues on main 
branch.
   -->
   
   ~~~
   4.18
   ~~~
   
   ##### CONFIGURATION
   <!--
   Information about the configuration if relevant, e.g. basic network, 
advanced networking, etc.  N/A otherwise
   -->
   
   
   ##### OS / ENVIRONMENT
   <!--
   Information about the environment if relevant, N/A otherwise
   -->
   
   
   ##### SUMMARY
   <!-- Explain the problem/feature briefly -->
   
   
   ##### STEPS TO REPRODUCE
   <!--
   For bugs, show exactly how to reproduce the problem, using a minimal 
test-case. Use Screenshots if accurate.
   
   For new features, show how the feature would be used.
   -->
   
   <!-- Paste example playbooks or commands between quotes below -->
   ~~~
   
   ~~~
   
   <!-- You can also paste gist.github.com links for larger files -->
   
   ##### EXPECTED RESULTS
   <!-- What did you expect to happen when running the steps above? -->
   
   ~~~
   
   ~~~
   
   ##### ACTUAL RESULTS
   <!-- What actually happened? -->
   
   <!-- Paste verbatim command output between quotes below -->
   ~~~
   
   ~~~
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to