-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathetcd.go
43 lines (36 loc) · 1.09 KB
/
etcd.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package etcdcron
import (
"context"
etcdclient "go.etcd.io/etcd/client/v3"
"go.etcd.io/etcd/client/v3/concurrency"
)
type DistributedMutex interface {
IsOwner() etcdclient.Cmp
Key() string
Lock(ctx context.Context) error
Unlock(ctx context.Context) error
}
type EtcdMutexBuilder interface {
NewMutex(pfx string) (DistributedMutex, error)
}
type etcdMutexBuilder struct {
*etcdclient.Client
}
func NewEtcdMutexBuilder(config etcdclient.Config) (EtcdMutexBuilder, error) {
c, err := etcdclient.New(config)
if err != nil {
return nil, err
}
return etcdMutexBuilder{Client: c}, nil
}
func (c etcdMutexBuilder) NewMutex(pfx string) (DistributedMutex, error) {
// As each task iteration lock name is unique, we don't really care about unlocking it
// So the etcd lease will alst 10 minutes, it ensures that even if another server
// clock is ill-configured (with a maximum span of 10 minutes), it won't execute the task
// twice.
session, err := concurrency.NewSession(c.Client, concurrency.WithTTL(60*10))
if err != nil {
return nil, err
}
return concurrency.NewMutex(session, pfx), nil
}