@@ -134,8 +134,8 @@ type ClusterCache interface {
134
134
OnResourceUpdated (handler OnResourceUpdatedHandler ) Unsubscribe
135
135
// OnEvent register event handler that is executed every time when new K8S event received
136
136
OnEvent (handler OnEventHandler ) Unsubscribe
137
- // UpdateClusterConnectionStatus checks the watch errors periodically and updates the cluster connection status.
138
- UpdateClusterConnectionStatus (ctx context.Context )
137
+ // StartClusterConnectionStatusMonitoring starts a goroutine that checks the watch errors periodically and updates the cluster connection status.
138
+ StartClusterConnectionStatusMonitoring (ctx context.Context )
139
139
}
140
140
141
141
type WeightedSemaphore interface {
@@ -175,7 +175,7 @@ func NewClusterCache(config *rest.Config, opts ...UpdateSettingsFunc) *clusterCa
175
175
listRetryUseBackoff : false ,
176
176
listRetryFunc : ListRetryFuncNever ,
177
177
connectionStatus : ConnectionStatusUnknown ,
178
- watchFails : newWatchFaiures (),
178
+ watchFails : newWatchFailures (),
179
179
}
180
180
for i := range opts {
181
181
opts [i ](cache )
@@ -1232,10 +1232,10 @@ func skipAppRequeuing(key kube.ResourceKey) bool {
1232
1232
return ignoredRefreshResources [key .Group + "/" + key .Kind ]
1233
1233
}
1234
1234
1235
- // UpdateClusterConnectionStatus starts a goroutine that checks for watch failures.
1235
+ // StartClusterConnectionStatusMonitoring starts a goroutine that checks for watch failures.
1236
1236
// If there are any watch errors, it will periodically ping the remote cluster
1237
1237
// and update the cluster connection status.
1238
- func (c * clusterCache ) UpdateClusterConnectionStatus (ctx context.Context ) {
1238
+ func (c * clusterCache ) StartClusterConnectionStatusMonitoring (ctx context.Context ) {
1239
1239
go c .clusterConnectionService (ctx )
1240
1240
}
1241
1241
@@ -1250,15 +1250,23 @@ func (c *clusterCache) clusterConnectionService(ctx context.Context) {
1250
1250
watchErrors := c .watchFails .len ()
1251
1251
// Ping the cluster for connection verification if there are watch failures or
1252
1252
// if the cluster has recovered back from watch failures.
1253
- if watchErrors > 0 || (watchErrors == 0 && c .connectionStatus == ConnectionStatusFailed ) {
1253
+ watchesRecovered := false
1254
+ if watchErrors == 0 {
1255
+ // If there are no watch failures check if the status needs to be updated.
1256
+ c .lock .RLock ()
1257
+ if c .connectionStatus == ConnectionStatusFailed {
1258
+ watchesRecovered = true
1259
+ }
1260
+ c .lock .RUnlock ()
1261
+ }
1262
+
1263
+ if watchErrors > 0 || watchesRecovered {
1254
1264
c .log .V (1 ).Info ("verifying cluster connection" , "watches" , watchErrors )
1255
1265
1256
1266
_ , err := c .kubectl .GetServerVersion (c .config )
1257
1267
if err != nil {
1258
- if c .connectionStatus != ConnectionStatusFailed {
1259
- c .updateConnectionStatus (ConnectionStatusFailed )
1260
- }
1261
- } else if c .connectionStatus != ConnectionStatusSuccessful {
1268
+ c .updateConnectionStatus (ConnectionStatusFailed )
1269
+ } else {
1262
1270
c .updateConnectionStatus (ConnectionStatusSuccessful )
1263
1271
}
1264
1272
}
@@ -1271,14 +1279,18 @@ func (c *clusterCache) clusterConnectionService(ctx context.Context) {
1271
1279
}
1272
1280
1273
1281
func (c * clusterCache ) updateConnectionStatus (status ConnectionStatus ) {
1274
- if c .connectionStatus == status {
1275
- return
1276
- }
1277
-
1282
+ invalidateCache := false
1278
1283
c .lock .Lock ()
1279
- c .connectionStatus = status
1284
+ if c .connectionStatus != status {
1285
+ c .connectionStatus = status
1286
+ invalidateCache = true
1287
+ }
1280
1288
c .lock .Unlock ()
1281
1289
1290
+ if ! invalidateCache {
1291
+ return
1292
+ }
1293
+
1282
1294
c .log .V (1 ).Info ("updated cluster connection status" , "server" , c .config .Host , "status" , status )
1283
1295
1284
1296
c .Invalidate ()
@@ -1294,7 +1306,7 @@ type watchFailures struct {
1294
1306
mu sync.RWMutex
1295
1307
}
1296
1308
1297
- func newWatchFaiures () * watchFailures {
1309
+ func newWatchFailures () * watchFailures {
1298
1310
return & watchFailures {
1299
1311
watches : make (map [string ]bool ),
1300
1312
}
0 commit comments