update ResolvePoolMembership to be go routine

This commit is contained in:
2026-05-29 22:16:35 +00:00
parent 606277e127
commit 34bf10dfe3
+18 -7
View File
@@ -35,7 +35,6 @@ func (cluster *Cluster) Sync() error {
go func() { go func() {
// aquire lock on cluster, release on return // aquire lock on cluster, release on return
cluster.lock.Lock() cluster.lock.Lock()
defer cluster.lock.Unlock()
cluster.Nodes = make(map[string]*Node) cluster.Nodes = make(map[string]*Node)
@@ -56,7 +55,8 @@ func (cluster *Cluster) Sync() error {
} }
} }
// after synchronizing an instance, resync pool membership cluster.lock.Unlock()
err = cluster.ResolvePoolMembership() err = cluster.ResolvePoolMembership()
if err != nil { if err != nil {
err_ch <- err err_ch <- err
@@ -69,25 +69,31 @@ func (cluster *Cluster) Sync() error {
} }
func (cluster *Cluster) ResolvePoolMembership() error { func (cluster *Cluster) ResolvePoolMembership() error {
err_ch := make(chan error)
go func() {
// aquire lock on cluster, release on return
cluster.lock.Lock()
//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 {
return err err_ch <- err
} }
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 {
return err err_ch <- err
} }
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 fmt.Errorf("Instance %d has no node", member.VMID) err_ch <- fmt.Errorf("Instance %d has no node", member.VMID)
} }
instance, ok := node.Instances[InstanceID(member.VMID)] instance, ok := node.Instances[InstanceID(member.VMID)]
if !ok { if !ok {
return fmt.Errorf("Instance %d claimed to be in node %s but was not", member.VMID, node.Name) err_ch <- fmt.Errorf("Instance %d 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)
@@ -95,7 +101,12 @@ func (cluster *Cluster) ResolvePoolMembership() error {
} }
} }
return nil err_ch <- nil
cluster.lock.Unlock()
}()
return <-err_ch
} }
// get a node in the cluster // get a node in the cluster