engine: more performance improvements
This commit is contained in:
+30
-41
@@ -5,6 +5,7 @@ package engine
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"net"
|
||||
"os"
|
||||
"os/exec"
|
||||
@@ -52,38 +53,6 @@ func (r *sourceMACResolver) Resolve(ip net.IP) net.HardwareAddr {
|
||||
return nil
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
r.mu.RLock()
|
||||
ifaceRefreshDue := now.Sub(r.lastIfaceRefresh) > ifaceCacheTTL
|
||||
arpRefreshDue := now.Sub(r.lastARPRefresh) > arpCacheTTL
|
||||
ndpRefreshDue := now.Sub(r.lastNDPRefresh) > ndpCacheTTL
|
||||
if mac := r.ifaceByIP[ipKey]; len(mac) != 0 {
|
||||
out := append(net.HardwareAddr(nil), mac...)
|
||||
r.mu.RUnlock()
|
||||
return out
|
||||
}
|
||||
if mac := r.arpByIP[ipKey]; len(mac) != 0 && !arpRefreshDue {
|
||||
out := append(net.HardwareAddr(nil), mac...)
|
||||
r.mu.RUnlock()
|
||||
return out
|
||||
}
|
||||
if mac := r.ndpByIP[ipKey]; len(mac) != 0 && !ndpRefreshDue {
|
||||
out := append(net.HardwareAddr(nil), mac...)
|
||||
r.mu.RUnlock()
|
||||
return out
|
||||
}
|
||||
r.mu.RUnlock()
|
||||
|
||||
if ifaceRefreshDue {
|
||||
r.refreshIfaceCache(now)
|
||||
}
|
||||
if arpRefreshDue {
|
||||
r.refreshARPCache(now)
|
||||
}
|
||||
if ndpRefreshDue {
|
||||
r.refreshNDPCache(now)
|
||||
}
|
||||
|
||||
r.mu.RLock()
|
||||
defer r.mu.RUnlock()
|
||||
if mac := r.ifaceByIP[ipKey]; len(mac) != 0 {
|
||||
@@ -95,18 +64,38 @@ func (r *sourceMACResolver) Resolve(ip net.IP) net.HardwareAddr {
|
||||
if mac := r.ndpByIP[ipKey]; len(mac) != 0 {
|
||||
return append(net.HardwareAddr(nil), mac...)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// On-demand IPv6 neighbor lookup via route-netlink as a last fast path.
|
||||
if ip.To4() == nil {
|
||||
if mac, ok := lookupNeighborMACNetlink(ip); ok {
|
||||
out := append(net.HardwareAddr(nil), mac...)
|
||||
r.mu.Lock()
|
||||
r.ndpByIP[ipKey] = append(net.HardwareAddr(nil), mac...)
|
||||
r.mu.Unlock()
|
||||
return out
|
||||
func (r *sourceMACResolver) Run(ctx context.Context) {
|
||||
r.refreshAll(time.Now())
|
||||
ticker := time.NewTicker(arpCacheTTL)
|
||||
defer ticker.Stop()
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case now := <-ticker.C:
|
||||
r.refreshAll(now)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *sourceMACResolver) refreshAll(now time.Time) {
|
||||
r.mu.RLock()
|
||||
ifaceRefreshDue := now.Sub(r.lastIfaceRefresh) > ifaceCacheTTL
|
||||
arpRefreshDue := now.Sub(r.lastARPRefresh) > arpCacheTTL
|
||||
ndpRefreshDue := now.Sub(r.lastNDPRefresh) > ndpCacheTTL
|
||||
r.mu.RUnlock()
|
||||
if ifaceRefreshDue {
|
||||
r.refreshIfaceCache(now)
|
||||
}
|
||||
if arpRefreshDue {
|
||||
r.refreshARPCache(now)
|
||||
}
|
||||
if ndpRefreshDue {
|
||||
r.refreshNDPCache(now)
|
||||
}
|
||||
}
|
||||
|
||||
func (r *sourceMACResolver) refreshIfaceCache(now time.Time) {
|
||||
|
||||
Reference in New Issue
Block a user