From 2682343deac42e6384f915dd5a1cde0154508019 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Tue, 27 Aug 2019 15:46:32 +0900 Subject: fix duplicated local path id bug Fix a bug that the same path id is assigned to two paths. The bug happens in the following way: 1. a new path is assigned to a local path id. 2. an import policy dropping the path from the master rib is added and execute softreset in. 3. the path still exists in the adj but doesn't in the master. the path id was freed (marked as unused). 5. a new path with the same prefix comes from another peer. The same id is assigned to the new path. 6 deleted the policy and execute softreset in. 7 there are two paths in the master with the same path id. This path guarantees that only when a path is removed in the adj, the id for path is freed. Note that this doesn't fatten Path strcuture, which should be avoided for any reason. Signed-off-by: FUJITA Tomonori --- internal/pkg/table/table.go | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'internal/pkg/table/table.go') diff --git a/internal/pkg/table/table.go b/internal/pkg/table/table.go index c7e505cc..9a9bdd8b 100644 --- a/internal/pkg/table/table.go +++ b/internal/pkg/table/table.go @@ -17,6 +17,7 @@ package table import ( "fmt" + "math/bits" "net" "strings" "unsafe" @@ -118,6 +119,13 @@ func (t *Table) deleteRTCPathsByVrf(vrf *Vrf, vrfs map[string]*Vrf) []*Path { } func (t *Table) deleteDest(dest *Destination) { + count := 0 + for _, v := range dest.localIdMap.bitmap { + count += bits.OnesCount64(v) + } + if len(dest.localIdMap.bitmap) != 0 && count != 1 { + return + } destinations := t.GetDestinations() delete(destinations, t.tableKey(dest.GetNlri())) if len(destinations) == 0 { -- cgit v1.2.3