Skip to content

Commit

Permalink
fix(PL-2763): do not pull charts concurrently
Browse files Browse the repository at this point in the history
  • Loading branch information
davidmdm committed Jun 12, 2024
1 parent 64e3b65 commit 707f547
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 4 deletions.
2 changes: 1 addition & 1 deletion cmd/server/api_get_params_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func TestGetParamsE2E(t *testing.T) {
CacheRoot: cacheDir,
LoadJoyContext: generator.RepoLoader(repo),
Logger: logger,
ChartPuller: generator.ChartPuller{Logger: logger},
ChartPuller: generator.MakeChartPuller(logger),
},
})

Expand Down
2 changes: 1 addition & 1 deletion cmd/server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func run() error {
CacheRoot: cfg.CacheRoot,
LoadJoyContext: generator.RepoLoader(repo),
Logger: logger,
ChartPuller: generator.ChartPuller{Logger: logger},
ChartPuller: generator.MakeChartPuller(logger),
},
}),
ReadHeaderTimeout: 5 * time.Second,
Expand Down
25 changes: 23 additions & 2 deletions internal/generator/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"context"
"fmt"
"sync"

"github.com/rs/zerolog"
"gopkg.in/yaml.v3"
Expand All @@ -23,8 +24,23 @@ type Generator struct {
ChartPuller helm.Puller
}

type MutexMap sync.Map

func (m *MutexMap) Get(key string) *sync.Mutex {
value, _ := (*sync.Map)(m).LoadOrStore(key, new(sync.Mutex))
return value.(*sync.Mutex)
}

type ChartPuller struct {
Logger zerolog.Logger
Logger zerolog.Logger
Mutexes *MutexMap
}

func MakeChartPuller(logger zerolog.Logger) ChartPuller {
return ChartPuller{
Logger: logger,
Mutexes: &MutexMap{},
}
}

func (puller ChartPuller) Pull(ctx context.Context, opts helm.PullOptions) error {
Expand All @@ -37,11 +53,16 @@ func (puller ChartPuller) Pull(ctx context.Context, opts helm.PullOptions) error
},
}

url, _ := opts.Chart.ToURL()
mutex := puller.Mutexes.Get(url.String())

mutex.Lock()
defer mutex.Unlock()

if err := cli.Pull(ctx, opts); err != nil {
return fmt.Errorf("%w: %q", err, &buffer)
}

url, _ := opts.Chart.ToURL()
puller.Logger.Info().Str("chart", url.String()).Msg("successfully pulled chart")

return nil
Expand Down

0 comments on commit 707f547

Please sign in to comment.