@@ -121,7 +121,7 @@ func transientErrors(err error) error {
121
121
}
122
122
123
123
func incompatibleOperators (ctx context.Context , cli client.Client ) (skews , error ) {
124
- current , err := getCurrentRelease (ctx )
124
+ current , err := getCurrentRelease ()
125
125
if err != nil {
126
126
return nil , err
127
127
}
@@ -170,39 +170,51 @@ func incompatibleOperators(ctx context.Context, cli client.Client) (skews, error
170
170
return incompatible , nil
171
171
}
172
172
173
+ type openshiftRelease struct {
174
+ version * semver.Version
175
+ mu sync.Mutex
176
+ }
177
+
173
178
var (
174
- openshiftReleaseOnce = sync.Once {}
175
- openshiftRelease * semver.Version
179
+ currentRelease = & openshiftRelease {}
176
180
)
177
181
178
182
const (
179
183
releaseEnvVar = "OPENSHIFT_RELEASE" // OpenShift's env variable for defining the current release
180
184
)
181
185
182
- func getCurrentRelease (ctx context.Context ) (* semver.Version , error ) {
183
- var doError error
184
- openshiftReleaseOnce .Do (func () {
185
- // Get the raw version from the OPENSHIFT_RELEASE environment variable
186
- raw , ok := os .LookupEnv (releaseEnvVar )
187
- if ! ok || raw == "" {
188
- doError = fmt .Errorf ("desired release version missing from OPENSHIFT_RELEASE env variable" )
189
- return
190
- }
191
-
192
- release , err := semver .ParseTolerant (raw )
193
- if err != nil {
194
- doError = fmt .Errorf ("cluster version has invalid desired release version: %w" , err )
195
- return
196
- }
186
+ func getCurrentRelease () (* semver.Version , error ) {
187
+ currentRelease .mu .Lock ()
188
+ defer currentRelease .mu .Unlock ()
189
+
190
+ if currentRelease .version != nil {
191
+ /*
192
+ If the version is already set, we don't want to set it again as the currentRelease
193
+ is designed to be a singleton. If a new version is set, we are making an assumption
194
+ that this controller will be restarted and thus pull in the new version from the
195
+ environment into memory.
196
+
197
+ Note: sync.Once is not used here as it was difficult to reliably test without hitting
198
+ race conditions.
199
+ */
200
+ return currentRelease .version , nil
201
+ }
197
202
198
- openshiftRelease = & release
199
- })
203
+ // Get the raw version from the OPENSHIFT_RELEASE environment variable
204
+ raw , ok := os .LookupEnv (releaseEnvVar )
205
+ if ! ok || raw == "" {
206
+ // No env var set, try again later
207
+ return nil , fmt .Errorf ("desired release version missing from OPENSHIFT_RELEASE env variable" )
208
+ }
200
209
201
- if doError != nil {
202
- return nil , doError
210
+ release , err := semver .ParseTolerant (raw )
211
+ if err != nil {
212
+ return nil , fmt .Errorf ("cluster version has invalid desired release version: %w" , err )
203
213
}
204
214
205
- return openshiftRelease , nil
215
+ currentRelease .version = & release
216
+
217
+ return currentRelease .version , nil
206
218
}
207
219
208
220
func nextY (v semver.Version ) (semver.Version , error ) {
0 commit comments