Do not load scalesets and runners in parallel

Both functions read and write to the same map. We should switch
to sync.Map

Signed-off-by: Gabriel Adrian Samfira <gsamfira@cloudbasesolutions.com>
This commit is contained in:
Gabriel Adrian Samfira 2025-05-14 15:36:53 +00:00
parent 8538a4ae8a
commit 56be5eb698
3 changed files with 8 additions and 45 deletions

View file

@ -171,7 +171,7 @@ type Repository struct {
EndpointName *string `gorm:"index:idx_owner_nocase,unique,collate:nocase"`
Endpoint GithubEndpoint `gorm:"foreignKey:EndpointName;constraint:OnDelete:SET NULL"`
Events []RepositoryEvent `gorm:"foreignKey:RepoID;constraint:OnDelete:CASCADE,OnUpdate:CASCADE;"`
Events []*RepositoryEvent `gorm:"foreignKey:RepoID;constraint:OnDelete:CASCADE,OnUpdate:CASCADE;"`
}
type OrganizationEvent struct {
@ -203,7 +203,7 @@ type Organization struct {
EndpointName *string `gorm:"index:idx_org_name_nocase,collate:nocase"`
Endpoint GithubEndpoint `gorm:"foreignKey:EndpointName;constraint:OnDelete:SET NULL"`
Events []OrganizationEvent `gorm:"foreignKey:OrgID;constraint:OnDelete:CASCADE,OnUpdate:CASCADE;"`
Events []*OrganizationEvent `gorm:"foreignKey:OrgID;constraint:OnDelete:CASCADE,OnUpdate:CASCADE;"`
}
type EnterpriseEvent struct {
@ -233,7 +233,7 @@ type Enterprise struct {
EndpointName *string `gorm:"index:idx_ent_name_nocase,collate:nocase"`
Endpoint GithubEndpoint `gorm:"foreignKey:EndpointName;constraint:OnDelete:SET NULL"`
Events []EnterpriseEvent `gorm:"foreignKey:EnterpriseID;constraint:OnDelete:CASCADE,OnUpdate:CASCADE;"`
Events []*EnterpriseEvent `gorm:"foreignKey:EnterpriseID;constraint:OnDelete:CASCADE,OnUpdate:CASCADE;"`
}
type Address struct {

View file

@ -6,8 +6,6 @@ import (
"log/slog"
"sync"
"golang.org/x/sync/errgroup"
commonParams "github.com/cloudbase/garm-provider-common/params"
"github.com/cloudbase/garm/auth"
dbCommon "github.com/cloudbase/garm/database/common"
@ -133,24 +131,12 @@ func (p *Provider) Start() error {
return nil
}
g, _ := errgroup.WithContext(p.ctx)
if err := p.loadAllScaleSets(); err != nil {
return fmt.Errorf("loading all scale sets: %w", err)
}
g.Go(func() error {
if err := p.loadAllScaleSets(); err != nil {
return fmt.Errorf("loading all scale sets: %w", err)
}
return nil
})
g.Go(func() error {
if err := p.loadAllRunners(); err != nil {
return fmt.Errorf("loading all runners: %w", err)
}
return nil
})
if err := p.waitForErrorGroupOrContextCancelled(g); err != nil {
return fmt.Errorf("waiting for error group: %w", err)
if err := p.loadAllRunners(); err != nil {
return fmt.Errorf("loading all runners: %w", err)
}
consumer, err := watcher.RegisterConsumer(

View file

@ -1,8 +1,6 @@
package provider
import (
"golang.org/x/sync/errgroup"
dbCommon "github.com/cloudbase/garm/database/common"
"github.com/cloudbase/garm/database/watcher"
)
@ -13,24 +11,3 @@ func composeProviderWatcher() dbCommon.PayloadFilterFunc {
watcher.WithEntityTypeFilter(dbCommon.ScaleSetEntityType),
)
}
func (p *Provider) waitForErrorGroupOrContextCancelled(g *errgroup.Group) error {
if g == nil {
return nil
}
done := make(chan error, 1)
go func() {
waitErr := g.Wait()
done <- waitErr
}()
select {
case err := <-done:
return err
case <-p.ctx.Done():
return p.ctx.Err()
case <-p.quit:
return nil
}
}