# mvirt 0.31.0

migrations: yes
wire: unchanged
floor: 0.29.0
rev: 86360ce8b44d93ea2b14dc59ff90730c2e5155c7

mvirt 0.31.0

A dead host's workloads come back elsewhere, like Kubernetes: nodes show
NotReady after 40 s, and disk-less pods are replaced after a toleration.

- cplane, console, cli, vk: Kubernetes node lifecycle (#415, ADR-0058 D5
  amendment). A host Offline for 40 s shows Ready=Unknown. Disk-less pods on
  it get HostFailed and are replaced on a healthy host after 40 s + toleration
  (default 300 s; per pod spec.unreachableTolerationSeconds, per app
  [placement] unreachable_toleration, VK pods take their k8s toleration).
  During a partition two copies can run (as in k8s); the returning host
  drops its stale copy. Local-disk pods and VMs are held in HostFailed, not
  moved. A planned shutdown shows ShuttingDown and evicts nothing. Cordon a
  host before maintenance longer than ~5 min. Cplane env:
  MVIRT_NODE_MONITOR_GRACE_SECONDS, MVIRT_UNREACHABLE_TOLERATION_SECONDS.
- cplane: IP allocators retry a lost race on the unique index instead of
  returning Conflict while the subnet has free addresses; three test flakes
  fixed (#337).

Migrating release (m0149): roll leader-last (runbook §C1a).


## Upgrading

Point your flake's `mvirt` input at this release and redeploy the control-plane
host first, then each node in turn:

```
nix run .#colmena -- apply boot --reboot --on <control-plane host>
nix run .#colmena -- apply boot --reboot --on <node>   # one at a time
```

**This release migrates the store.** Once the control plane has started, the
previous version will refuse to run against it — migrations are forward-only, so
rolling the control-plane host back means restoring a backup, with data loss back
to the backup point. The control plane writes a backup immediately before it
applies migrations; nodes roll back freely by booting the previous generation.
