Move sync deps, change uuid to google and update go.mod
This commit is contained in:
		| @@ -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), | ||||
| 	} | ||||
| } | ||||
| @@ -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 | ||||
| } | ||||
| @@ -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, | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user