From 70bbc95943a8aee1869afbd42d27f6c230cbb8ef Mon Sep 17 00:00:00 2001 From: zqj <582132116@qq.com> Date: Thu, 24 Mar 2022 14:05:34 +0800 Subject: [PATCH] fix: 修复服务器无法重新续租etcd的bug --- cmd/gameserver/plugin/plugin.go | 7 +++---- common/etcd/etcd.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++------------------------ protos | 2 +- 3 files changed, 55 insertions(+), 29 deletions(-) diff --git a/cmd/gameserver/plugin/plugin.go b/cmd/gameserver/plugin/plugin.go index db835e2..a7cd429 100644 --- a/cmd/gameserver/plugin/plugin.go +++ b/cmd/gameserver/plugin/plugin.go @@ -35,9 +35,8 @@ func LoginRpc(msg components.IMessage) (int32, interface{}) { role.SetProperty("Device", req.Device) return 0, &pb.RoleRsp{ - Role: role.Role, - Hero: role.GetAllHero(), - Team: role.GetAllTeam(), - Equips: []*pb.Equipment{role.Equip.Equip}, + Role: role.Role, + Hero: role.GetAllHero(), + Team: role.GetAllTeam(), } } diff --git a/common/etcd/etcd.go b/common/etcd/etcd.go index 0f5aba8..876931e 100644 --- a/common/etcd/etcd.go +++ b/common/etcd/etcd.go @@ -10,24 +10,26 @@ import ( ) type EtcdClient struct { - etcd *clientv3.Client + etcd *clientv3.Client + lease clientv3.Lease } func NewEtcdClient(conf *common.Etcd) (*EtcdClient, error) { cli, err := clientv3.New(clientv3.Config{ Endpoints: conf.Endpoints, - DialTimeout: time.Duration(conf.DialTimeout) * time.Second, + DialTimeout: time.Duration(conf.DialTimeout) * time.Second, }) if err != nil { logger.Error("etcd init err: %v", err) return nil, err } return &EtcdClient{ - etcd: cli, + etcd: cli, + lease: clientv3.NewLease(cli), }, nil } -func (e *EtcdClient)PutWithPrefix(prefix, key, val string) { +func (e *EtcdClient) PutWithPrefix(prefix, key, val string) { _, err := e.etcd.Put(context.TODO(), fmt.Sprintf("/%s/%s/", prefix, key), val) if err != nil { logger.Error("PutWithPrefix err: %v", err) @@ -35,43 +37,68 @@ func (e *EtcdClient)PutWithPrefix(prefix, key, val string) { } } -func (e *EtcdClient)PutWithLeasePrefix(prefix, key, val string, ttl int64) error { - lease := clientv3.NewLease(e.etcd) - leaseResp, err := lease.Grant(context.TODO(), ttl) +func (e *EtcdClient) leaseKey(prefix, key, val string, ttl int64) (clientv3.LeaseID, error) { + leaseResp, err := e.lease.Grant(context.TODO(), ttl) if err != nil { logger.Error("PutWithLeasePrefix 设置租约时间失败:%v\n", err) - return err + return 0, err } _, err = e.etcd.Put(context.TODO(), fmt.Sprintf("/%s/%s/", prefix, key), val, clientv3.WithLease(leaseResp.ID)) if err != nil { logger.Error("PutWithLeasePrefix err: %v", err) - return err + return 0, err } + return leaseResp.ID, nil +} - keepRespChan, err := lease.KeepAlive(context.TODO(), leaseResp.ID) +func (e *EtcdClient) PutWithLeasePrefix(prefix, key, val string, ttl int64) error { + logger.Debug("etcd register...") + leaseID, err := e.leaseKey(prefix, key, val, ttl) if err != nil { - logger.Error("keepalive err: %v", err) - return err + logger.Error(err) + panic(err) } go func() { for { - select { - case _ = <-keepRespChan: - if keepRespChan == nil { - fmt.Println("租约已经失效") - goto END - } else { //每秒会续租一次,所以就会受到一次应答 - //fmt.Println("收到自动续租应答:", keepResp.ID) + if leaseID == 0 { + leaseID, err = e.leaseKey(prefix, key, val, ttl) + if err != nil { + logger.Error("leaseKey err: %v", err) + continue } } + + keepRespChan, err := e.lease.KeepAlive(context.TODO(), leaseID) + if err != nil { + logger.Error("keepalive err: %v", err) + continue + } + + EXIT: + for { + select { + case keepChan := <-keepRespChan: + if keepChan == nil { + logger.Debug("租约已经失效") + leaseID = 0 + break EXIT + } else { + //每秒会续租一次,所以就会受到一次应答 + //fmt.Println("收到自动续租应答:", keepResp.ID) + } + logger.Debug(keepChan) + } + } + + logger.Debug("exit keepRspChan for select") } - END: }() + return nil } -func (e *EtcdClient)Get(key string) map[string]string { +func (e *EtcdClient) Get(key string) map[string]string { ctx, cancel := context.WithTimeout(context.Background(), time.Second) resp, err := e.etcd.Get(ctx, fmt.Sprintf("/%s/", key)) cancel() @@ -86,7 +113,7 @@ func (e *EtcdClient)Get(key string) map[string]string { return m } -func (e *EtcdClient)GetByPrefix(prefix string) map[string]string { +func (e *EtcdClient) GetByPrefix(prefix string) map[string]string { ctx, cancel := context.WithTimeout(context.Background(), time.Second) resp, err := e.etcd.Get(ctx, fmt.Sprintf("/%s/", prefix), clientv3.WithPrefix()) cancel() @@ -101,6 +128,6 @@ func (e *EtcdClient)GetByPrefix(prefix string) map[string]string { return m } -func (e *EtcdClient)Close() { +func (e *EtcdClient) Close() { e.etcd.Close() -} \ No newline at end of file +} diff --git a/protos b/protos index c9c5e84..a2f16ac 160000 --- a/protos +++ b/protos @@ -1 +1 @@ -Subproject commit c9c5e84cc702b2f2defa023fd65100176d5c60fd +Subproject commit a2f16acb43e1a3272760452efe0d504a11927261 -- libgit2 0.21.2