mirror of
https://github.com/yusing/godoxy.git
synced 2026-04-25 01:38:30 +02:00
fix(proxmox): concurrent map write in UpdateResources
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user