Move sync deps, change uuid to google and update go.mod

This commit is contained in:
Asim Aslam
2019-06-07 13:53:42 +01:00
parent 9e23855c37
commit a2fbf19341
14 changed files with 9 additions and 765 deletions

View File

@@ -1,115 +0,0 @@
// Package etcd is an etcd implementation of lock
package etcd
import (
"context"
"errors"
"log"
"path"
"strings"
"sync"
client "github.com/coreos/etcd/clientv3"
cc "github.com/coreos/etcd/clientv3/concurrency"
"github.com/micro/go-micro/sync/lock"
)
type etcdLock struct {
opts lock.Options
path string
client *client.Client
sync.Mutex
locks map[string]*elock
}
type elock struct {
s *cc.Session
m *cc.Mutex
}
func (e *etcdLock) Acquire(id string, opts ...lock.AcquireOption) error {
var options lock.AcquireOptions
for _, o := range opts {
o(&options)
}
// make path
path := path.Join(e.path, strings.Replace(e.opts.Prefix+id, "/", "-", -1))
var sopts []cc.SessionOption
if options.TTL > 0 {
sopts = append(sopts, cc.WithTTL(int(options.TTL.Seconds())))
}
s, err := cc.NewSession(e.client, sopts...)
if err != nil {
return err
}
m := cc.NewMutex(s, path)
ctx, _ := context.WithCancel(context.Background())
if err := m.Lock(ctx); err != nil {
return err
}
e.Lock()
e.locks[id] = &elock{
s: s,
m: m,
}
e.Unlock()
return nil
}
func (e *etcdLock) Release(id string) error {
e.Lock()
defer e.Unlock()
v, ok := e.locks[id]
if !ok {
return errors.New("lock not found")
}
err := v.m.Unlock(context.Background())
delete(e.locks, id)
return err
}
func (e *etcdLock) String() string {
return "etcd"
}
func NewLock(opts ...lock.Option) lock.Lock {
var options lock.Options
for _, o := range opts {
o(&options)
}
var endpoints []string
for _, addr := range options.Nodes {
if len(addr) > 0 {
endpoints = append(endpoints, addr)
}
}
if len(endpoints) == 0 {
endpoints = []string{"http://127.0.0.1:2379"}
}
// TODO: parse addresses
c, err := client.New(client.Config{
Endpoints: endpoints,
})
if err != nil {
log.Fatal(err)
}
return &etcdLock{
path: "/micro/lock",
client: c,
opts: options,
locks: make(map[string]*elock),
}
}

View File

@@ -1,29 +0,0 @@
package redis
import (
"sync"
"github.com/gomodule/redigo/redis"
)
type pool struct {
sync.Mutex
i int
addrs []string
}
func (p *pool) Get() redis.Conn {
for i := 0; i < 3; i++ {
p.Lock()
addr := p.addrs[p.i%len(p.addrs)]
p.i++
p.Unlock()
c, err := redis.Dial("tcp", addr)
if err != nil {
continue
}
return c
}
return nil
}

View File

@@ -1,94 +0,0 @@
// Package redis is a redis implemenation of lock
package redis
import (
"errors"
"sync"
"time"
"github.com/go-redsync/redsync"
"github.com/micro/go-micro/sync/lock"
)
type redisLock struct {
sync.Mutex
locks map[string]*redsync.Mutex
opts lock.Options
c *redsync.Redsync
}
func (r *redisLock) Acquire(id string, opts ...lock.AcquireOption) error {
var options lock.AcquireOptions
for _, o := range opts {
o(&options)
}
var ropts []redsync.Option
if options.Wait > time.Duration(0) {
ropts = append(ropts, redsync.SetRetryDelay(options.Wait))
ropts = append(ropts, redsync.SetTries(1))
}
if options.TTL > time.Duration(0) {
ropts = append(ropts, redsync.SetExpiry(options.TTL))
}
m := r.c.NewMutex(r.opts.Prefix+id, ropts...)
err := m.Lock()
if err != nil {
return err
}
r.Lock()
r.locks[id] = m
r.Unlock()
return nil
}
func (r *redisLock) Release(id string) error {
r.Lock()
defer r.Unlock()
m, ok := r.locks[id]
if !ok {
return errors.New("lock not found")
}
unlocked := m.Unlock()
delete(r.locks, id)
if !unlocked {
return errors.New("lock not unlocked")
}
return nil
}
func (r *redisLock) String() string {
return "redis"
}
func NewLock(opts ...lock.Option) lock.Lock {
var options lock.Options
for _, o := range opts {
o(&options)
}
nodes := options.Nodes
if len(nodes) == 0 {
nodes = []string{"127.0.0.1:6379"}
}
rpool := redsync.New([]redsync.Pool{&pool{
addrs: nodes,
}})
return &redisLock{
locks: make(map[string]*redsync.Mutex),
opts: options,
c: rpool,
}
}