Skip to content

controllers: reconciles fail on stale writes often enough to be a pattern, not noise #34

Description

@tjjh89017

Optimistic-concurrency conflicts are normal in a controller. These are not spread thin - they come in bursts tied to activity, always from the same few write sites, and every one of them throws away a whole reconcile.

What is in the log

74 conflict errors in 2000 lines of manager log from one lab session, splitting cleanly:

Count Controller Write
37 image update image seeder status
27 machine agent deployer: clearing registration state for Register
10 machine plain Operation cannot be fulfilled on machines.kezio.kojuro.date

One in full:

ERROR Reconciler error {"controller": "image", "controllerKind": "Image",
  "Image": {"name":"lab-ubuntu","namespace":"kezio-system"},
  "reconcileID": "5c8d5d3a-...",
  "error": "update image seeder status: Operation cannot be fulfilled on
   images.kezio.kojuro.date \"lab-ubuntu\": the object has been modified;
   please apply your changes to the latest version and try again"}

Timestamps cluster rather than trickle - five inside 25 seconds, then a gap:

09:34:37  09:34:47  09:34:55  09:34:55  09:35:00  09:35:00   ...  09:40:00

That shape says several writers touching one object while something is happening to it (machines deploying, a seeder scaling), not two reconciles brushing past each other once.

Why it is worth looking at rather than tolerating

  • A conflict discards the reconcile that hit it, including any work it did before the write. With more machines it happens more often, and the retries are not free at the API server either.
  • It hides real failures. Reconciler error at ERROR level, dozens of times, trains a reader to skip that line - which is exactly the line a genuine fault will appear on.
  • The same shape has already produced a real bug once: writing spec before a not-yet-persisted status meant Update refreshed the object and silently discarded status.provisioning and status.poweredOn (fixed in 54be293). Whatever is doing this to Image may be doing it for the same reason.

Worth checking

  • Does one reconcile pass write the same object more than once (spec then status, or status twice), reusing a copy that the first write already made stale?
  • update image seeder status and update seeder deployment both appear. If the Image reconcile writes the Deployment and then writes Image status derived from it, the ordering matters.
  • clearing registration state for Register is the machine controller's equivalent hot spot and probably has the same cause.
  • Where a conflict is genuinely expected and harmless, it does not belong at ERROR - requeue quietly instead, so the level keeps meaning something.

Found while deploying 10-30 machines against a Proxmox VE lab. Nothing failed because of this; it is a smell with a track record, not an outage.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions