...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package v3lock
16
17 import (
18 "context"
19
20 "go.etcd.io/etcd/client/v3"
21 "go.etcd.io/etcd/client/v3/concurrency"
22 "go.etcd.io/etcd/server/v3/etcdserver/api/v3lock/v3lockpb"
23 )
24
25 type lockServer struct {
26 c *clientv3.Client
27 }
28
29 func NewLockServer(c *clientv3.Client) v3lockpb.LockServer {
30 return &lockServer{c}
31 }
32
33 func (ls *lockServer) Lock(ctx context.Context, req *v3lockpb.LockRequest) (*v3lockpb.LockResponse, error) {
34 s, err := concurrency.NewSession(
35 ls.c,
36 concurrency.WithLease(clientv3.LeaseID(req.Lease)),
37 concurrency.WithContext(ctx),
38 )
39 if err != nil {
40 return nil, err
41 }
42 s.Orphan()
43 m := concurrency.NewMutex(s, string(req.Name))
44 if err = m.Lock(ctx); err != nil {
45 return nil, err
46 }
47 return &v3lockpb.LockResponse{Header: m.Header(), Key: []byte(m.Key())}, nil
48 }
49
50 func (ls *lockServer) Unlock(ctx context.Context, req *v3lockpb.UnlockRequest) (*v3lockpb.UnlockResponse, error) {
51 resp, err := ls.c.Delete(ctx, string(req.Key))
52 if err != nil {
53 return nil, err
54 }
55 return &v3lockpb.UnlockResponse{Header: resp.Header}, nil
56 }
57
View as plain text