1
- /**
2
- * Tencent is pleased to support the open source community by making Polaris available.
3
- *
4
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
5
- *
6
- * Licensed under the BSD 3-Clause License (the "License");
7
- * you may not use this file except in compliance with the License.
8
- * You may obtain a copy of the License at
9
- *
10
- * https://opensource.org/licenses/BSD-3-Clause
11
- *
12
- * Unless required by applicable law or agreed to in writing, software distributed
13
- * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
14
- * CONDITIONS OF ANY KIND, either express or implied. See the License for the
15
- * specific language governing permissions and limitations under the License.
16
- */
17
-
18
1
package postgresql
19
2
20
3
import (
21
4
"context"
22
5
"database/sql"
23
6
"fmt"
24
- "sync"
25
- "sync/atomic"
26
- "time"
27
-
28
- _ "github.com/lib/pq"
29
7
"github.com/polarismesh/polaris/common/eventhub"
30
8
"github.com/polarismesh/polaris/common/log"
31
9
"github.com/polarismesh/polaris/common/model"
32
10
"github.com/polarismesh/polaris/common/utils"
33
11
"github.com/polarismesh/polaris/store"
12
+ "sync"
13
+ "sync/atomic"
14
+ "time"
15
+
16
+ _ "github.com/lib/pq"
34
17
)
35
18
36
19
const (
@@ -73,13 +56,16 @@ type leaderElectionStore struct {
73
56
}
74
57
75
58
// CreateLeaderElection insert election key into leader table
76
- func (l leaderElectionStore ) CreateLeaderElection (key string ) error {
59
+ func (l * leaderElectionStore ) CreateLeaderElection (key string ) error {
77
60
log .Debugf ("[Store][database] create leader election (%s)" , key )
78
61
79
62
return l .master .processWithTransaction ("createLeaderElection" , func (tx * BaseTx ) error {
80
- mainStr := "insert ignore into leader_election (elect_key, leader) values (?, ?)"
63
+ stmt , err := tx .Prepare ("INSERT INTO leader_election(elect_key,leader) SELECT $1,$2 WHERE NOT EXISTS (SELECT 1 FROM leader_election WHERE elect_key=$3 AND leader=$4)" )
64
+ if err != nil {
65
+ return err
66
+ }
81
67
82
- _ , err := tx .Exec (mainStr , key , "" )
68
+ _ , err = stmt .Exec (key , "" , key , "" )
83
69
if err != nil {
84
70
log .Errorf ("[Store][database] create leader election (%s), err: %s" , key , err .Error ())
85
71
}
@@ -94,10 +80,10 @@ func (l leaderElectionStore) CreateLeaderElection(key string) error {
94
80
}
95
81
96
82
// GetVersion get the version from election
97
- func (l leaderElectionStore ) GetVersion (key string ) (int64 , error ) {
83
+ func (l * leaderElectionStore ) GetVersion (key string ) (int64 , error ) {
98
84
log .Debugf ("[Store][database] get version (%s)" , key )
99
85
100
- mainStr := "select version from leader_election where elect_key = ? "
86
+ mainStr := "select version from leader_election where elect_key = $1 "
101
87
102
88
var count int64
103
89
err := l .master .DB .QueryRow (mainStr , key ).Scan (& count )
@@ -109,13 +95,17 @@ func (l leaderElectionStore) GetVersion(key string) (int64, error) {
109
95
}
110
96
111
97
// CompareAndSwapVersion compare key version and update
112
- func (l leaderElectionStore ) CompareAndSwapVersion (key string , curVersion int64 , newVersion int64 , leader string ) (bool , error ) {
98
+ func (l * leaderElectionStore ) CompareAndSwapVersion (key string , curVersion int64 , newVersion int64 , leader string ) (bool , error ) {
113
99
var rows int64
114
100
115
101
err := l .master .processWithTransaction ("compareAndSwapVersion" , func (tx * BaseTx ) error {
116
102
log .Debugf ("[Store][database] compare and swap version (%s, %d, %d, %s)" , key , curVersion , newVersion , leader )
117
- mainStr := "update leader_election set leader = ?, version = ? where elect_key = ? and version = ?"
118
- result , err := tx .Exec (mainStr , leader , newVersion , key , curVersion )
103
+
104
+ stmt , err := tx .Prepare ("update leader_election set leader = $1, version = $2 where elect_key = $3 and version = $4" )
105
+ if err != nil {
106
+ return store .Error (err )
107
+ }
108
+ result , err := stmt .Exec (leader , newVersion , key , curVersion )
119
109
if err != nil {
120
110
log .Errorf ("[Store][database] compare and swap version (%s), err: %s" , key , err .Error ())
121
111
return store .Error (err )
@@ -140,28 +130,30 @@ func (l leaderElectionStore) CompareAndSwapVersion(key string, curVersion int64,
140
130
}
141
131
142
132
// CheckMtimeExpired check last modify time expired
143
- func (l leaderElectionStore ) CheckMtimeExpired (key string , leaseTime int32 ) (string , bool , error ) {
133
+ func (l * leaderElectionStore ) CheckMtimeExpired (key string , leaseTime int32 ) (string , bool , error ) {
144
134
log .Debugf ("[Store][database] check mtime expired (%s, %d)" , key , leaseTime )
145
135
146
- mainStr := "select leader, FROM_UNIXTIME(UNIX_TIMESTAMP(SYSDATE())) - mtime from leader_election where elect_key = ? "
136
+ mainStr := "select leader, mtime from leader_election where elect_key = $1 "
147
137
148
138
var (
149
- leader string
150
- diffTime int32
139
+ leader string
140
+ mtime time. Time
151
141
)
152
142
153
- err := l .master .DB .QueryRow (mainStr , key ).Scan (& leader , & diffTime )
143
+ err := l .master .DB .QueryRow (mainStr , key ).Scan (& leader , & mtime )
154
144
if err != nil {
155
145
log .Errorf ("[Store][database] check mtime expired (%s), err: %s" , key , err .Error ())
156
146
}
157
147
158
- return leader , diffTime > leaseTime , store .Error (err )
148
+ diffTime := CurrDiffTimeSecond (mtime )
149
+
150
+ return leader , int32 (diffTime ) > leaseTime , store .Error (err )
159
151
}
160
152
161
- func (l leaderElectionStore ) ListLeaderElections () ([]* model.LeaderElection , error ) {
153
+ func (l * leaderElectionStore ) ListLeaderElections () ([]* model.LeaderElection , error ) {
162
154
log .Info ("[Store][database] list leader election" )
163
155
164
- mainStr := "select elect_key, leader, UNIX_TIMESTAMP( ctime), UNIX_TIMESTAMP( mtime) from leader_election"
156
+ mainStr := "select elect_key, leader, ctime, mtime from leader_election"
165
157
rows , err := l .master .Query (mainStr )
166
158
if err != nil {
167
159
log .Errorf ("[Store][database] list leader election query err: %s" , err .Error ())
@@ -251,7 +243,7 @@ func (le *leaderElectionStateMachine) mainLoop() {
251
243
252
244
// tick 定时校验主健康状况
253
245
func (le * leaderElectionStateMachine ) tick () {
254
- // 校验校验次数
246
+ // 校验次数
255
247
if le .checkReleaseTickLimit () {
256
248
log .Infof ("[Store][database] abandon leader election in this tick (%s)" , le .electKey )
257
249
return
@@ -471,9 +463,13 @@ func (m *adminStore) BatchCleanDeletedInstances(timeout time.Duration, batchSize
471
463
472
464
var rows int64
473
465
err := m .master .processWithTransaction ("batchCleanDeletedInstances" , func (tx * BaseTx ) error {
474
- mainStr := "delete from instance where flag = 1 and " +
475
- "mtime <= FROM_UNIXTIME(UNIX_TIMESTAMP(SYSDATE()) - ?) limit ?"
476
- result , err := tx .Exec (mainStr , int32 (timeout .Seconds ()), batchSize )
466
+ stmt , err := tx .Prepare ("delete from instance where id in (select id from instance where flag = 1 and mtime <= $1 limit $2)" )
467
+ if err != nil {
468
+ return store .Error (err )
469
+ }
470
+
471
+ diffTime := GetCurrentSsTimestamp () - int64 (timeout .Seconds ())
472
+ result , err := stmt .Exec (UnixSecondToTime (diffTime ), batchSize )
477
473
if err != nil {
478
474
log .Errorf ("[Store][database] batch clean soft deleted instances(%d), err: %s" , batchSize , err .Error ())
479
475
return store .Error (err )
@@ -502,9 +498,9 @@ func (m *adminStore) BatchCleanDeletedInstances(timeout time.Duration, batchSize
502
498
func (m * adminStore ) GetUnHealthyInstances (timeout time.Duration , limit uint32 ) ([]string , error ) {
503
499
log .Infof ("[Store][database] get unhealthy instances which mtime timeout %s (%d)" , timeout , limit )
504
500
505
- queryStr := "select id from instance where flag=0 and enable_health_check=1 and health_status=0 " +
506
- " and mtime < FROM_UNIXTIME(UNIX_TIMESTAMP(SYSDATE()) - ?) limit ? "
507
- rows , err := m .master .Query (queryStr , int32 ( timeout . Seconds () ), limit )
501
+ diffTime := GetCurrentSsTimestamp () - int64 ( timeout . Seconds ())
502
+ queryStr := "select id from instance where flag=0 and enable_health_check=1 and health_status=0 and mtime < $1 limit $2 "
503
+ rows , err := m .master .Query (queryStr , UnixSecondToTime ( diffTime ), limit )
508
504
if err != nil {
509
505
log .Errorf ("[Store][database] get unhealthy instances, err: %s" , err .Error ())
510
506
return nil , store .Error (err )
@@ -535,9 +531,13 @@ func (m *adminStore) BatchCleanDeletedClients(timeout time.Duration, batchSize u
535
531
536
532
var rows int64
537
533
err := m .master .processWithTransaction ("batchCleanDeletedClients" , func (tx * BaseTx ) error {
538
- mainStr := "delete from client where flag = 1 and " +
539
- "mtime <= FROM_UNIXTIME(UNIX_TIMESTAMP(SYSDATE()) - ?) limit ?"
540
- result , err := tx .Exec (mainStr , int32 (timeout .Seconds ()), batchSize )
534
+ stmt , err := tx .Prepare ("delete from client where id in (select id from client where flag = 1 and mtime <= $1 limit $2)" )
535
+ if err != nil {
536
+ return store .Error (err )
537
+ }
538
+
539
+ diffTime := GetCurrentSsTimestamp () - int64 (timeout .Seconds ())
540
+ result , err := stmt .Exec (UnixSecondToTime (diffTime ), batchSize )
541
541
if err != nil {
542
542
log .Errorf ("[Store][database] batch clean soft deleted clients(%d), err: %s" , batchSize , err .Error ())
543
543
return store .Error (err )
0 commit comments