@@ -6,6 +6,7 @@ package vip
66import (
77 "context"
88 "net"
9+ "sync/atomic"
910
1011 "github.com/pingcap/tiproxy/lib/config"
1112 "github.com/pingcap/tiproxy/pkg/manager/elect"
@@ -31,10 +32,11 @@ type VIPManager interface {
3132var _ VIPManager = (* vipManager )(nil )
3233
3334type vipManager struct {
34- operation NetworkOperation
35- cfgGetter config.ConfigGetter
36- election elect.Election
37- lg * zap.Logger
35+ operation NetworkOperation
36+ cfgGetter config.ConfigGetter
37+ election elect.Election
38+ lg * zap.Logger
39+ delOnRetire atomic.Bool
3840}
3941
4042func NewVIPManager (lg * zap.Logger , cfgGetter config.ConfigGetter ) (* vipManager , error ) {
@@ -62,6 +64,7 @@ func NewVIPManager(lg *zap.Logger, cfgGetter config.ConfigGetter) (*vipManager,
6264func (vm * vipManager ) Start (ctx context.Context , etcdCli * clientv3.Client ) error {
6365 // This node may have bound the VIP before last failure.
6466 vm .delVIP ()
67+ vm .delOnRetire .Store (true )
6568
6669 cfg := vm .cfgGetter .GetConfig ()
6770 ip , port , _ , err := cfg .GetIPPort ()
@@ -81,7 +84,9 @@ func (vm *vipManager) OnElected() {
8184}
8285
8386func (vm * vipManager ) OnRetired () {
84- vm .delVIP ()
87+ if vm .delOnRetire .Load () {
88+ vm .delVIP ()
89+ }
8590}
8691
8792func (vm * vipManager ) addVIP () {
@@ -125,6 +130,7 @@ func (vm *vipManager) delVIP() {
125130// PreClose resigns the owner but doesn't delete the VIP.
126131// It makes use of the graceful-wait time to wait for the new owner to shorten the failover time.
127132func (vm * vipManager ) PreClose () {
133+ vm .delOnRetire .Store (false )
128134 if vm .election != nil {
129135 vm .election .Close ()
130136 }
0 commit comments