Rate limiting the update of lastseen date for route.
This commit is contained in:
parent
2dfe7593ed
commit
735838a0f1
|
@ -15,6 +15,7 @@ import (
|
|||
"slices"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
xmaps "golang.org/x/exp/maps"
|
||||
"golang.org/x/net/dns/dnsmessage"
|
||||
|
@ -69,6 +70,9 @@ type AppConnector struct {
|
|||
|
||||
// queue provides ordering for update operations
|
||||
queue execqueue.ExecQueue
|
||||
|
||||
discoveredToUpdateDate map[string][]netip.Prefix
|
||||
discoveredLastUpdate time.Time
|
||||
}
|
||||
|
||||
// NewAppConnector creates a new AppConnector.
|
||||
|
@ -335,12 +339,17 @@ func (e *AppConnector) ObserveDNSResponse(res []byte) {
|
|||
// advertise each address we have learned for the routed domain, that
|
||||
// was not already known.
|
||||
var toAdvertise []netip.Prefix
|
||||
var toUpdateDate []netip.Prefix
|
||||
// var toUpdateDate []netip.Prefix
|
||||
for _, addr := range addrs {
|
||||
if !e.isAddrKnownLocked(domain, addr) {
|
||||
toAdvertise = append(toAdvertise, netip.PrefixFrom(addr, addr.BitLen()))
|
||||
} else {
|
||||
toUpdateDate = append(toUpdateDate, netip.PrefixFrom(addr, addr.BitLen()))
|
||||
if e.discoveredToUpdateDate == nil {
|
||||
e.discoveredToUpdateDate = make(map[string][]netip.Prefix)
|
||||
}
|
||||
e.discoveredToUpdateDate[domain] = append(e.discoveredToUpdateDate[domain], netip.PrefixFrom(addr, addr.BitLen()))
|
||||
slices.SortFunc(e.discoveredToUpdateDate[domain], func(i, j netip.Prefix) int { return i.Addr().Compare(j.Addr()) })
|
||||
slices.Compact(e.discoveredToUpdateDate[domain])
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -348,15 +357,34 @@ func (e *AppConnector) ObserveDNSResponse(res []byte) {
|
|||
// update the pm.currentroutes, then advertise those routes.
|
||||
// we might also able to do this in local backend's advertiseRoute method, doing the update one domain by one domain.
|
||||
// currentRouteInfo := nil
|
||||
routesToUpdate := append(toAdvertise, toUpdateDate...)
|
||||
|
||||
updateStore := false
|
||||
routeInfo := e.routeAdvertiser.ReadRouteInfoFromStore()
|
||||
if routeInfo.Discovered == nil {
|
||||
routeInfo.Discovered = make(map[string]*ipn.DatedRoute)
|
||||
if len(toAdvertise) != 0 {
|
||||
routeInfo.AddRoutesInDiscoveredForDomain(domain, toAdvertise)
|
||||
updateStore = true
|
||||
}
|
||||
routeInfo.UpdateRoutesInDiscoveredForDomain(domain, routesToUpdate)
|
||||
now := time.Now()
|
||||
if len(e.discoveredToUpdateDate) > 0 && now.Sub(e.discoveredLastUpdate) > 5*time.Minute {
|
||||
// fmt.Println("We did a date update to the existing routes") // Kevin debug
|
||||
// fmt.Println("The time now is: ", now, " The last update was; ", e.discoveredLastUpdate) // Kevin debug
|
||||
routeInfo.UpdateDatesForRoutesInDiscovered(e.discoveredToUpdateDate)
|
||||
e.discoveredToUpdateDate = make(map[string][]netip.Prefix)
|
||||
e.discoveredLastUpdate = now
|
||||
updateStore = true
|
||||
}
|
||||
// fmt.Println("The time I updated the date was: ", now) // Kevin debug
|
||||
// fmt.Println("Next time we update the date will be: ", now.Add(1*time.Minute)) // Kevin debug
|
||||
// fmt.Println("The last update was; ", e.discoveredLastUpdate)// Kevin debug
|
||||
// fmt.Println("discoveredToUpdate: ", e.discoveredToUpdateDate)// Kevin debug
|
||||
outDated := routeInfo.OutDatedRoutesInDiscoveredForDomain(domain)
|
||||
e.routeAdvertiser.UpdateRoutesInfoToStore(routeInfo)
|
||||
// fmt.Println("Route infos after dns update: ", e.routeAdvertiser.ReadRouteInfoFromStore())
|
||||
if len(outDated) != 0 {
|
||||
updateStore = true
|
||||
}
|
||||
if updateStore {
|
||||
e.routeAdvertiser.UpdateRoutesInfoToStore(routeInfo)
|
||||
}
|
||||
// fmt.Println("Route infos after dns update: ", e.routeAdvertiser.ReadRouteInfoFromStore()) // Kevin debug
|
||||
e.scheduleAdvertisement(domain, toAdvertise...)
|
||||
e.scheduleUndvertisement(domain, outDated...)
|
||||
}
|
||||
|
|
|
@ -53,7 +53,10 @@ func (pm *profileManager) CurrentRoutes() *ipn.RouteInfo {
|
|||
|
||||
func (pm *profileManager) SetCurrentRoutes(in *ipn.RouteInfo) error {
|
||||
pm.currentRoutes = in
|
||||
return pm.WriteRoutesForCurrentProfile()
|
||||
if err := pm.WriteRoutesForCurrentProfile(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (pm *profileManager) WriteState(id ipn.StateKey, val []byte) error {
|
||||
|
|
19
ipn/prefs.go
19
ipn/prefs.go
|
@ -960,11 +960,10 @@ type RouteInfo struct {
|
|||
Discovered map[string]*DatedRoute
|
||||
}
|
||||
|
||||
func (r RouteInfo) UpdateRoutesInDiscoveredForDomain(domain string, addrs []netip.Prefix) {
|
||||
func (r RouteInfo) AddRoutesInDiscoveredForDomain(domain string, addrs []netip.Prefix) {
|
||||
dr, hasKey := r.Discovered[domain]
|
||||
fmt.Println("FRAN URIDFD", hasKey, dr, dr.Routes)
|
||||
if !hasKey || dr == nil || dr.Routes == nil {
|
||||
newDatedRoutes := &DatedRoute{make(map[netip.Prefix]time.Time), time.Now().Truncate(1 * time.Hour)}
|
||||
newDatedRoutes := &DatedRoute{make(map[netip.Prefix]time.Time), time.Now()}
|
||||
newDatedRoutes.addAddrsToDatedRoute(addrs)
|
||||
r.Discovered[domain] = newDatedRoutes
|
||||
return
|
||||
|
@ -977,11 +976,19 @@ func (r RouteInfo) UpdateRoutesInDiscoveredForDomain(domain string, addrs []neti
|
|||
return
|
||||
}
|
||||
|
||||
func (r RouteInfo) UpdateDatesForRoutesInDiscovered(toUpdate map[string][]netip.Prefix) {
|
||||
for domain, addrs := range toUpdate {
|
||||
for _, addr := range addrs {
|
||||
r.Discovered[domain].Routes[addr] = time.Now()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (r RouteInfo) OutDatedRoutesInDiscoveredForDomain(domain string) []netip.Prefix {
|
||||
dr, hasKey := r.Discovered[domain]
|
||||
var outdate []netip.Prefix
|
||||
now := time.Now()
|
||||
if !hasKey || dr == nil || dr.Routes == nil || now.Sub(dr.LastCleanUp) < 360 {
|
||||
if !hasKey || dr == nil || dr.Routes == nil || now.Sub(dr.LastCleanUp) < 360*time.Hour {
|
||||
return nil
|
||||
}
|
||||
for addr, date := range dr.Routes {
|
||||
|
@ -992,7 +999,7 @@ func (r RouteInfo) OutDatedRoutesInDiscoveredForDomain(domain string) []netip.Pr
|
|||
}
|
||||
}
|
||||
r.Discovered[domain] = dr
|
||||
dr.LastCleanUp = time.Now().Truncate(1 * time.Hour)
|
||||
dr.LastCleanUp = time.Now()
|
||||
return outdate
|
||||
}
|
||||
|
||||
|
@ -1018,7 +1025,7 @@ func (d *DatedRoute) String() string {
|
|||
}
|
||||
|
||||
func (d *DatedRoute) addAddrsToDatedRoute(addrs []netip.Prefix) {
|
||||
time := time.Now().Truncate(1 * time.Hour)
|
||||
time := time.Now()
|
||||
for _, addr := range addrs {
|
||||
d.Routes[addr] = time
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue