fix(proxmox): concurrent map write in UpdateResources

This commit is contained in:
yusing
2026-01-25 18:01:22 +08:00
parent bf5b231e52
commit 85156869d7

View File

@@ -65,20 +65,21 @@ func (c *Client) UpdateClusterInfo(ctx context.Context) (err error) {
} }
func (c *Client) UpdateResources(ctx context.Context) error { func (c *Client) UpdateResources(ctx context.Context) error {
c.resourcesMu.Lock()
defer c.resourcesMu.Unlock()
resourcesSlice, err := c.Cluster.Resources(ctx, "vm") resourcesSlice, err := c.Cluster.Resources(ctx, "vm")
if err != nil { if err != nil {
return err return err
} }
clear(c.resources) vmResources := make([]*VMResource, len(resourcesSlice))
var errs errgroup.Group for i, resource := range resourcesSlice {
errs.SetLimit(runtime.GOMAXPROCS(0) * 2) vmResources[i] = &VMResource{
for _, resource := range resourcesSlice {
c.resources[resource.ID] = &VMResource{
ClusterResource: resource, ClusterResource: resource,
IPs: nil, IPs: nil,
} }
}
var errs errgroup.Group
errs.SetLimit(runtime.GOMAXPROCS(0) * 2)
for i, resource := range resourcesSlice {
vmResource := vmResources[i]
errs.Go(func() error { errs.Go(func() error {
node, ok := Nodes.Get(resource.Node) node, ok := Nodes.Get(resource.Node)
if !ok { if !ok {
@@ -96,13 +97,19 @@ func (c *Client) UpdateResources(ctx context.Context) error {
if err != nil { if err != nil {
return fmt.Errorf("failed to get ips for resource %s: %w", resource.ID, err) return fmt.Errorf("failed to get ips for resource %s: %w", resource.ID, err)
} }
c.resources[resource.ID].IPs = ips vmResource.IPs = ips
return nil return nil
}) })
} }
if err := errs.Wait(); err != nil { if err := errs.Wait(); err != nil {
return err return err
} }
c.resourcesMu.Lock()
clear(c.resources)
for i, resource := range resourcesSlice {
c.resources[resource.ID] = vmResources[i]
}
c.resourcesMu.Unlock()
log.Debug().Str("cluster", c.Cluster.Name).Msgf("[proxmox] updated %d resources", len(c.resources)) log.Debug().Str("cluster", c.Cluster.Name).Msgf("[proxmox] updated %d resources", len(c.resources))
return nil return nil
} }