From 31e935ad8979c4dbc351e4fb5ebeda984ce22cc0 Mon Sep 17 00:00:00 2001 From: wanyaoqi <18528551+wanyaoqi@users.noreply.github.com> Date: Fri, 10 Apr 2026 16:51:54 +0800 Subject: [PATCH] fix(region): optimize fetchHostGuestResource (#24634) --- pkg/compute/models/hosts.go | 80 ++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 24 deletions(-) diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 5d064b8da8..2beaff150b 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -3777,33 +3777,65 @@ func (hh *SHost) getGuestsResource(status string) *SHostGuestResourceUsage { } func fetchHostGuestResource(hostIds []string, status string) (map[string]SHostGuestResourceUsage, error) { - guests := GuestManager.Query() - cond := sqlchemy.OR(sqlchemy.In(guests.Field("host_id"), hostIds), - sqlchemy.In(guests.Field("backup_host_id"), hostIds)) - guests = guests.Filter(cond) - if len(status) > 0 { - guests = guests.Equals("status", status) + ret := map[string]SHostGuestResourceUsage{} + + // Query by host_id + { + guests := GuestManager.Query().In("host_id", hostIds) + if len(status) > 0 { + guests = guests.Equals("status", status) + } + sq := guests.SubQuery() + q := sq.Query( + sqlchemy.COUNT("id").Label("guest_count"), + sq.Field("host_id"), + sqlchemy.SUM("guest_vcpu_count", sq.Field("vcpu_count")), + sqlchemy.SUM("guest_vmem_size", sq.Field("vmem_size")), + ).GroupBy(sq.Field("host_id")) + + stat := []struct { + HostId string + SHostGuestResourceUsage + }{} + if err := q.All(&stat); err != nil { + return nil, err + } + for i := range stat { + ret[stat[i].HostId] = stat[i].SHostGuestResourceUsage + } } - sq := guests.SubQuery() - q := sq.Query( - sqlchemy.COUNT("id").Label("guest_count"), - sq.Field("host_id"), - sqlchemy.SUM("guest_vcpu_count", sq.Field("vcpu_count")), - sqlchemy.SUM("guest_vmem_size", sq.Field("vmem_size")), - ).GroupBy(sq.Field("host_id")) - stat := []struct { - HostId string - SHostGuestResourceUsage - }{} - err := q.All(&stat) - if err != nil { - return nil, err - } - ret := map[string]SHostGuestResourceUsage{} - for i := range stat { - ret[stat[i].HostId] = stat[i].SHostGuestResourceUsage + // Query by backup_host_id, and attribute usage to backup host + { + guests := GuestManager.Query().In("backup_host_id", hostIds) + if len(status) > 0 { + guests = guests.Equals("status", status) + } + sq := guests.SubQuery() + backupHostId := sq.Field("backup_host_id").Label("host_id") + q := sq.Query( + sqlchemy.COUNT("id").Label("guest_count"), + backupHostId, + sqlchemy.SUM("guest_vcpu_count", sq.Field("vcpu_count")), + sqlchemy.SUM("guest_vmem_size", sq.Field("vmem_size")), + ).GroupBy(sq.Field("backup_host_id")) + + stat := []struct { + HostId string + SHostGuestResourceUsage + }{} + if err := q.All(&stat); err != nil { + return nil, err + } + for i := range stat { + v := ret[stat[i].HostId] + v.GuestCount += stat[i].GuestCount + v.GuestVcpuCount += stat[i].GuestVcpuCount + v.GuestVmemSize += stat[i].GuestVmemSize + ret[stat[i].HostId] = v + } } + return ret, nil }