Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 4B034101A8 for ; Thu, 27 Nov 2014 01:47:39 +0000 (UTC) Received: (qmail 11574 invoked by uid 500); 27 Nov 2014 01:47:39 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 11542 invoked by uid 500); 27 Nov 2014 01:47:39 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 11533 invoked by uid 99); 27 Nov 2014 01:47:39 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Nov 2014 01:47:39 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id B6EE39482E8; Thu, 27 Nov 2014 01:47:38 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: mchen@apache.org To: commits@cloudstack.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: git commit: updated refs/heads/4.5 to bf8dd82 Date: Thu, 27 Nov 2014 01:47:38 +0000 (UTC) Repository: cloudstack Updated Branches: refs/heads/4.5 86576593b -> bf8dd828f CLOUDSTACK-7981: listVirtualMachine is too slow in case of duplicate resource tags due to joining user_vm_details to user_vm_view. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/bf8dd828 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/bf8dd828 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/bf8dd828 Branch: refs/heads/4.5 Commit: bf8dd828f5c9f9ade42eb17e812d0579478c5467 Parents: 8657659 Author: Min Chen Authored: Fri Nov 21 18:38:33 2014 -0800 Committer: Min Chen Committed: Wed Nov 26 17:40:06 2014 -0800 ---------------------------------------------------------------------- .../cloudstack/api/response/UserVmResponse.java | 7 + server/src/com/cloud/api/ApiDBUtils.java | 7 +- .../cloud/api/query/dao/ResourceTagJoinDao.java | 2 + .../api/query/dao/ResourceTagJoinDaoImpl.java | 9 + .../cloud/api/query/dao/UserVmJoinDaoImpl.java | 4 +- .../com/cloud/api/query/vo/UserVmJoinVO.java | 77 -------- setup/db/db/schema-442to450.sql | 192 +++++++++++++++++++ 7 files changed, 213 insertions(+), 85 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bf8dd828/api/src/org/apache/cloudstack/api/response/UserVmResponse.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/response/UserVmResponse.java b/api/src/org/apache/cloudstack/api/response/UserVmResponse.java index 9fe3475..1f55f5b 100644 --- a/api/src/org/apache/cloudstack/api/response/UserVmResponse.java +++ b/api/src/org/apache/cloudstack/api/response/UserVmResponse.java @@ -240,6 +240,8 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp @Param(description = "the list of resource tags associated with vm", responseObject = ResourceTagResponse.class) private Set tags; + transient Set tagIds; + @SerializedName(ApiConstants.DETAILS) @Param(description = "Vm details in key/value pairs.", since = "4.2.1") private Map details; @@ -272,6 +274,7 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp securityGroupList = new LinkedHashSet(); nics = new LinkedHashSet(); tags = new LinkedHashSet(); + tagIds = new LinkedHashSet(); affinityGroupList = new LinkedHashSet(); } @@ -723,6 +726,10 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp this.instanceName = instanceName; } + public boolean containTag(Long tagId) { + return tagIds.contains(tagId); + } + public void setTags(Set tags) { this.tags = tags; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bf8dd828/server/src/com/cloud/api/ApiDBUtils.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 37abdcb..86b88d7 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -1633,12 +1633,7 @@ public class ApiDBUtils { } public static ResourceTagJoinVO findResourceTagViewById(Long tagId) { - List tags = s_tagJoinDao.searchByIds(tagId); - if (tags != null && tags.size() > 0) { - return tags.get(0); - } else { - return null; - } + return s_tagJoinDao.searchById(tagId); } public static EventResponse newEventResponse(EventJoinVO ve) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bf8dd828/server/src/com/cloud/api/query/dao/ResourceTagJoinDao.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/api/query/dao/ResourceTagJoinDao.java b/server/src/com/cloud/api/query/dao/ResourceTagJoinDao.java index 1524705..329d927 100644 --- a/server/src/com/cloud/api/query/dao/ResourceTagJoinDao.java +++ b/server/src/com/cloud/api/query/dao/ResourceTagJoinDao.java @@ -34,4 +34,6 @@ public interface ResourceTagJoinDao extends GenericDao List searchByIds(Long... ids); List listBy(String resourceUUID, ResourceObjectType resourceType); + + ResourceTagJoinVO searchById(Long id); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bf8dd828/server/src/com/cloud/api/query/dao/ResourceTagJoinDaoImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/api/query/dao/ResourceTagJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/ResourceTagJoinDaoImpl.java index 27d3787..a496753 100644 --- a/server/src/com/cloud/api/query/dao/ResourceTagJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/ResourceTagJoinDaoImpl.java @@ -146,6 +146,15 @@ public class ResourceTagJoinDaoImpl extends GenericDaoBase sc = tagIdSearch.create(); + sc.setParameters("id", id); + List vms = searchIncludingRemoved(sc, null, null, false); + assert vms != null && vms.size() == 1 : "No tag found for tag id " + id; + return vms.get(0); + } + + @Override public ResourceTagJoinVO newResourceTagView(ResourceTag vr) { SearchCriteria sc = tagIdSearch.create(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bf8dd828/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java index 779ddb4..f142048 100644 --- a/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java @@ -262,7 +262,7 @@ public class UserVmJoinDaoImpl extends GenericDaoBase implem // update tag information long tag_id = userVm.getTagId(); - if (tag_id > 0) { + if (tag_id > 0 && !userVmResponse.containTag(tag_id)) { ResourceTagJoinVO vtag = ApiDBUtils.findResourceTagViewById(tag_id); if (vtag != null) { userVmResponse.addTag(ApiDBUtils.newResourceTagResponse(vtag, false)); @@ -350,7 +350,7 @@ public class UserVmJoinDaoImpl extends GenericDaoBase implem } long tag_id = uvo.getTagId(); - if (tag_id > 0) { + if (tag_id > 0 && !userVmData.containTag(tag_id)) { ResourceTagJoinVO vtag = ApiDBUtils.findResourceTagViewById(tag_id); if (vtag != null) { userVmData.addTag(ApiDBUtils.newResourceTagResponse(vtag, false)); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bf8dd828/server/src/com/cloud/api/query/vo/UserVmJoinVO.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/api/query/vo/UserVmJoinVO.java b/server/src/com/cloud/api/query/vo/UserVmJoinVO.java index f3f48fc..2b0b155 100644 --- a/server/src/com/cloud/api/query/vo/UserVmJoinVO.java +++ b/server/src/com/cloud/api/query/vo/UserVmJoinVO.java @@ -31,7 +31,6 @@ import javax.persistence.Transient; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Network.GuestType; import com.cloud.network.Networks.TrafficType; -import com.cloud.server.ResourceTag.ResourceObjectType; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Volume; import com.cloud.utils.db.GenericDao; @@ -346,34 +345,6 @@ public class UserVmJoinVO extends BaseViewVO implements ControlledViewEntity { @Column(name = "tag_id") private long tagId; - @Column(name = "tag_uuid") - private String tagUuid; - - @Column(name = "tag_key") - private String tagKey; - - @Column(name = "tag_value") - private String tagValue; - - @Column(name = "tag_domain_id") - private long tagDomainId; - - @Column(name = "tag_account_id") - private long tagAccountId; - - @Column(name = "tag_resource_id") - private long tagResourceId; - - @Column(name = "tag_resource_uuid") - private String tagResourceUuid; - - @Column(name = "tag_resource_type") - @Enumerated(value = EnumType.STRING) - private ResourceObjectType tagResourceType; - - @Column(name = "tag_customer") - private String tagCustomer; - @Column(name = "affinity_group_id") private long affinityGroupId; @@ -397,11 +368,6 @@ public class UserVmJoinVO extends BaseViewVO implements ControlledViewEntity { @Column(name = "dynamically_scalable") private boolean isDynamicallyScalable; - @Column(name = "detail_name") - private String detailName; - - @Column(name = "detail_value") - private String detailValue; public UserVmJoinVO() { } @@ -780,42 +746,6 @@ public class UserVmJoinVO extends BaseViewVO implements ControlledViewEntity { return tagId; } - public String getTagUuid() { - return tagUuid; - } - - public String getTagKey() { - return tagKey; - } - - public String getTagValue() { - return tagValue; - } - - public long getTagDomainId() { - return tagDomainId; - } - - public long getTagAccountId() { - return tagAccountId; - } - - public long getTagResourceId() { - return tagResourceId; - } - - public String getTagResourceUuid() { - return tagResourceUuid; - } - - public ResourceObjectType getTagResourceType() { - return tagResourceType; - } - - public String getTagCustomer() { - return tagCustomer; - } - public boolean isLimitCpuUse() { return limitCpuUse; } @@ -902,13 +832,6 @@ public class UserVmJoinVO extends BaseViewVO implements ControlledViewEntity { return isDynamicallyScalable; } - public String getDetailName() { - return detailName; - } - - public String getDetailValue() { - return detailValue; - } @Override public Class getEntityType() { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bf8dd828/setup/db/db/schema-442to450.sql ---------------------------------------------------------------------- diff --git a/setup/db/db/schema-442to450.sql b/setup/db/db/schema-442to450.sql index 3d850f0..7a6a3c1 100644 --- a/setup/db/db/schema-442to450.sql +++ b/setup/db/db/schema-442to450.sql @@ -543,6 +543,198 @@ CREATE VIEW `cloud`.`domain_router_view` AS and async_job.instance_type = 'DomainRouter' and async_job.job_status = 0; +DROP VIEW IF EXISTS `cloud`.`user_vm_view`; +CREATE VIEW `cloud`.`user_vm_view` AS + select + vm_instance.id id, + vm_instance.name name, + user_vm.display_name display_name, + user_vm.user_data user_data, + account.id account_id, + account.uuid account_uuid, + account.account_name account_name, + account.type account_type, + domain.id domain_id, + domain.uuid domain_uuid, + domain.name domain_name, + domain.path domain_path, + projects.id project_id, + projects.uuid project_uuid, + projects.name project_name, + instance_group.id instance_group_id, + instance_group.uuid instance_group_uuid, + instance_group.name instance_group_name, + vm_instance.uuid uuid, + vm_instance.last_host_id last_host_id, + vm_instance.vm_type type, + vm_instance.vnc_password vnc_password, + vm_instance.limit_cpu_use limit_cpu_use, + vm_instance.created created, + vm_instance.state state, + vm_instance.removed removed, + vm_instance.ha_enabled ha_enabled, + vm_instance.hypervisor_type hypervisor_type, + vm_instance.instance_name instance_name, + vm_instance.guest_os_id guest_os_id, + vm_instance.display_vm display_vm, + guest_os.uuid guest_os_uuid, + vm_instance.pod_id pod_id, + host_pod_ref.uuid pod_uuid, + vm_instance.private_ip_address private_ip_address, + vm_instance.private_mac_address private_mac_address, + vm_instance.vm_type vm_type, + data_center.id data_center_id, + data_center.uuid data_center_uuid, + data_center.name data_center_name, + data_center.is_security_group_enabled security_group_enabled, + data_center.networktype data_center_type, + host.id host_id, + host.uuid host_uuid, + host.name host_name, + vm_template.id template_id, + vm_template.uuid template_uuid, + vm_template.name template_name, + vm_template.display_text template_display_text, + vm_template.enable_password password_enabled, + iso.id iso_id, + iso.uuid iso_uuid, + iso.name iso_name, + iso.display_text iso_display_text, + service_offering.id service_offering_id, + svc_disk_offering.uuid service_offering_uuid, + disk_offering.uuid disk_offering_uuid, + disk_offering.id disk_offering_id, + Case + When (`cloud`.`service_offering`.`cpu` is null) then (`custom_cpu`.`value`) + Else ( `cloud`.`service_offering`.`cpu`) + End as `cpu`, + Case + When (`cloud`.`service_offering`.`speed` is null) then (`custom_speed`.`value`) + Else ( `cloud`.`service_offering`.`speed`) + End as `speed`, + Case + When (`cloud`.`service_offering`.`ram_size` is null) then (`custom_ram_size`.`value`) + Else ( `cloud`.`service_offering`.`ram_size`) + END as `ram_size`, + svc_disk_offering.name service_offering_name, + disk_offering.name disk_offering_name, + storage_pool.id pool_id, + storage_pool.uuid pool_uuid, + storage_pool.pool_type pool_type, + volumes.id volume_id, + volumes.uuid volume_uuid, + volumes.device_id volume_device_id, + volumes.volume_type volume_type, + security_group.id security_group_id, + security_group.uuid security_group_uuid, + security_group.name security_group_name, + security_group.description security_group_description, + nics.id nic_id, + nics.uuid nic_uuid, + nics.network_id network_id, + nics.ip4_address ip_address, + nics.ip6_address ip6_address, + nics.ip6_gateway ip6_gateway, + nics.ip6_cidr ip6_cidr, + nics.default_nic is_default_nic, + nics.gateway gateway, + nics.netmask netmask, + nics.mac_address mac_address, + nics.broadcast_uri broadcast_uri, + nics.isolation_uri isolation_uri, + vpc.id vpc_id, + vpc.uuid vpc_uuid, + networks.uuid network_uuid, + networks.name network_name, + networks.traffic_type traffic_type, + networks.guest_type guest_type, + user_ip_address.id public_ip_id, + user_ip_address.uuid public_ip_uuid, + user_ip_address.public_ip_address public_ip_address, + ssh_keypairs.keypair_name keypair_name, + resource_tags.id tag_id, + async_job.id job_id, + async_job.uuid job_uuid, + async_job.job_status job_status, + async_job.account_id job_account_id, + affinity_group.id affinity_group_id, + affinity_group.uuid affinity_group_uuid, + affinity_group.name affinity_group_name, + affinity_group.description affinity_group_description, + vm_instance.dynamically_scalable dynamically_scalable + + from + `cloud`.`user_vm` + inner join + `cloud`.`vm_instance` ON vm_instance.id = user_vm.id + and vm_instance.removed is NULL + inner join + `cloud`.`account` ON vm_instance.account_id = account.id + inner join + `cloud`.`domain` ON vm_instance.domain_id = domain.id + left join + `cloud`.`guest_os` ON vm_instance.guest_os_id = guest_os.id + left join + `cloud`.`host_pod_ref` ON vm_instance.pod_id = host_pod_ref.id + left join + `cloud`.`projects` ON projects.project_account_id = account.id + left join + `cloud`.`instance_group_vm_map` ON vm_instance.id = instance_group_vm_map.instance_id + left join + `cloud`.`instance_group` ON instance_group_vm_map.group_id = instance_group.id + left join + `cloud`.`data_center` ON vm_instance.data_center_id = data_center.id + left join + `cloud`.`host` ON vm_instance.host_id = host.id + left join + `cloud`.`vm_template` ON vm_instance.vm_template_id = vm_template.id + left join + `cloud`.`vm_template` iso ON iso.id = user_vm.iso_id + left join + `cloud`.`service_offering` ON vm_instance.service_offering_id = service_offering.id + left join + `cloud`.`disk_offering` svc_disk_offering ON vm_instance.service_offering_id = svc_disk_offering.id + left join + `cloud`.`disk_offering` ON vm_instance.disk_offering_id = disk_offering.id + left join + `cloud`.`volumes` ON vm_instance.id = volumes.instance_id + left join + `cloud`.`storage_pool` ON volumes.pool_id = storage_pool.id + left join + `cloud`.`security_group_vm_map` ON vm_instance.id = security_group_vm_map.instance_id + left join + `cloud`.`security_group` ON security_group_vm_map.security_group_id = security_group.id + left join + `cloud`.`nics` ON vm_instance.id = nics.instance_id and nics.removed is null + left join + `cloud`.`networks` ON nics.network_id = networks.id + left join + `cloud`.`vpc` ON networks.vpc_id = vpc.id and vpc.removed is null + left join + `cloud`.`user_ip_address` ON user_ip_address.vm_id = vm_instance.id + left join + `cloud`.`user_vm_details` as ssh_details ON ssh_details.vm_id = vm_instance.id + and ssh_details.name = 'SSH.PublicKey' + left join + `cloud`.`ssh_keypairs` ON ssh_keypairs.public_key = ssh_details.value + left join + `cloud`.`resource_tags` ON resource_tags.resource_id = vm_instance.id + and resource_tags.resource_type = 'UserVm' + left join + `cloud`.`async_job` ON async_job.instance_id = vm_instance.id + and async_job.instance_type = 'VirtualMachine' + and async_job.job_status = 0 + left join + `cloud`.`affinity_group_vm_map` ON vm_instance.id = affinity_group_vm_map.instance_id + left join + `cloud`.`affinity_group` ON affinity_group_vm_map.affinity_group_id = affinity_group.id + left join + `cloud`.`user_vm_details` `custom_cpu` ON (((`custom_cpu`.`vm_id` = `cloud`.`vm_instance`.`id`) and (`custom_cpu`.`name` = 'CpuNumber'))) + left join + `cloud`.`user_vm_details` `custom_speed` ON (((`custom_speed`.`vm_id` = `cloud`.`vm_instance`.`id`) and (`custom_speed`.`name` = 'CpuSpeed'))) + left join + `cloud`.`user_vm_details` `custom_ram_size` ON (((`custom_ram_size`.`vm_id` = `cloud`.`vm_instance`.`id`) and (`custom_ram_size`.`name` = 'memory'))); + INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (231, UUID(), 1, 'CentOS 5 (32-bit)', utc_timestamp()); INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (232, UUID(), 1, 'CentOS 5 (64-bit)', utc_timestamp());