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
+16 -10
View File
@@ -56,27 +56,32 @@ func (cluster *Cluster) Sync() error {
} }
} }
err_ch <- nil
}()
return <-err_ch
}
func (cluster *Cluster) ResolvePoolMembership() error {
//resolve pool membership //resolve pool membership
pools, err := cluster.pve.client.Pools(context.Background()) pools, err := cluster.pve.client.Pools(context.Background())
if err != nil { if err != nil {
err_ch <- err return err
return
} }
for _, pool := range pools { for _, pool := range pools {
pool, err = cluster.pve.client.Pool(context.Background(), pool.PoolID) pool, err = cluster.pve.client.Pool(context.Background(), pool.PoolID)
if err != nil { if err != nil {
err_ch <- err return err
return
} }
for _, member := range pool.Members { for _, member := range pool.Members {
if member.Type == "lxc" || member.Type == "qemu" { if member.Type == "lxc" || member.Type == "qemu" {
node, ok := cluster.Nodes[member.Node] node, ok := cluster.Nodes[member.Node]
if !ok { if !ok {
return return fmt.Errorf("Instance %s has no node", member.VMID)
} }
instance, ok := node.Instances[InstanceID(member.VMID)] instance, ok := node.Instances[InstanceID(member.VMID)]
if !ok { if !ok {
return return fmt.Errorf("Instance %s claimed to be in node %s but was not", member.VMID, node.Name)
} }
instance.Pool = pool.PoolID instance.Pool = pool.PoolID
log.Printf("[INFO] successfully resolved pool membership for vmid=%d pool=%s", member.VMID, pool.PoolID) log.Printf("[INFO] successfully resolved pool membership for vmid=%d pool=%s", member.VMID, pool.PoolID)
@@ -84,10 +89,7 @@ func (cluster *Cluster) Sync() error {
} }
} }
err_ch <- nil return nil
}()
return <-err_ch
} }
// get a node in the cluster // get a node in the cluster
@@ -140,6 +142,8 @@ func (cluster *Cluster) RebuildNode(hostName string) error {
} }
cluster.Nodes[hostName] = host cluster.Nodes[hostName] = host
// attatch pointer to cluster to node
cluster.Nodes[hostName].cluster = cluster
// get node's VMs // get node's VMs
vms, err := host.VirtualMachines() vms, err := host.VirtualMachines()
@@ -259,6 +263,8 @@ func (host *Node) RebuildInstance(instancetype InstanceType, vmid uint) error {
instance.RebuildBoot() instance.RebuildBoot()
} }
// after synchronizing an instance, resync pool membership
host.cluster.ResolvePoolMembership()
err_ch <- nil err_ch <- nil
}() }()
+1
View File
@@ -26,6 +26,7 @@ type Node struct {
paas.Node paas.Node
Instances map[InstanceID]*Instance `json:"instances"` Instances map[InstanceID]*Instance `json:"instances"`
pvenode *proxmox.Node pvenode *proxmox.Node
cluster *Cluster // link cluster needed for instance pool sync
} }
type InstanceID = paas.InstanceID type InstanceID = paas.InstanceID