Skip to content

Commit 7d1187a

Browse files
fix(operator): Finalizers not running when resource was deleted long time ago
1 parent eff4af5 commit 7d1187a

File tree

1 file changed

+20
-22
lines changed

1 file changed

+20
-22
lines changed

src/KubeOps.Operator/Watcher/ResourceWatcher{TEntity}.cs

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,13 @@ protected virtual async Task OnEventAsync(WatchEventType type, TEntity entity, C
140140
{
141141
MaybeValue<long?> cachedGeneration;
142142

143+
// Make sure Finalizers are running if Termination has began.
144+
if (type != WatchEventType.Deleted && entity.Metadata.DeletionTimestamp is not null && entity.Metadata.Finalizers.Count > 0)
145+
{
146+
await ReconcileFinalizersSequentialAsync(entity, cancellationToken);
147+
return;
148+
}
149+
143150
switch (type)
144151
{
145152
case WatchEventType.Added:
@@ -161,31 +168,22 @@ protected virtual async Task OnEventAsync(WatchEventType type, TEntity entity, C
161168

162169
break;
163170
case WatchEventType.Modified:
164-
switch (entity)
165-
{
166-
case { Metadata.DeletionTimestamp: null }:
167-
cachedGeneration = await _entityCache.TryGetAsync<long?>(entity.Uid(), token: cancellationToken);
168-
169-
// Check if entity spec has changed through "Generation" value increment. Skip reconcile if not changed.
170-
if (cachedGeneration.HasValue && cachedGeneration >= entity.Generation())
171-
{
172-
logger.LogDebug(
173-
"""Entity "{Kind}/{Name}" modification did not modify generation. Skip event.""",
174-
entity.Kind,
175-
entity.Name());
176-
return;
177-
}
178-
179-
// update cached generation since generation now changed
180-
await _entityCache.SetAsync(entity.Uid(), entity.Generation() ?? 1, token: cancellationToken);
181-
await ReconcileModificationAsync(entity, cancellationToken);
171+
cachedGeneration = await _entityCache.TryGetAsync<long?>(entity.Uid(), token: cancellationToken);
182172

183-
break;
184-
case { Metadata: { DeletionTimestamp: not null, Finalizers.Count: > 0 } }:
185-
await ReconcileFinalizersSequentialAsync(entity, cancellationToken);
186-
break;
173+
// Check if entity spec has changed through "Generation" value increment. Skip reconcile if not changed.
174+
if (cachedGeneration.HasValue && cachedGeneration >= entity.Generation())
175+
{
176+
logger.LogDebug(
177+
"""Entity "{Kind}/{Name}" modification did not modify generation. Skip event.""",
178+
entity.Kind,
179+
entity.Name());
180+
return;
187181
}
188182

183+
// update cached generation since generation now changed
184+
await _entityCache.SetAsync(entity.Uid(), entity.Generation() ?? 1, token: cancellationToken);
185+
await ReconcileModificationAsync(entity, cancellationToken);
186+
189187
break;
190188
case WatchEventType.Deleted:
191189
await ReconcileDeletionAsync(entity, cancellationToken);

0 commit comments

Comments
 (0)