Skip to content

server: withdraw stale paths on RR cluster loops - #3586

Open
rastislavs wants to merge 1 commit into
osrg:masterfrom
rastislavs:rr-self-reflect-fix
Open

server: withdraw stale paths on RR cluster loops#3586
rastislavs wants to merge 1 commit into
osrg:masterfrom
rastislavs:rr-self-reflect-fix

Conversation

@rastislavs

Copy link
Copy Markdown
Contributor

This fixes an issue with stale paths when two route reflectors originate the same prefix and reflect routes to one another.

After they then both withdraw the local path, they can end up in a state with stale reflected routes on both RRs, even when none of them is advertising it anymore. See the attached reproducer: rr-self-reflect-repro.sh

RR-A originates 10.62.0.0/24
RR-B originates 10.62.0.0/24 before RR-A withdraws
--- RR-A global RIB
*> 10.62.0.0/24         0.0.0.0                                   00:00:04   [{Origin: ?}]
*  10.62.0.0/24         127.0.0.1                                 00:00:02   [{Origin: ?} {LocalPref: 100} {Originator: 10.254.0.9} {ClusterList: [255.0.0.2]}]
--- RR-B global RIB
*> 10.62.0.0/24         0.0.0.0                                   00:00:02   [{Origin: ?}]
*  10.62.0.0/24         127.0.0.1                                 00:00:04   [{Origin: ?} {LocalPref: 100} {Originator: 10.254.0.8} {ClusterList: [255.0.0.2]}]
RR-A withdraws its local path
--- RR-A global RIB
*> 10.62.0.0/24         127.0.0.1                                 00:00:04   [{Origin: ?} {LocalPref: 100} {Originator: 10.254.0.9} {ClusterList: [255.0.0.2]}]
--- RR-B global RIB
*> 10.62.0.0/24         0.0.0.0                                   00:00:04   [{Origin: ?}]
*  10.62.0.0/24         127.0.0.1                                 00:00:06   [{Origin: ?} {LocalPref: 100} {Originator: 10.254.0.8} {ClusterList: [255.0.0.2]}]
RR-B withdraws its local path
--- RR-A global RIB
*> 10.62.0.0/24         127.0.0.1                                 00:00:06   [{Origin: ?} {LocalPref: 100} {Originator: 10.254.0.9} {ClusterList: [255.0.0.2]}]
--- RR-B global RIB
*> 10.62.0.0/24         127.0.0.1                                 00:00:08   [{Origin: ?} {LocalPref: 100} {Originator: 10.254.0.8} {ClusterList: [255.0.0.2]}]
reproduced: both RRs retain reciprocal reflected paths after both local withdrawals

When a newly selected path contains the local cluster ID,
filterpath suppresses the reflected advertisement.
If the previous best path was already advertised to that RR client,
returning no update leaves the old route stale on the peer.

To fix this, send an explicit withdrawal for the previously
advertised path before rejecting the looped path.
@rastislavs
rastislavs marked this pull request as ready for review September 2, 2026 12:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant