@@ -25,6 +25,7 @@ import (
2525 "go.uber.org/zap"
2626 "golang.org/x/sync/singleflight"
2727
28+ "github.com/siderolabs/image-factory/internal/cache"
2829 "github.com/siderolabs/image-factory/internal/remotewrap"
2930)
3031
@@ -39,14 +40,9 @@ type Manager struct { //nolint:govet
3940
4041 sf singleflight.Group
4142
42- officialExtensionsMu sync.Mutex
43- officialExtensions map [string ][]ExtensionRef
44-
45- officialOverlaysMu sync.Mutex
46- officialOverlays map [string ][]OverlayRef
47-
48- talosctlTuplesMu sync.Mutex
49- talosctlTuples map [string ][]TalosctlTuple
43+ officialExtensions * cache.SingleFlightCache [[]ExtensionRef ]
44+ officialOverlays * cache.SingleFlightCache [[]OverlayRef ]
45+ talosctlTuples * cache.SingleFlightCache [[]TalosctlTuple ]
5046
5147 talosVersionsMu sync.Mutex
5248 talosVersions []semver.Version
@@ -96,14 +92,28 @@ func NewManager(logger *zap.Logger, options Options) (*Manager, error) {
9692 }
9793 }
9894
99- return & Manager {
95+ m := & Manager {
10096 options : options ,
10197 storagePath : tmpDir ,
10298 schematicsPath : schematicsPath ,
10399 logger : logger ,
104100 imageRegistry : imageRegistry ,
105101 pullers : pullers ,
106- }, nil
102+ }
103+
104+ m .officialExtensions = cache .NewSingleFlightCache (func (tag string ) ([]ExtensionRef , error ) {
105+ return m .fetchExtensionList (m .options .ExtensionManifestImage , tag )
106+ })
107+
108+ m .officialOverlays = cache .NewSingleFlightCache (func (tag string ) ([]OverlayRef , error ) {
109+ return m .fetchOverlayList (tag )
110+ })
111+
112+ m .talosctlTuples = cache .NewSingleFlightCache (func (tag string ) ([]TalosctlTuple , error ) {
113+ return m .fetchTalosctlTuples (tag )
114+ })
115+
116+ return m , nil
107117}
108118
109119// Close the manager.
@@ -199,77 +209,23 @@ func (m *Manager) GetTalosVersions(ctx context.Context) ([]semver.Version, error
199209}
200210
201211// GetOfficialExtensions returns a list of Talos extensions per Talos version available.
202- //
203- //nolint:dupl
204212func (m * Manager ) GetOfficialExtensions (ctx context.Context , versionString string ) ([]ExtensionRef , error ) {
205213 tag , err := m .parseTag (ctx , versionString )
206214 if err != nil {
207215 return nil , err
208216 }
209217
210- m .officialExtensionsMu .Lock ()
211- extensions , ok := m .officialExtensions [tag ]
212- m .officialExtensionsMu .Unlock ()
213-
214- if ok {
215- return extensions , nil
216- }
217-
218- resultCh := m .sf .DoChan ("extensions-" + tag , func () (any , error ) { //nolint:contextcheck
219- return nil , m .fetchOfficialExtensions (tag )
220- })
221-
222- select {
223- case <- ctx .Done ():
224- return nil , ctx .Err ()
225- case result := <- resultCh :
226- if result .Err != nil {
227- return nil , result .Err
228- }
229- }
230-
231- m .officialExtensionsMu .Lock ()
232- extensions = m .officialExtensions [tag ]
233- m .officialExtensionsMu .Unlock ()
234-
235- return extensions , nil
218+ return m .officialExtensions .Get (ctx , tag )
236219}
237220
238221// GetOfficialOverlays returns a list of overlays per Talos version available.
239- //
240- //nolint:dupl
241222func (m * Manager ) GetOfficialOverlays (ctx context.Context , versionString string ) ([]OverlayRef , error ) {
242223 tag , err := m .parseTag (ctx , versionString )
243224 if err != nil {
244225 return nil , err
245226 }
246227
247- m .officialOverlaysMu .Lock ()
248- overlays , ok := m .officialOverlays [tag ]
249- m .officialOverlaysMu .Unlock ()
250-
251- if ok {
252- return overlays , nil
253- }
254-
255- resultCh := m .sf .DoChan ("overlays-" + tag , func () (any , error ) { //nolint:contextcheck
256- return nil , m .fetchOfficialOverlays (tag )
257- })
258-
259- select {
260- case <- ctx .Done ():
261- return nil , ctx .Err ()
262- case result := <- resultCh :
263- if result .Err != nil {
264- return nil , result .Err
265- }
266- }
267-
268- m .officialOverlaysMu .Lock ()
269- overlays = m .officialOverlays [tag ]
270- m .officialOverlaysMu .Unlock ()
271-
272- return overlays , nil
228+ return m .officialOverlays .Get (ctx , tag )
273229}
274230
275231// GetInstallerImage pulls and stores in OCI layout installer-base image.
@@ -424,44 +380,17 @@ func (m *Manager) GetTalosctlImage(ctx context.Context, versionString string) (s
424380}
425381
426382// GetTalosctlTuples returns a list of Talosctl tuples for the given version.
427- //
428- //nolint:dupl
429383func (m * Manager ) GetTalosctlTuples (ctx context.Context , versionString string ) ([]TalosctlTuple , error ) {
430384 tag , err := m .parseTag (ctx , versionString )
431385 if err != nil {
432386 return nil , err
433387 }
434388
435- m .talosctlTuplesMu .Lock ()
436- tuples , ok := m .talosctlTuples [tag ]
437- m .talosctlTuplesMu .Unlock ()
438-
439- if ok {
440- return tuples , nil
441- }
442-
443389 if ! quirks .New (versionString ).SupportsFactoryTalosctlDownload () {
444- return tuples , nil
390+ return nil , nil
445391 }
446392
447- resultCh := m .sf .DoChan ("tuples-" + tag , func () (any , error ) { //nolint:contextcheck
448- return nil , m .fetchTalosctlTuples (tag )
449- })
450-
451- select {
452- case <- ctx .Done ():
453- return nil , ctx .Err ()
454- case result := <- resultCh :
455- if result .Err != nil {
456- return nil , result .Err
457- }
458- }
459-
460- m .talosctlTuplesMu .Lock ()
461- tuples = m .talosctlTuples [tag ]
462- m .talosctlTuplesMu .Unlock ()
463-
464- return tuples , nil
393+ return m .talosctlTuples .Get (ctx , tag )
465394}
466395
467396func (m * Manager ) parseTag (ctx context.Context , versionString string ) (string , error ) {
0 commit comments