Commit 70bbc95943a8aee1869afbd42d27f6c230cbb8ef

Authored by zhangqijia
1 parent 8d983031

fix: 修复服务器无法重新续租etcd的bug

cmd/gameserver/plugin/plugin.go
@@ -35,9 +35,8 @@ func LoginRpc(msg components.IMessage) (int32, interface{}) { @@ -35,9 +35,8 @@ func LoginRpc(msg components.IMessage) (int32, interface{}) {
35 role.SetProperty("Device", req.Device) 35 role.SetProperty("Device", req.Device)
36 36
37 return 0, &pb.RoleRsp{ 37 return 0, &pb.RoleRsp{
38 - Role: role.Role,  
39 - Hero: role.GetAllHero(),  
40 - Team: role.GetAllTeam(),  
41 - Equips: []*pb.Equipment{role.Equip.Equip}, 38 + Role: role.Role,
  39 + Hero: role.GetAllHero(),
  40 + Team: role.GetAllTeam(),
42 } 41 }
43 } 42 }
common/etcd/etcd.go
@@ -10,24 +10,26 @@ import ( @@ -10,24 +10,26 @@ import (
10 ) 10 )
11 11
12 type EtcdClient struct { 12 type EtcdClient struct {
13 - etcd *clientv3.Client 13 + etcd *clientv3.Client
  14 + lease clientv3.Lease
14 } 15 }
15 16
16 func NewEtcdClient(conf *common.Etcd) (*EtcdClient, error) { 17 func NewEtcdClient(conf *common.Etcd) (*EtcdClient, error) {
17 cli, err := clientv3.New(clientv3.Config{ 18 cli, err := clientv3.New(clientv3.Config{
18 Endpoints: conf.Endpoints, 19 Endpoints: conf.Endpoints,
19 - DialTimeout: time.Duration(conf.DialTimeout) * time.Second, 20 + DialTimeout: time.Duration(conf.DialTimeout) * time.Second,
20 }) 21 })
21 if err != nil { 22 if err != nil {
22 logger.Error("etcd init err: %v", err) 23 logger.Error("etcd init err: %v", err)
23 return nil, err 24 return nil, err
24 } 25 }
25 return &EtcdClient{ 26 return &EtcdClient{
26 - etcd: cli, 27 + etcd: cli,
  28 + lease: clientv3.NewLease(cli),
27 }, nil 29 }, nil
28 } 30 }
29 31
30 -func (e *EtcdClient)PutWithPrefix(prefix, key, val string) { 32 +func (e *EtcdClient) PutWithPrefix(prefix, key, val string) {
31 _, err := e.etcd.Put(context.TODO(), fmt.Sprintf("/%s/%s/", prefix, key), val) 33 _, err := e.etcd.Put(context.TODO(), fmt.Sprintf("/%s/%s/", prefix, key), val)
32 if err != nil { 34 if err != nil {
33 logger.Error("PutWithPrefix err: %v", err) 35 logger.Error("PutWithPrefix err: %v", err)
@@ -35,43 +37,68 @@ func (e *EtcdClient)PutWithPrefix(prefix, key, val string) { @@ -35,43 +37,68 @@ func (e *EtcdClient)PutWithPrefix(prefix, key, val string) {
35 } 37 }
36 } 38 }
37 39
38 -func (e *EtcdClient)PutWithLeasePrefix(prefix, key, val string, ttl int64) error {  
39 - lease := clientv3.NewLease(e.etcd)  
40 - leaseResp, err := lease.Grant(context.TODO(), ttl) 40 +func (e *EtcdClient) leaseKey(prefix, key, val string, ttl int64) (clientv3.LeaseID, error) {
  41 + leaseResp, err := e.lease.Grant(context.TODO(), ttl)
41 if err != nil { 42 if err != nil {
42 logger.Error("PutWithLeasePrefix 设置租约时间失败:%v\n", err) 43 logger.Error("PutWithLeasePrefix 设置租约时间失败:%v\n", err)
43 - return err 44 + return 0, err
44 } 45 }
45 46
46 _, err = e.etcd.Put(context.TODO(), fmt.Sprintf("/%s/%s/", prefix, key), val, clientv3.WithLease(leaseResp.ID)) 47 _, err = e.etcd.Put(context.TODO(), fmt.Sprintf("/%s/%s/", prefix, key), val, clientv3.WithLease(leaseResp.ID))
47 if err != nil { 48 if err != nil {
48 logger.Error("PutWithLeasePrefix err: %v", err) 49 logger.Error("PutWithLeasePrefix err: %v", err)
49 - return err 50 + return 0, err
50 } 51 }
  52 + return leaseResp.ID, nil
  53 +}
51 54
52 - keepRespChan, err := lease.KeepAlive(context.TODO(), leaseResp.ID) 55 +func (e *EtcdClient) PutWithLeasePrefix(prefix, key, val string, ttl int64) error {
  56 + logger.Debug("etcd register...")
  57 + leaseID, err := e.leaseKey(prefix, key, val, ttl)
53 if err != nil { 58 if err != nil {
54 - logger.Error("keepalive err: %v", err)  
55 - return err 59 + logger.Error(err)
  60 + panic(err)
56 } 61 }
57 go func() { 62 go func() {
58 for { 63 for {
59 - select {  
60 - case _ = <-keepRespChan:  
61 - if keepRespChan == nil {  
62 - fmt.Println("租约已经失效")  
63 - goto END  
64 - } else { //每秒会续租一次,所以就会受到一次应答  
65 - //fmt.Println("收到自动续租应答:", keepResp.ID) 64 + if leaseID == 0 {
  65 + leaseID, err = e.leaseKey(prefix, key, val, ttl)
  66 + if err != nil {
  67 + logger.Error("leaseKey err: %v", err)
  68 + continue
66 } 69 }
67 } 70 }
  71 +
  72 + keepRespChan, err := e.lease.KeepAlive(context.TODO(), leaseID)
  73 + if err != nil {
  74 + logger.Error("keepalive err: %v", err)
  75 + continue
  76 + }
  77 +
  78 + EXIT:
  79 + for {
  80 + select {
  81 + case keepChan := <-keepRespChan:
  82 + if keepChan == nil {
  83 + logger.Debug("租约已经失效")
  84 + leaseID = 0
  85 + break EXIT
  86 + } else {
  87 + //每秒会续租一次,所以就会受到一次应答
  88 + //fmt.Println("收到自动续租应答:", keepResp.ID)
  89 + }
  90 + logger.Debug(keepChan)
  91 + }
  92 + }
  93 +
  94 + logger.Debug("exit keepRspChan for select")
68 } 95 }
69 - END:  
70 }() 96 }()
  97 +
71 return nil 98 return nil
72 } 99 }
73 100
74 -func (e *EtcdClient)Get(key string) map[string]string { 101 +func (e *EtcdClient) Get(key string) map[string]string {
75 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 102 ctx, cancel := context.WithTimeout(context.Background(), time.Second)
76 resp, err := e.etcd.Get(ctx, fmt.Sprintf("/%s/", key)) 103 resp, err := e.etcd.Get(ctx, fmt.Sprintf("/%s/", key))
77 cancel() 104 cancel()
@@ -86,7 +113,7 @@ func (e *EtcdClient)Get(key string) map[string]string { @@ -86,7 +113,7 @@ func (e *EtcdClient)Get(key string) map[string]string {
86 return m 113 return m
87 } 114 }
88 115
89 -func (e *EtcdClient)GetByPrefix(prefix string) map[string]string { 116 +func (e *EtcdClient) GetByPrefix(prefix string) map[string]string {
90 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 117 ctx, cancel := context.WithTimeout(context.Background(), time.Second)
91 resp, err := e.etcd.Get(ctx, fmt.Sprintf("/%s/", prefix), clientv3.WithPrefix()) 118 resp, err := e.etcd.Get(ctx, fmt.Sprintf("/%s/", prefix), clientv3.WithPrefix())
92 cancel() 119 cancel()
@@ -101,6 +128,6 @@ func (e *EtcdClient)GetByPrefix(prefix string) map[string]string { @@ -101,6 +128,6 @@ func (e *EtcdClient)GetByPrefix(prefix string) map[string]string {
101 return m 128 return m
102 } 129 }
103 130
104 -func (e *EtcdClient)Close() { 131 +func (e *EtcdClient) Close() {
105 e.etcd.Close() 132 e.etcd.Close()
106 -}  
107 \ No newline at end of file 133 \ No newline at end of file
  134 +}
1 -Subproject commit c9c5e84cc702b2f2defa023fd65100176d5c60fd 1 +Subproject commit a2f16acb43e1a3272760452efe0d504a11927261