shutdown fix

This commit is contained in:
ston1th 2021-09-26 21:31:05 +02:00
commit 279fba0c57
4 changed files with 39 additions and 11 deletions

2
TODO
View file

@ -2,4 +2,6 @@ VIP for haproxy-lb
* take from pool? * take from pool?
* extra config? * extra config?
cleanup pkg/vip
test api in followers test api in followers

View file

@ -84,8 +84,8 @@ func main() {
log.Info("haproxy-lb shutdown", "signal", s.String()) log.Info("haproxy-lb shutdown", "signal", s.String())
go func() { go func() {
select { select {
case <-time.After(time.Second * 10): case <-time.After(time.Second * 20):
log.Error(errors.New("shutdown took longer than 10 seconds"), "shutdown forced") log.Error(errors.New("shutdown took longer than 20 seconds"), "shutdown forced")
case <-sigs: case <-sigs:
log.Error(errors.New("force shutdown triggerd"), "shutdown forced") log.Error(errors.New("force shutdown triggerd"), "shutdown forced")
} }

View file

@ -129,12 +129,7 @@ func NewLBController(cfg *config.Config, srv *api.Server, log logr.Logger) (call
} }
}, },
Cleanup: func(ctx context.Context, cc cluster.CallbackContext) { Cleanup: func(ctx context.Context, cc cluster.CallbackContext) {
db := db.New(cc) deleteIPs(cc, n, n.GetIPs())
ips, err := db.GetIPs()
if err != nil {
return
}
deleteIPs(cc, n, ips)
}, },
} }
return return

View file

@ -2,8 +2,10 @@ package vip
import ( import (
"errors" "errors"
"github.com/vishvananda/netlink"
"net" "net"
"sync"
"github.com/vishvananda/netlink"
) )
var ErrNoDefaultInterface = errors.New("no default interface found") var ErrNoDefaultInterface = errors.New("no default interface found")
@ -25,6 +27,8 @@ func DefaultInterface() (iface string, err error) {
} }
type Network struct { type Network struct {
sync.Mutex
m map[string]struct{}
iface string iface string
label string label string
link netlink.Link link netlink.Link
@ -45,7 +49,12 @@ func NewNetworkWithLabel(iface, label string) (n *Network, err error) {
if err != nil { if err != nil {
return return
} }
n = &Network{iface, label, link} n = &Network{
m: make(map[string]struct{}),
iface: iface,
label: label,
link: link,
}
return return
} }
@ -67,6 +76,8 @@ func (n *Network) HasIP(a *netlink.Addr) bool {
} }
func (n *Network) AddIP(cidr string) error { func (n *Network) AddIP(cidr string) error {
n.Lock()
defer n.Unlock()
addr, err := netlink.ParseAddr(cidr) addr, err := netlink.ParseAddr(cidr)
if err != nil { if err != nil {
return err return err
@ -81,10 +92,13 @@ func (n *Network) AddIP(cidr string) error {
if err != nil { if err != nil {
return err return err
} }
n.m[cidr] = struct{}{}
return ARPSendGratuitous(cidr, n.iface) return ARPSendGratuitous(cidr, n.iface)
} }
func (n *Network) DeleteIP(cidr string) error { func (n *Network) DeleteIP(cidr string) error {
n.Lock()
defer n.Unlock()
addr, err := netlink.ParseAddr(cidr) addr, err := netlink.ParseAddr(cidr)
if err != nil { if err != nil {
return err return err
@ -92,5 +106,22 @@ func (n *Network) DeleteIP(cidr string) error {
if !n.HasIP(addr) { if !n.HasIP(addr) {
return nil return nil
} }
return netlink.AddrDel(n.link, addr) err = netlink.AddrDel(n.link, addr)
if err != nil {
return err
}
delete(n.m, cidr)
return nil
}
func (n *Network) GetIPs() (cidrs []string) {
n.Lock()
defer n.Unlock()
cidrs = make([]string, len(n.m))
c := 0
for k := range n.m {
cidrs[c] = k
c++
}
return
} }