Documentation ¶
Index ¶
Constants ¶
const (
// SemaphorePrefix is the key in etcd where the semaphore will be stored
SemaphorePrefix = keyPrefix + "/" + semaphoreBranch
)
Variables ¶
var ( // ErrExist is the error returned if a holder with the specified id // is already holding the semaphore ErrExist = errors.New("holder exists") // ErrNotExist is the error returned if there is no holder with the // specified id holding the semaphore ErrNotExist = errors.New("holder does not exist") )
Functions ¶
This section is empty.
Types ¶
type EtcdLockClient ¶
type EtcdLockClient struct {
// contains filtered or unexported fields
}
EtcdLockClient is a wrapper around the etcd client that provides simple primitives to operate on the internal semaphore and holders structs through etcd.
func NewEtcdLockClient ¶
func NewEtcdLockClient(keyapi KeysAPI, group string) (*EtcdLockClient, error)
NewEtcdLockClient creates a new EtcdLockClient. The group parameter defines the etcd key path in which the client will manipulate the semaphore. If the group is the empty string, the default semaphore will be used.
func (*EtcdLockClient) Get ¶
func (c *EtcdLockClient) Get() (*Semaphore, error)
Get fetches the Semaphore from etcd.
func (*EtcdLockClient) Init ¶
func (c *EtcdLockClient) Init() error
Init sets an initial copy of the semaphore if it doesn't exist yet.
func (*EtcdLockClient) Set ¶
func (c *EtcdLockClient) Set(sem *Semaphore) error
Set sets a Semaphore in etcd.
type KeysAPI ¶ added in v0.4.0
type KeysAPI interface { Get(ctx context.Context, key string, opts *client.GetOptions) (*client.Response, error) Set(ctx context.Context, key, value string, opts *client.SetOptions) (*client.Response, error) Create(ctx context.Context, key, value string) (*client.Response, error) }
KeysAPI is the minimum etcd client.KeysAPI interface EtcdLockClient needs to do its job.
type Lock ¶
type Lock struct {
// contains filtered or unexported fields
}
Lock takes care of locking in generic clients
func New ¶
func New(id string, client LockClient) (lock *Lock)
New returns a new lock with the provided arguments
func (*Lock) Get ¶
Get returns the current semaphore value if the underlying client returns an error, Get passes it through
func (*Lock) Lock ¶
Lock adds this lock id as a holder to the semaphore it will return an error if there is a problem getting or setting the semaphore, or if the maximum number of holders has been reached, or if a lock with this id is already a holder
type LockClient ¶
LockClient is a generic interface for a lock
type Semaphore ¶
type Semaphore struct { Index uint64 `json:"-"` Semaphore int `json:"semaphore"` Max int `json:"max"` Holders []string `json:"holders"` }
Semaphore is a struct representation of the information held by the semaphore
func (*Semaphore) Lock ¶
Lock adds a holder with id h to the semaphore It adds the id h to the list of holders, returning ErrExist the id already exists, then it subtracts one from the semaphore. If the semaphore is already held by the maximum number of people it returns an error.