Commit 70bbc95943a8aee1869afbd42d27f6c230cbb8ef
1 parent
8d983031
fix: 修复服务器无法重新续租etcd的bug
Showing
3 changed files
with
55 additions
and
29 deletions
Show diff stats
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 | +} | ... | ... |