fix desync issue with instance pool membership

This commit is contained in:
2026-05-23 17:37:49 +00:00
parent 4ce059be22
commit 326c392d3d
2 changed files with 35 additions and 28 deletions
+34 -28
View File
@@ -56,40 +56,42 @@ func (cluster *Cluster) Sync() error {
}
}
//resolve pool membership
pools, err := cluster.pve.client.Pools(context.Background())
if err != nil {
err_ch <- err
return
}
for _, pool := range pools {
pool, err = cluster.pve.client.Pool(context.Background(), pool.PoolID)
if err != nil {
err_ch <- err
return
}
for _, member := range pool.Members {
if member.Type == "lxc" || member.Type == "qemu" {
node, ok := cluster.Nodes[member.Node]
if !ok {
return
}
instance, ok := node.Instances[InstanceID(member.VMID)]
if !ok {
return
}
instance.Pool = pool.PoolID
log.Printf("[INFO] successfully resolved pool membership for vmid=%d pool=%s", member.VMID, pool.PoolID)
}
}
}
err_ch <- nil
}()
return <-err_ch
}
func (cluster *Cluster) ResolvePoolMembership() error {
//resolve pool membership
pools, err := cluster.pve.client.Pools(context.Background())
if err != nil {
return err
}
for _, pool := range pools {
pool, err = cluster.pve.client.Pool(context.Background(), pool.PoolID)
if err != nil {
return err
}
for _, member := range pool.Members {
if member.Type == "lxc" || member.Type == "qemu" {
node, ok := cluster.Nodes[member.Node]
if !ok {
return fmt.Errorf("Instance %s has no node", member.VMID)
}
instance, ok := node.Instances[InstanceID(member.VMID)]
if !ok {
return fmt.Errorf("Instance %s claimed to be in node %s but was not", member.VMID, node.Name)
}
instance.Pool = pool.PoolID
log.Printf("[INFO] successfully resolved pool membership for vmid=%d pool=%s", member.VMID, pool.PoolID)
}
}
}
return nil
}
// get a node in the cluster
func (cluster *Cluster) GetNode(hostName string) (*Node, error) {
host_ch := make(chan *Node)
@@ -140,6 +142,8 @@ func (cluster *Cluster) RebuildNode(hostName string) error {
}
cluster.Nodes[hostName] = host
// attatch pointer to cluster to node
cluster.Nodes[hostName].cluster = cluster
// get node's VMs
vms, err := host.VirtualMachines()
@@ -259,6 +263,8 @@ func (host *Node) RebuildInstance(instancetype InstanceType, vmid uint) error {
instance.RebuildBoot()
}
// after synchronizing an instance, resync pool membership
host.cluster.ResolvePoolMembership()
err_ch <- nil
}()
+1
View File
@@ -26,6 +26,7 @@ type Node struct {
paas.Node
Instances map[InstanceID]*Instance `json:"instances"`
pvenode *proxmox.Node
cluster *Cluster // link cluster needed for instance pool sync
}
type InstanceID = paas.InstanceID