From 326c392d3d7afecc248b6d7783bcef716aa55bf2 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Sat, 23 May 2026 17:37:49 +0000 Subject: [PATCH] fix desync issue with instance pool membership --- app/model.go | 62 ++++++++++++++++++++++++++++------------------------ app/types.go | 1 + 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/app/model.go b/app/model.go index a320d16..94a5868 100644 --- a/app/model.go +++ b/app/model.go @@ -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 }() diff --git a/app/types.go b/app/types.go index 33ad749..97f9c0d 100644 --- a/app/types.go +++ b/app/types.go @@ -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