Skip to content
Snippets Groups Projects
Unverified Commit 97043de5 authored by takt's avatar takt Committed by GitHub
Browse files

Merge pull request #60 from bio-routing/feature/metrics

Adding route count to route table
parents fd1ccf16 9d775325
No related branches found
No related tags found
No related merge requests found
...@@ -2,6 +2,7 @@ package routingtable ...@@ -2,6 +2,7 @@ package routingtable
import ( import (
"sync" "sync"
"sync/atomic"
"github.com/bio-routing/bio-rd/net" "github.com/bio-routing/bio-rd/net"
"github.com/bio-routing/bio-rd/route" "github.com/bio-routing/bio-rd/route"
...@@ -9,8 +10,9 @@ import ( ...@@ -9,8 +10,9 @@ import (
// RoutingTable is a binary trie that stores prefixes and their paths // RoutingTable is a binary trie that stores prefixes and their paths
type RoutingTable struct { type RoutingTable struct {
root *node routeCount int64
mu sync.RWMutex root *node
mu sync.RWMutex
} }
// NewRoutingTable creates a new routing table // NewRoutingTable creates a new routing table
...@@ -18,6 +20,11 @@ func NewRoutingTable() *RoutingTable { ...@@ -18,6 +20,11 @@ func NewRoutingTable() *RoutingTable {
return &RoutingTable{} return &RoutingTable{}
} }
// GetRouteCount gets the amount of stored routes
func (rt *RoutingTable) GetRouteCount() int64 {
return atomic.LoadInt64(&rt.routeCount)
}
// AddPath adds a path to the routing table // AddPath adds a path to the routing table
func (rt *RoutingTable) AddPath(pfx net.Prefix, p *route.Path) error { func (rt *RoutingTable) AddPath(pfx net.Prefix, p *route.Path) error {
rt.mu.Lock() rt.mu.Lock()
...@@ -29,6 +36,7 @@ func (rt *RoutingTable) AddPath(pfx net.Prefix, p *route.Path) error { ...@@ -29,6 +36,7 @@ func (rt *RoutingTable) AddPath(pfx net.Prefix, p *route.Path) error {
func (rt *RoutingTable) addPath(pfx net.Prefix, p *route.Path) error { func (rt *RoutingTable) addPath(pfx net.Prefix, p *route.Path) error {
if rt.root == nil { if rt.root == nil {
rt.root = newNode(pfx, p, pfx.Pfxlen(), false) rt.root = newNode(pfx, p, pfx.Pfxlen(), false)
atomic.AddInt64(&rt.routeCount, 1)
return nil return nil
} }
...@@ -55,11 +63,13 @@ func (rt *RoutingTable) ReplacePath(pfx net.Prefix, p *route.Path) []*route.Path ...@@ -55,11 +63,13 @@ func (rt *RoutingTable) ReplacePath(pfx net.Prefix, p *route.Path) []*route.Path
} }
// RemovePath removes a path from the trie // RemovePath removes a path from the trie
func (rt *RoutingTable) RemovePath(pfx net.Prefix, p *route.Path) bool { func (rt *RoutingTable) RemovePath(pfx net.Prefix, p *route.Path) {
rt.mu.Lock() rt.mu.Lock()
defer rt.mu.Unlock() defer rt.mu.Unlock()
return rt.removePath(pfx, p) if rt.removePath(pfx, p) {
atomic.AddInt64(&rt.routeCount, -1)
}
} }
func (rt *RoutingTable) removePath(pfx net.Prefix, p *route.Path) bool { func (rt *RoutingTable) removePath(pfx net.Prefix, p *route.Path) bool {
......
...@@ -27,7 +27,7 @@ func newNode(pfx net.Prefix, path *route.Path, skip uint8, dummy bool) *node { ...@@ -27,7 +27,7 @@ func newNode(pfx net.Prefix, path *route.Path, skip uint8, dummy bool) *node {
return n return n
} }
func (n *node) removePath(pfx net.Prefix, p *route.Path) (success bool) { func (n *node) removePath(pfx net.Prefix, p *route.Path) (final bool) {
if n == nil { if n == nil {
return false return false
} }
...@@ -37,14 +37,13 @@ func (n *node) removePath(pfx net.Prefix, p *route.Path) (success bool) { ...@@ -37,14 +37,13 @@ func (n *node) removePath(pfx net.Prefix, p *route.Path) (success bool) {
return return
} }
nPaths := len(n.route.Paths())
nPathsAfterDel := n.route.RemovePath(p) nPathsAfterDel := n.route.RemovePath(p)
if len(n.route.Paths()) == 0 { if len(n.route.Paths()) == 0 {
// FIXME: Can this node actually be removed from the trie entirely? // FIXME: Can this node actually be removed from the trie entirely?
n.dummy = true n.dummy = true
} }
return nPathsAfterDel < nPaths return nPathsAfterDel == 0
} }
b := getBitUint32(pfx.Addr(), n.route.Pfxlen()+1) b := getBitUint32(pfx.Addr(), n.route.Pfxlen()+1)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment