mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/kube-vip/kube-vip.git
synced 2026-09-20 08:03:47 +08:00
* fix(vip): synchronize shared datapath state Serialize the interface link cache, route tracker and address configuration so concurrent Services cannot corrupt shared state or deadlock on nested address locks. Signed-off-by: Marcel Fest <marcel.fest@telekom.de> * fix: dhcp panic and leak potential Signed-off-by: Marcel Fest <marcel.fest@telekom.de> --------- Signed-off-by: Marcel Fest <marcel.fest@telekom.de>
60 lines
953 B
Go
60 lines
953 B
Go
package networkinterface
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/vishvananda/netlink"
|
|
)
|
|
|
|
type Manager struct {
|
|
lock sync.Mutex
|
|
interfaces map[string]*Link
|
|
}
|
|
|
|
type Link struct {
|
|
mu sync.Mutex
|
|
intf netlink.Link
|
|
}
|
|
|
|
func NewManager() *Manager {
|
|
return &Manager{
|
|
interfaces: make(map[string]*Link),
|
|
}
|
|
}
|
|
|
|
func (m *Manager) Get(intf netlink.Link) *Link {
|
|
if intf == nil || intf.Attrs() == nil {
|
|
return nil
|
|
}
|
|
attrs := intf.Attrs()
|
|
|
|
m.lock.Lock()
|
|
defer m.lock.Unlock()
|
|
if link, ok := m.interfaces[attrs.Name]; ok {
|
|
link.replace(intf)
|
|
return link
|
|
}
|
|
|
|
link := &Link{intf: intf}
|
|
m.interfaces[attrs.Name] = link
|
|
return link
|
|
}
|
|
|
|
func (l *Link) WithInterface(run func(netlink.Link) error) error {
|
|
l.mu.Lock()
|
|
defer l.mu.Unlock()
|
|
return run(l.intf)
|
|
}
|
|
|
|
func (l *Link) replace(intf netlink.Link) {
|
|
l.mu.Lock()
|
|
defer l.mu.Unlock()
|
|
l.intf = intf
|
|
}
|
|
|
|
func (m *Manager) Len() int {
|
|
m.lock.Lock()
|
|
defer m.lock.Unlock()
|
|
return len(m.interfaces)
|
|
}
|