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 35 role.SetProperty("Device", req.Device)
36 36  
37 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 10 )
11 11  
12 12 type EtcdClient struct {
13   - etcd *clientv3.Client
  13 + etcd *clientv3.Client
  14 + lease clientv3.Lease
14 15 }
15 16  
16 17 func NewEtcdClient(conf *common.Etcd) (*EtcdClient, error) {
17 18 cli, err := clientv3.New(clientv3.Config{
18 19 Endpoints: conf.Endpoints,
19   - DialTimeout: time.Duration(conf.DialTimeout) * time.Second,
  20 + DialTimeout: time.Duration(conf.DialTimeout) * time.Second,
20 21 })
21 22 if err != nil {
22 23 logger.Error("etcd init err: %v", err)
23 24 return nil, err
24 25 }
25 26 return &EtcdClient{
26   - etcd: cli,
  27 + etcd: cli,
  28 + lease: clientv3.NewLease(cli),
27 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 33 _, err := e.etcd.Put(context.TODO(), fmt.Sprintf("/%s/%s/", prefix, key), val)
32 34 if err != nil {
33 35 logger.Error("PutWithPrefix err: %v", err)
... ... @@ -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 42 if err != nil {
42 43 logger.Error("PutWithLeasePrefix 设置租约时间失败:%v\n", err)
43   - return err
  44 + return 0, err
44 45 }
45 46  
46 47 _, err = e.etcd.Put(context.TODO(), fmt.Sprintf("/%s/%s/", prefix, key), val, clientv3.WithLease(leaseResp.ID))
47 48 if err != nil {
48 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 58 if err != nil {
54   - logger.Error("keepalive err: %v", err)
55   - return err
  59 + logger.Error(err)
  60 + panic(err)
56 61 }
57 62 go func() {
58 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 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 102 ctx, cancel := context.WithTimeout(context.Background(), time.Second)
76 103 resp, err := e.etcd.Get(ctx, fmt.Sprintf("/%s/", key))
77 104 cancel()
... ... @@ -86,7 +113,7 @@ func (e *EtcdClient)Get(key string) map[string]string {
86 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 117 ctx, cancel := context.WithTimeout(context.Background(), time.Second)
91 118 resp, err := e.etcd.Get(ctx, fmt.Sprintf("/%s/", prefix), clientv3.WithPrefix())
92 119 cancel()
... ... @@ -101,6 +128,6 @@ func (e *EtcdClient)GetByPrefix(prefix string) map[string]string {
101 128 return m
102 129 }
103 130  
104   -func (e *EtcdClient)Close() {
  131 +func (e *EtcdClient) Close() {
105 132 e.etcd.Close()
106   -}
107 133 \ No newline at end of file
  134 +}
... ...
1   -Subproject commit c9c5e84cc702b2f2defa023fd65100176d5c60fd
  1 +Subproject commit a2f16acb43e1a3272760452efe0d504a11927261
... ...