Skip to content

Commit 3a49e3c

Browse files
authored
elect, vip: fix incorrect metric_reader owner metrics (#637)
1 parent 98f32a2 commit 3a49e3c

File tree

5 files changed

+21
-12
lines changed

5 files changed

+21
-12
lines changed

pkg/balance/metricsreader/backend_reader.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,8 +556,6 @@ func (br *BackendReader) PreClose() {
556556
if br.election != nil {
557557
br.election.Close()
558558
}
559-
// pretend to be not owner
560-
br.isOwner.Store(false)
561559
}
562560

563561
func (br *BackendReader) Close() {

pkg/manager/elect/election.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,12 +287,14 @@ func (m *election) watchOwner(ctx context.Context, session *concurrency.Session,
287287
}
288288
}
289289

290-
// Close is typically called before graceful shutdown. It resigns but doesn't retire or wait for the new owner.
291-
// The caller has to decide if it should retire after graceful wait.
290+
// Close resigns and retires.
292291
func (m *election) Close() {
293292
if m.cancel != nil {
294293
m.cancel()
295294
m.cancel = nil
296295
}
297296
m.wg.Wait()
297+
if m.isOwner {
298+
m.onRetired()
299+
}
298300
}

pkg/manager/elect/election_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func TestElectOwner(t *testing.T) {
3333
ownerID := ts.getOwnerID()
3434
elec := ts.getElection(ownerID)
3535
elec.Close()
36-
ts.expectNoEvent(ownerID)
36+
ts.expectEvent(ownerID, eventTypeRetired)
3737
ownerID2 := ts.getOwnerID()
3838
require.NotEqual(t, ownerID, ownerID2)
3939
ts.expectEvent(ownerID2, eventTypeElected)
@@ -51,11 +51,10 @@ func TestElectOwner(t *testing.T) {
5151
{
5252
elec := ts.getElection("3")
5353
elec.Close()
54-
ts.expectNoEvent("3")
5554
ownerID := ts.getOwnerID()
5655
elec = ts.getElection(ownerID)
5756
elec.Close()
58-
ts.expectNoEvent(ownerID)
57+
ts.expectEvent(ownerID, eventTypeRetired)
5958
_, err := elec.GetOwnerID(context.Background())
6059
require.Error(t, err)
6160
}
@@ -159,4 +158,7 @@ func TestOwnerMetric(t *testing.T) {
159158
checkMetric("key", false)
160159
checkMetric("key2/1", true)
161160
checkMetric("key3/1", true)
161+
162+
elec3.Close()
163+
checkMetric("key3/1", false)
162164
}

pkg/manager/vip/manager.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package vip
66
import (
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 {
3132
var _ VIPManager = (*vipManager)(nil)
3233

3334
type 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

4042
func NewVIPManager(lg *zap.Logger, cfgGetter config.ConfigGetter) (*vipManager, error) {
@@ -62,6 +64,7 @@ func NewVIPManager(lg *zap.Logger, cfgGetter config.ConfigGetter) (*vipManager,
6264
func (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

8386
func (vm *vipManager) OnRetired() {
84-
vm.delVIP()
87+
if vm.delOnRetire.Load() {
88+
vm.delVIP()
89+
}
8590
}
8691

8792
func (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.
127132
func (vm *vipManager) PreClose() {
133+
vm.delOnRetire.Store(false)
128134
if vm.election != nil {
129135
vm.election.Close()
130136
}

pkg/manager/vip/manager_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ func TestNetworkOperation(t *testing.T) {
126126
cfgGetter: newMockConfigGetter(&config.Config{HA: config.HA{VirtualIP: "10.10.10.10/24", Interface: "eth0"}}),
127127
operation: operation,
128128
}
129+
vm.delOnRetire.Store(true)
129130
vm.election = newMockElection(ch, vm)
130131
childCtx, cancel := context.WithCancel(context.Background())
131132
vm.election.Start(childCtx)

0 commit comments

Comments
 (0)