Repository navigation
chore(release): prepare v0.22.0 - #302
Merged
Merged
Conversation
lance0
marked this pull request as ready for review
October 22, 2026 00:50
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Prepares the 0.22.0 release.
just release-prepare 0.22.0set the Cargo version, refreshed Cargo.lock (only theprefixdentry changed) and rolled[Unreleased]into## [0.22.0], dated 2026-10-22 (UTC). The manual items follow:The README Status line names v0.22.0 and links the new upgrade section.
docs/how-to/upgrading.mdgains a v0.21.0 → 0.22.0 section. The upgrade has no migration and no adoption step, the configuration is unchanged, and rustbgpd stays at 0.79.0. The section covers:grafana/prometheus-alerts.yml, for the newPrefixdBlackholeReplacedon the newprefixd_blackhole_replaced_total{pop}counter and the rewordedexport_policytext ofPrefixdBlackholeNotExported;historicalfield, anddegradedhealth detail after the controller regains its fence;Its check heading is "Check the 0.22.0 upgrade", so the existing
#check-the-upgradelinks still reach the 0.21.0 section.In the CHANGELOG, the section gains a summary paragraph,
Upgrade notesandKnown limitations. The upgrade notes link the guide section, pinned toblob/v0.22.0as earlier releases were. The first Fixed entry now names thehistoricalfield and thedegradedhealth effect./openapi.jsontakesinfo.versionfromCARGO_PKG_VERSION. The upgrade proof saw it report0.22.0, as did/v1/health/detail,prefixd --versionandprefixdctl --version. The CLI reference example moved to 0.22.0, and nothing else current pinned 0.21.0.The section was reviewed against
git log v0.21.0..HEAD --oneline(22 commits):chore(branch): alignmerges left nothing behind, and nothing sits under 0.21.0.Gate
just gateran on the release candidate from 00:14:59 to 00:28:36 UTC 2026-10-22 and exited 0. It ran pinned to 16 CPUs:VITEST_MAX_WORKERS=8follows the shared-host advice in CONTRIBUTING. The run covered:cargo audit, clean apart from the documented RUSTSEC-2023-0071 exception;bun audit, with no vulnerabilities;just speakers.The edits after that run touch only the CHANGELOG and docs.
git diff --checkpasses, as does an affected-link check covering relative links, anchors and theblob/v0.22.0links.Fixture pins: rustbgpd
0.79.0@sha256:b2054d0ce98f3c8299b8de5be1920cd88a1ab2c85e02766927e487be0c60f8ff(source60cb5c99), the only entry in ci.yml's matrix. The rustbgpd speaker suites passed (12 and 4 tests), as did GoBGP (9 and 8).Upgrade proof (v0.21.0 → this branch)
Setup. The database was real 0.21.0 data. The released
ghcr.io/lance0/prefixd:0.21.0(sha256:e37a0224…3a017) ran with Postgres 16 and rustbgpd0.79.0@sha256:b2054d0c…, using the v0.21.0 checkout's Compose rustbgpd profile. It was isolated by project name, with unique container names, pinned CPUs and no host ports.The shipped config was kept except for two changes:
auth.mode: bearer, so the CLI could read health, and longer TTLs (limits and playbook steps), so rules outlived the window. All rows were in enforced mode:Upgrade. The new guide section was then followed as written:
pg_dump.prefixd.yamland playbooks.up -d --no-deps --no-build prefixd-rustbgpd, withPREFIXD_IMAGEset to a local image. rustbgpd was not touched.The local image is the repository Dockerfile's runtime stage, built from the locked release binaries of the gate run above (
cargo build --locked --release). This replaced a full multi-stage image build on the shared host. Prometheus and the dashboard were not part of the proof;just alertscovers the rules file.Outcome:
prefixdctl migrationslists 18.controller fence acquiredwas logged once, and the upgrade wrote no audit entries.prefixdctl statusshowedhealthy, daemon 0.79.0, database connected and peer observation connected. Health detail reportedblackhole_exports.historical: false./v1/readyreturnedready, andprefixd_controller_fence_activewas 1.repairing local announcement,reconciliation failed, WARN or ERROR lines.prefixd_unknown_local_routes{kind="flowspec"}stayed at 0.origin_mode, match, action parameters and expiry) is identical to the 0.21.0 baseline. The withdrawn row stayed withdrawn, with 0 pending withdrawals.Everything started for the proof was removed: containers, volumes, network and the local image.
The CHANGELOG date is 2026-10-22. Re-date it if the merge happens on a later UTC day.
Known limitations
These are stated in the CHANGELOG's Known limitations:
PrefixdBlackholeReplacedlatches: it keeps firing until prefixd restarts or the alert is silenced. It records a past replacement, not an active conflict.Release notes preview
scripts/release-notes.py 0.22.0exits 0. Its output follows.Release body
prefixd 0.22.0 lets operators choose the dashboard's display timezone, counts and alerts on unleased blackhole admissions that replaced an untracked local route, and marks blackhole export evidence retained from before a lost controller fence as historical so health, metrics and the interface no longer present it as current. It adds no migration, keeps rustbgpd 0.79.0 and loads an unchanged 0.21.0 configuration.
Upgrade notes
grafana/prometheus-alerts.ymlto your Prometheus, or recreate the Compose Prometheus. It addsPrefixdBlackholeReplacedon the newprefixd_blackhole_replaced_total{pop}counter and rewords theexport_policytext ofPrefixdBlackholeNotExported.export_evidenceand health detail'sspeaker.blackhole_exportsaddhistorical. After the controller loses and regains its fence,GET /v1/health/detailreportsdegradeduntil a fresh complete read replaces each retained blackhole's evidence. Automation that treatsdegradedas a database or speaker fault should readspeaker.blackhole_exports.historical./v1/readyis unchanged.Known limitations
PrefixdBlackholeReplacedlatches: the counter is local to the process, so the alert keeps firing until prefixd restarts or the alert is silenced. It records a past replacement, not an active conflict.Added
prefixd_blackhole_replaced_total{pop}and alert withPrefixdBlackholeReplaced. The alert latches historical replacement evidence until the process counter resets; admission and leased ownership behavior are unchanged.Changed
just alerts,just gateand a CI job. Nightly and main-push Interop runs no longer cancel each other; a newer PR commit still cancels its superseded Interop run.Fixed
export_evidenceandspeaker.blackhole_exportsreport it withhistorical: true, and health detail isdegradedwhile it remains after ownership returns. Detail preserves historical peer rows and their timestamp on a failed refresh; health and the interface no longer present them as current export. An observation that spans an ownership loss is discarded.prefixd_blackhole_export_peersorprefixd_blackhole_unexported, so a failed refresh after ownership returns cannot report the previous owner's committed peers or keepPrefixdBlackholeNotExportedfiring; it counts as a read error until a fresh complete read.