fix multiple possible concurrent map write issues,
fix issue with VM instacne types returning prematurely
This commit is contained in:
+18
-5
@@ -186,8 +186,6 @@ func (cluster *Cluster) BuildNode(nodeName string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
cluster.Nodes[nodeName] = node
|
||||
|
||||
// get node's VMs
|
||||
vms, err := node.VirtualMachines()
|
||||
if err != nil {
|
||||
@@ -242,6 +240,10 @@ func (cluster *Cluster) BuildNode(nodeName string) error {
|
||||
|
||||
node.cluster = cluster
|
||||
|
||||
cluster.NodesLock.Lock()
|
||||
cluster.Nodes[nodeName] = node
|
||||
cluster.NodesLock.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -317,12 +319,11 @@ func (node *Node) BuildInstance(instancetype InstanceType, vmid uint) error {
|
||||
|
||||
if err != nil && node.Instances[instanceID] != nil { // node is unreachable and did exist previously
|
||||
// assume the instance is gone and delete from cluster
|
||||
log.Printf("[ERR ] error retrieving %s.%d: %s", node.Name, instanceID, err)
|
||||
delete(node.Instances, instanceID)
|
||||
return nil
|
||||
}
|
||||
|
||||
node.Instances[instanceID] = instance
|
||||
|
||||
for volid := range instance.configDisks {
|
||||
wg.Go(func() error {
|
||||
err = instance.RebuildVolume(node, volid)
|
||||
@@ -363,11 +364,16 @@ func (node *Node) BuildInstance(instancetype InstanceType, vmid uint) error {
|
||||
err = instance.RebuildBoot(node)
|
||||
if err != nil {
|
||||
log.Printf("[ERR ] error rebuilding boot: %s", err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
instance.node = node
|
||||
|
||||
node.InstancesLock.Lock()
|
||||
node.Instances[instanceID] = instance
|
||||
node.InstancesLock.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -382,7 +388,10 @@ func (instance *Instance) RebuildVolume(node *Node, volid string) error {
|
||||
voltype := AnyPrefixes(volid, paas.VolumeTypes)
|
||||
volume.Type = voltype
|
||||
volume.Volume_ID = VolumeID(volid)
|
||||
|
||||
instance.VolumesLock.Lock()
|
||||
instance.Volumes[VolumeID(volid)] = volume
|
||||
instance.VolumesLock.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -396,7 +405,9 @@ func (instance *Instance) RebuildNet(node *Node, netid string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
instance.NetsLock.Lock()
|
||||
instance.Nets[NetID(netid)] = netinfo
|
||||
instance.NetsLock.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -420,7 +431,9 @@ func (instance *Instance) RebuildDevice(node *Node, deviceid string) error {
|
||||
// sub function assignment not supported yet
|
||||
}
|
||||
|
||||
instance.DevicesLock.Lock()
|
||||
instance.Devices[DeviceID(instanceDeviceBusID)].Device_ID = DeviceID(deviceid)
|
||||
instance.DevicesLock.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ type Cluster struct {
|
||||
paas.Cluster
|
||||
lock sync.Mutex
|
||||
pve ProxmoxClient
|
||||
NodesLock sync.Mutex
|
||||
Nodes map[string]*Node `json:"nodes"`
|
||||
OK bool
|
||||
}
|
||||
@@ -25,6 +26,7 @@ type Cluster struct {
|
||||
type Node struct {
|
||||
lock sync.Mutex
|
||||
paas.Node
|
||||
InstancesLock sync.Mutex // lock for Instances map
|
||||
Instances map[InstanceID]*Instance `json:"instances"`
|
||||
pvenode *proxmox.Node
|
||||
storage map[string][]*proxmox.StorageContent
|
||||
@@ -41,6 +43,9 @@ const CT InstanceType = paas.CT
|
||||
type Instance struct {
|
||||
lock sync.Mutex
|
||||
paas.Instance
|
||||
VolumesLock sync.Mutex // lock for Volumes map
|
||||
NetsLock sync.Mutex // lock for Nets map
|
||||
DevicesLock sync.Mutex // lock for Devices map
|
||||
pveconfig any
|
||||
configDisks map[string]string
|
||||
configNets map[string]string
|
||||
|
||||
Reference in New Issue
Block a user