Problem
newConvergingStatusCondition (pkg/component/converge.go:265-271 in v0.19.1) copies the previous condition wholesale when the previous reason is neither Unknown nor a healthy reason, then overwrites only Reason:
out := previousCondition // Status: True, from Disabled
out.Reason = string(status) // Blocked
A component that was feature-gated off carries Status: True, Reason: Disabled. When the gate re-enables it and the component blocks on a guard, the derived condition becomes Status: True, Reason: Blocked — a contradiction — and every later reconcile copies the stale True forward again, so it never self-corrects.
Seen in konsole-is/camunda-operator PR #241: a DatabaseServer whose archive block is removed (component Disabled) and re-added (component blocked on its first base backup) reported ArchiveReady=True/Blocked indefinitely. The consumer works around it by dropping the condition when the component re-enables, so ocf re-derives it from Unknown (clearReenabledArchiveCondition in internal/controller/databaseserver/controller.go).
Expected behaviour
A condition whose previous reason is Disabled is re-derived from scratch (as from Unknown) when the component is enabled again, so Blocked carries the status the blocked state defines, not the disabled state's True.
Context
Found while building the CNPG DatabaseServer controller; the workaround is noted there and can be removed when this is fixed.
Problem
newConvergingStatusCondition(pkg/component/converge.go:265-271in v0.19.1) copies the previous condition wholesale when the previous reason is neitherUnknownnor a healthy reason, then overwrites onlyReason:A component that was feature-gated off carries
Status: True, Reason: Disabled. When the gate re-enables it and the component blocks on a guard, the derived condition becomesStatus: True, Reason: Blocked— a contradiction — and every later reconcile copies the staleTrueforward again, so it never self-corrects.Seen in konsole-is/camunda-operator PR #241: a
DatabaseServerwhose archive block is removed (componentDisabled) and re-added (component blocked on its first base backup) reportedArchiveReady=True/Blockedindefinitely. The consumer works around it by dropping the condition when the component re-enables, so ocf re-derives it fromUnknown(clearReenabledArchiveConditionininternal/controller/databaseserver/controller.go).Expected behaviour
A condition whose previous reason is
Disabledis re-derived from scratch (as fromUnknown) when the component is enabled again, soBlockedcarries the status the blocked state defines, not the disabled state'sTrue.Context
Found while building the CNPG
DatabaseServercontroller; the workaround is noted there and can be removed when this is fixed.