From 714e7f6f4e85ec0c2dfc22c1b00b18837f278a1e Mon Sep 17 00:00:00 2001 From: sneak Date: Mon, 19 Oct 2026 10:27:45 +0000 Subject: [PATCH] Let bgp_peer_count drop to 0 (closes #92) SetBGPPeerCount stored a count only when it was above 0, so once the last peer's session ended, /api/v1/stats kept reporting the previous count. It now stores every count from 0 up; a negative count, or one too large for the int32 it is kept in, is still not stored. Model: opus-5-5 --- internal/metrics/metrics.go | 2 +- internal/metrics/metrics_test.go | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index ad04309..657d042 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -168,7 +168,7 @@ func (t *Tracker) RecordWithdrawal() { // SetBGPPeerCount updates the current BGP peer count func (t *Tracker) SetBGPPeerCount(count int) { // BGP peer count is always small (< 1000), so int32 is safe - if count > 0 && count < 1<<31 { + if count >= 0 && count < 1<<31 { t.bgpPeerCount.Store(int32(count)) } } diff --git a/internal/metrics/metrics_test.go b/internal/metrics/metrics_test.go index c301122..38ccae7 100644 --- a/internal/metrics/metrics_test.go +++ b/internal/metrics/metrics_test.go @@ -25,3 +25,18 @@ func TestReconnectCount(t *testing.T) { t.Fatalf("reconnect count = %d, want %d", got, wantReconnects) } } + +// TestBGPPeerCountDropsToZero sets a peer count of 1 and then 0, the way the +// streamer does when the last peer's session ends, and expects 0 back. +func TestBGPPeerCountDropsToZero(t *testing.T) { + t.Parallel() + + tracker := metrics.New() + + tracker.SetBGPPeerCount(1) + tracker.SetBGPPeerCount(0) + + if got := tracker.GetBGPPeerCount(); got != 0 { + t.Fatalf("peer count = %d after setting 0, want 0", got) + } +} -- 2.54.0