@@ -131,46 +131,48 @@ func (r *loader) Renderer(ctx context.Context, db database.Store, cache *files.C
131131return r .staticRender (ctx ,db )
132132}
133133
134- return r .dynamicRenderer (ctx ,db ,cache )
134+ return r .dynamicRenderer (ctx ,db ,files . NewCacheCloser ( cache ) )
135135}
136136
137137// Renderer caches all the necessary files when rendering a template version's
138138// parameters. It must be closed after use to release the cached files.
139- func (r * loader )dynamicRenderer (ctx context.Context ,db database.Store ,cache * files.Cache ) (* dynamicRenderer ,error ) {
139+ func (r * loader )dynamicRenderer (ctx context.Context ,db database.Store ,cache * files.CacheCloser ) (* dynamicRenderer ,error ) {
140+ closeFiles := true // If the function returns with no error, this will toggle to false.
141+ defer func () {
142+ if closeFiles {
143+ cache .Close ()
144+ }
145+ }()
146+
140147// If they can read the template version, then they can read the file for
141148// parameter loading purposes.
142149//nolint:gocritic
143150fileCtx := dbauthz .AsFileReader (ctx )
144- templateFS ,err := cache .Acquire (fileCtx ,r .job .FileID )
151+
152+ var templateFS fs.FS
153+ var err error
154+
155+ templateFS ,err = cache .Acquire (fileCtx ,r .job .FileID )
145156if err != nil {
146157return nil ,xerrors .Errorf ("acquire template file: %w" ,err )
147158}
148159
149- var terraformFS fs.FS = templateFS
150160var moduleFilesFS * files.CloseFS
151161if r .terraformValues .CachedModuleFiles .Valid {
152162moduleFilesFS ,err = cache .Acquire (fileCtx ,r .terraformValues .CachedModuleFiles .UUID )
153163if err != nil {
154- templateFS .Close ()
155164return nil ,xerrors .Errorf ("acquire module files: %w" ,err )
156165}
157- terraformFS = files .NewOverlayFS (templateFS , []files.Overlay {{Path :".terraform/modules" ,FS :moduleFilesFS }})
166+ templateFS = files .NewOverlayFS (templateFS , []files.Overlay {{Path :".terraform/modules" ,FS :moduleFilesFS }})
158167}
159168
169+ closeFiles = false // Caller will have to call close
160170return & dynamicRenderer {
161171data :r ,
162- templateFS :terraformFS ,
172+ templateFS :templateFS ,
163173db :db ,
164174ownerErrors :make (map [uuid.UUID ]error ),
165- close :func () {
166- // Up to 2 files are cached, and must be released when rendering is complete.
167- // TODO: Might be smart to always call release when the context is
168- // canceled.
169- templateFS .Close ()
170- if moduleFilesFS != nil {
171- moduleFilesFS .Close ()
172- }
173- },
175+ close :cache .Close ,
174176},nil
175177}
176178