Skip to content

A newly shipped module version is adopted within minutes, and a fallback re-examines every new build #3650

Closed

Description

@rbuergi

Rule (maintainer, 2026-09-07): as soon as a new module version ships, the instance starts using it

RegistryUpdateReconciler.ReconcileModules already adopts unattended when the registry's bundle version is newer than the landed one, or the same version was rebuilt against a different framework build (ModuleUpdateDecision, Plugins#931/#723). Two gaps remain against the rule:

  1. A module running its previous generation (the keep-the-old fallback) is not re-examined when a build that WOULD load appears under the same version: SkipUpToDate fires on Compare(bundleVersion, landed.Version) == 0 with an equal served MVID. Change: when the entry is in fallback (newest generation unloadable), an index entry with the same version but a frameworkMvid different from the unloadable generation's is a Land ("a build for this platform appeared").
  2. The reconcile runs once per boot and on catalog opens (PluginUpdateOnGreenBuild: "a consumer learns on its next boot"). Change: the registry's ProposeModuleSet / publish path already raises a ModulePublished event locally; the platform-release broadcast (FrameworkReleaseBroadcaster) exists for images. Add a ModulePublished broadcast to consumers (same inbox as the release broadcast), which triggers ReconcileModules for that package only, so "ships" → "used" is minutes, not the next boot. Without the broadcast, a scheduled reconcile (every 30 min, SelfUpdate:MinRollInterval cadence) is the floor.
  3. A landed-but-not-loaded newer generation still needs a restart to load (PendingRestart). Keep that contract (a module swap is a restart) but make the restart happen: SetPendingRestart(true) → the self-updater's tick treats a pending restart like a roll of the same image (respecting MinRollInterval), instead of waiting for the next unrelated roll.

Tests

ModuleUpdateIdentityTest: fallback + same version + new identity → Land; RegistryUpdateReconcilerTest: broadcast triggers one package's reconcile; SelfUpdateVerdictTest: pending restart rolls the same image within the interval rules.

Part of the module-adoption policy (Doc/Architecture/ModuleAdoptionPolicy).

Activity

  1. added a commit that references this issue on Sep 8, 2026
  2. rbuergi commented on Sep 8, 2026

    @rbuergi
    ContributorAuthor

    Implementation is PR #3667 (stacked on #3661). Two operational follow-ups it leaves outside this repo, recorded here so they are not lost when the PR closes this issue:

    1. AKS restart — IDeploymentUpdater.RestartAsync is default-implemented (false → RestartUnavailable, Warning + policy node); the Kubernetes implementation (rollout-restart annotation on the pod template) is Systemorph/MeshWeaver.Plugins#1498. Until it lands the restart half of "ships → used within minutes" waits for the next image roll on AKS.
    2. Consumer inbox slot — a consumer receives the ModulePublished broadcast only with WebhookInbox:Targets:N = Plugins/_RegistryReconcileLedger configured (and a PluginCatalog:HomeUrl at registration); the chart lives in the private Memex repo. Without it the 30-minute safety-net reconcile (PluginCatalog:ReconcileSafetyNetInterval) is the floor. Documented in PluginUpdateOnGreenBuild.md; the Helm values change is an operator task for the Memex chart.
  3. added 2 commits that reference this issue on Sep 8, 2026
  4. added a commit that references this issue on Sep 8, 2026
  5. rbuergi commented on Sep 8, 2026

    @rbuergi
    ContributorAuthor

    Shipped on main in 13d3249 (#3661, merged 2026-09-08 01:42Z): step 3 (eager adoption) — PRs #3667 and #3672, merged into #3661. Closing by hand — the stacked PRs merged into the #3661 branch, so GitHub did not auto-close from their "Closes" lines.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions