Skip to content

Commit d2e73d1

Browse files
authored
*: use another etcd client for election (#6409)
ref #6403 Signed-off-by: Ryan Leung <rleungx@gmail.com>
1 parent e8de93d commit d2e73d1

File tree

3 files changed

+35
-20
lines changed

3 files changed

+35
-20
lines changed

pkg/utils/etcdutil/etcdutil.go

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -196,19 +196,9 @@ func EtcdKVPutWithTTL(ctx context.Context, c *clientv3.Client, key string, value
196196
return kv.Put(ctx, key, value, clientv3.WithLease(grantResp.ID))
197197
}
198198

199-
// CreateClientsWithMultiEndpoint creates etcd v3 client and http client.
200-
func CreateClientsWithMultiEndpoint(tlsConfig *tls.Config, acUrls []url.URL) (*clientv3.Client, *http.Client, error) {
201-
client, err := createEtcdClientWithMultiEndpoint(tlsConfig, acUrls)
202-
if err != nil {
203-
return nil, nil, errs.ErrNewEtcdClient.Wrap(err).GenWithStackByCause()
204-
}
205-
httpClient := createHTTPClient(tlsConfig)
206-
return client, httpClient, nil
207-
}
208-
209199
// CreateClients creates etcd v3 client and http client.
210200
func CreateClients(tlsConfig *tls.Config, acUrls url.URL) (*clientv3.Client, *http.Client, error) {
211-
client, err := createEtcdClient(tlsConfig, acUrls)
201+
client, err := CreateEtcdClient(tlsConfig, acUrls)
212202
if err != nil {
213203
return nil, nil, errs.ErrNewEtcdClient.Wrap(err).GenWithStackByCause()
214204
}
@@ -255,9 +245,9 @@ func createEtcdClientWithMultiEndpoint(tlsConfig *tls.Config, acUrls []url.URL)
255245
return client, err
256246
}
257247

258-
// createEtcdClient creates etcd v3 client.
248+
// CreateEtcdClient creates etcd v3 client.
259249
// Note: it will be used by legacy pd-server, and only connect to leader only.
260-
func createEtcdClient(tlsConfig *tls.Config, acURL url.URL) (*clientv3.Client, error) {
250+
func CreateEtcdClient(tlsConfig *tls.Config, acURL url.URL) (*clientv3.Client, error) {
261251
lgc := zap.NewProductionConfig()
262252
lgc.Encoding = log.ZapEncodingName
263253
client, err := clientv3.New(clientv3.Config{

pkg/utils/etcdutil/etcdutil_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -305,12 +305,12 @@ func TestEtcdScaleInAndOutWithoutMultiPoint(t *testing.T) {
305305
// Create two etcd clients with etcd1 as endpoint.
306306
urls, err := types.NewURLs([]string{ep1})
307307
re.NoError(err)
308-
client1, err := createEtcdClient(nil, urls[0]) // execute member change operation with this client
308+
client1, err := CreateEtcdClient(nil, urls[0]) // execute member change operation with this client
309309
defer func() {
310310
client1.Close()
311311
}()
312312
re.NoError(err)
313-
client2, err := createEtcdClient(nil, urls[0]) // check member change with this client
313+
client2, err := CreateEtcdClient(nil, urls[0]) // check member change with this client
314314
defer func() {
315315
client2.Close()
316316
}()
@@ -482,7 +482,7 @@ func (suite *loopWatcherTestSuite) SetupSuite() {
482482
ep1 := suite.config.LCUrls[0].String()
483483
urls, err := types.NewURLs([]string{ep1})
484484
suite.NoError(err)
485-
suite.client, err = createEtcdClient(nil, urls[0])
485+
suite.client, err = CreateEtcdClient(nil, urls[0])
486486
suite.NoError(err)
487487
suite.cleans = append(suite.cleans, func() {
488488
suite.client.Close()
@@ -685,23 +685,23 @@ func (suite *loopWatcherTestSuite) TestWatcherBreak() {
685685

686686
// Case2: close the etcd client and put a new value after watcher restarts
687687
suite.client.Close()
688-
suite.client, err = createEtcdClient(nil, suite.config.LCUrls[0])
688+
suite.client, err = CreateEtcdClient(nil, suite.config.LCUrls[0])
689689
suite.NoError(err)
690690
watcher.updateClientCh <- suite.client
691691
suite.put("TestWatcherBreak", "2")
692692
checkCache("2")
693693

694694
// Case3: close the etcd client and put a new value before watcher restarts
695695
suite.client.Close()
696-
suite.client, err = createEtcdClient(nil, suite.config.LCUrls[0])
696+
suite.client, err = CreateEtcdClient(nil, suite.config.LCUrls[0])
697697
suite.NoError(err)
698698
suite.put("TestWatcherBreak", "3")
699699
watcher.updateClientCh <- suite.client
700700
checkCache("3")
701701

702702
// Case4: close the etcd client and put a new value with compact
703703
suite.client.Close()
704-
suite.client, err = createEtcdClient(nil, suite.config.LCUrls[0])
704+
suite.client, err = CreateEtcdClient(nil, suite.config.LCUrls[0])
705705
suite.NoError(err)
706706
suite.put("TestWatcherBreak", "4")
707707
resp, err := EtcdKVGet(suite.client, "TestWatcherBreak")

server/server.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ type Server struct {
145145
member *member.EmbeddedEtcdMember
146146
// etcd client
147147
client *clientv3.Client
148+
// electionClient is used for leader election.
149+
electionClient *clientv3.Client
148150
// http client
149151
httpClient *http.Client
150152
clusterID uint64 // pd cluster id.
@@ -335,6 +337,11 @@ func (s *Server) startEtcd(ctx context.Context) error {
335337
return err
336338
}
337339

340+
s.electionClient, err = startElectionClient(s.cfg)
341+
if err != nil {
342+
return err
343+
}
344+
338345
// update advertise peer urls.
339346
etcdMembers, err := etcdutil.ListEtcdMembers(s.client)
340347
if err != nil {
@@ -353,7 +360,7 @@ func (s *Server) startEtcd(ctx context.Context) error {
353360
failpoint.Inject("memberNil", func() {
354361
time.Sleep(1500 * time.Millisecond)
355362
})
356-
s.member = member.NewMember(etcd, s.client, etcdServerID)
363+
s.member = member.NewMember(etcd, s.electionClient, etcdServerID)
357364
return nil
358365
}
359366

@@ -369,6 +376,19 @@ func startClient(cfg *config.Config) (*clientv3.Client, *http.Client, error) {
369376
return etcdutil.CreateClients(tlsConfig, etcdCfg.ACUrls[0])
370377
}
371378

379+
func startElectionClient(cfg *config.Config) (*clientv3.Client, error) {
380+
tlsConfig, err := cfg.Security.ToTLSConfig()
381+
if err != nil {
382+
return nil, err
383+
}
384+
etcdCfg, err := cfg.GenEmbedEtcdConfig()
385+
if err != nil {
386+
return nil, err
387+
}
388+
389+
return etcdutil.CreateEtcdClient(tlsConfig, etcdCfg.ACUrls[0])
390+
}
391+
372392
// AddStartCallback adds a callback in the startServer phase.
373393
func (s *Server) AddStartCallback(callbacks ...func()) {
374394
s.startCallbacks = append(s.startCallbacks, callbacks...)
@@ -484,6 +504,11 @@ func (s *Server) Close() {
484504
log.Error("close etcd client meet error", errs.ZapError(errs.ErrCloseEtcdClient, err))
485505
}
486506
}
507+
if s.electionClient != nil {
508+
if err := s.electionClient.Close(); err != nil {
509+
log.Error("close election client meet error", errs.ZapError(errs.ErrCloseEtcdClient, err))
510+
}
511+
}
487512

488513
if s.httpClient != nil {
489514
s.httpClient.CloseIdleConnections()

0 commit comments

Comments
 (0)