Repository navigation
chore(release): prepare v0.23.1 - #350
Merged
Merged
Conversation
lance0
marked this pull request as ready for review
October 26, 2026 16:26
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 v0.23.1 patch release from
mainat 1b04148. It covers the two changes since v0.23.0: #348 (theselection_deferredunexported reason) and #349 (Graceful Restart off on the example rustbgpd neighbor).This PR changes:
Cargo.toml,Cargo.lockandfuzz/Cargo.lock: the version is 0.23.1. Only theprefixdentry changed in each lockfile.CHANGELOG.md: the[0.23.1] - 2026-10-26section. It adds a summary paragraph, Upgrade notes that link the new guide section with absolutev0.23.1URLs, and Known limitations. The existing Changed and Fixed entries list each of the two changes once.docs/how-to/upgrading.md: a newv0.23.0 → 0.23.1section in the 0.22.1 layout, and an updated intro. It links the existing Graceful Restart note underrustbgpd v0.80rather than repeating it. Existing anchors are unchanged.README.md: the Status line names v0.23.1 and still says it needs rustbgpd v0.80.0 or later.docs/reference/cli.md: the version example is 0.23.1.Checked from source and history:
git diff --stat v0.23.0 origin/main -- migrations/is empty.grafana/prometheus-alerts.ymlchanged:PrefixdBlackholeNotExportedgains theselection_deferredhint and a comment, and its window stays at 5m. The guide tells operators to copy it.prefixd.yamlis unchanged. Theselection_deferredwarning lives in the in-memory export snapshot, not the database, so a downgrade to 0.23.0 needs no data step.prefixd_blackhole_unexported{reason}is pre-registered for every reason inUNEXPORTED_REASONSat startup, so the new label is exported at zero before any blackhole exists.Preconditions
just gateIt exited 0 on the first run. No stage was rerun, and no Docker create or stop timed out. It ran on the release tree before two CHANGELOG wording changes: one to the summary paragraph, and a follow-up commit that limits Known limitations to released rustbgpd behaviour. Both are prose only;
git diff --check, the anchor check andscripts/release-notes.py 0.23.1passed after each. Results by stage:selection_deferredcases, reported SUCCESS.-D warnings.cargo +1.89.0 checkpassed for all three feature sets.cargo auditpassed on both lockfiles. It ignores only RUSTSEC-2023-0071, as CI does.bun auditfound no vulnerabilities.cargo deny: advisories, bans, licenses and sources ok.integration_e2e9/9 andintegration_gobgp11/11.integration_rustbgpd15/15 andintegration_rustbgpd_peer4/4.integration_rustbgpd15/15 andintegration_rustbgpd_peer4/4.Fixture pins
rustbgpd
ghcr.io/lance0/rustbgpd:0.80.0@sha256:9945c2f8cc6fabf73d408018a4aa6cb50fe5095bd7d8bbf28d1bad847ff0e9d8rustbgpd
ghcr.io/lance0/rustbgpd:0.80.1@sha256:a7a6c4533ba0976f73525ef4d932ad04ef1b034115dc684511fd2679c02513f1These two match ci.yml's rustbgpd matrix,
["0.80.0", "0.80.1"]. Compose pins the 0.80.1 digest.GoBGP
jauderho/gobgp:latest@sha256:42b8d0017237e388c55936efe1f23632365b24a31751f6e8815f93e12c4d18c2(gobgpd 4.10.0)Upgrade proof: 0.23.0 → 0.23.1
I followed the new guide section's Compose steps as written.
The proof ran as a dedicated Compose project with the
rustbgpdprofile. Every container was pinned to cpuset 24-31,56-63 and had a unique name. The project started from the v0.23.0 tag's Compose file and configuration, in enforced mode with bearer auth and longer TTLs. It ran:ghcr.io/lance0/prefixd:0.23.0@sha256:98b7ec61432411290b92eb02de67d8586b7b416e5d6ac84f061570831bd1e24fpostgres:16-alpineSeed on 0.23.0.
The result was 4 active mitigations (2 manual, 2 detector), 1 withdrawn, 0 pending withdrawals and 4 FlowSpec routes in rustbgpd. Health was
healthyat 0.23.0. Blackholes are off in the shipped configuration, so none was seeded.Baseline. I captured:
rbgp flowspec received.I also took a
pg_dumpand a/metricssnapshot.Negative control. 0.23.0's
/metricsexported 11prefixd_blackhole_unexportedreasons, fromexact_export_rejectedtopending, and noselection_deferredseries.Replace the controller (guide steps 2–4). I switched the checkout to the candidate tree, keeping the operator configuration edits. Then I ran
up -d --no-deps --no-build prefixd-rustbgpdwith the 0.23.1 build. That image is the repository Dockerfile's runtime stage around the gate's locked release binaries, which reportprefixd 0.23.1andprefixdctl 0.23.1. rustbgpd kept running.Results with 0.23.1.
/metricsshowedprefixd_blackhole_unexported{reason="selection_deferred"} 0.versions: [1, ..., 18], andprefixdctl migrationslisted the same 18 rows, all with their original 0.23.0 timestamps.GET /v1/health/detailwashealthywith version 0.23.1, andunexportedwas empty.prefixdctl statusshowed daemon 0.80.1 ready and peer observation connected./openapi.jsonreportedinfo.version0.23.1, andprefixd --versionprintedprefixd 0.23.1.reconciliation_repairs_totalwas 0/0 andunknown_local_routes{kind="flowspec"}was 0. The controller log had no repair, WARN, ERROR or failure lines.prefixdctl speaker list-routeslisted the same 4 rules as the active mitigations.Speaker restart with the new example config. This step goes beyond the checklist. I recreated rustbgpd from the candidate tree, which now reads
graceful_restart = falseon the placeholder neighbor. About 3 s later, 0.23.1 loggedrepairing local announcementexactly once for each of the 4 active IDs.reconciliation_repairs_total{status="success"}went to 4, with no errors. A few seconds after the replay, the normalized RIB, includingselected: trueon all 4 routes, matched the baseline byte for byte. In the 0.23.0 proof, the same restart with the old example config left the replayed routesselected: falsefor at least the first minute. Afterwards, health washealthyandselection_deferredwas 0.Teardown: I removed every container, volume and network of the proof project, and the candidate image.
Release-notes preview (
scripts/release-notes.py 0.23.1)Known limitations
The limitations are as stated in the notes above. New in this release:
gr_restart_timeexpires (120 s by default).MarkReplayCompletedoes not end the hold. Disable Graceful Restart on peers that never come up.The 0.23.0 list otherwise still applies.
The CHANGELOG date is 2026-10-26 UTC. Correct it if this merges on a later UTC day.