@@ -131,46 +131,48 @@ func (r *loader) Renderer(ctx context.Context, db database.Store, cache *files.C
131
131
return r .staticRender (ctx , db )
132
132
}
133
133
134
- return r .dynamicRenderer (ctx , db , cache )
134
+ return r .dynamicRenderer (ctx , db , files . NewCacheCloser ( cache ) )
135
135
}
136
136
137
137
// Renderer caches all the necessary files when rendering a template version's
138
138
// 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
+
140
147
// If they can read the template version, then they can read the file for
141
148
// parameter loading purposes.
142
149
//nolint:gocritic
143
150
fileCtx := 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 )
145
156
if err != nil {
146
157
return nil , xerrors .Errorf ("acquire template file: %w" , err )
147
158
}
148
159
149
- var terraformFS fs.FS = templateFS
150
160
var moduleFilesFS * files.CloseFS
151
161
if r .terraformValues .CachedModuleFiles .Valid {
152
162
moduleFilesFS , err = cache .Acquire (fileCtx , r .terraformValues .CachedModuleFiles .UUID )
153
163
if err != nil {
154
- templateFS .Close ()
155
164
return nil , xerrors .Errorf ("acquire module files: %w" , err )
156
165
}
157
- terraformFS = files .NewOverlayFS (templateFS , []files.Overlay {{Path : ".terraform/modules" , FS : moduleFilesFS }})
166
+ templateFS = files .NewOverlayFS (templateFS , []files.Overlay {{Path : ".terraform/modules" , FS : moduleFilesFS }})
158
167
}
159
168
169
+ closeFiles = false // Caller will have to call close
160
170
return & dynamicRenderer {
161
171
data : r ,
162
- templateFS : terraformFS ,
172
+ templateFS : templateFS ,
163
173
db : db ,
164
174
ownerErrors : 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 ,
174
176
}, nil
175
177
}
176
178
0 commit comments