// setupSemaphore is used to setup a new Semaphore given the // API client, key prefix, session name, and slot holder limit. func (c *LockCommand) setupSemaphore(client *api.Client, limit int, prefix, name string) (*LockUnlock, error) { if c.verbose { c.Ui.Info(fmt.Sprintf("Setting up semaphore (limit %d) at prefix: %s", limit, prefix)) } opts := api.SemaphoreOptions{ Prefix: prefix, Limit: limit, SessionName: name, } s, err := client.SemaphoreOpts(&opts) if err != nil { return nil, err } lu := &LockUnlock{ lockFn: s.Acquire, unlockFn: s.Release, cleanupFn: s.Destroy, inUseErr: api.ErrSemaphoreInUse, } return lu, nil }
// setupLock is used to setup a new Lock given the API client, // the key prefix to operate on, and an optional session name. func (c *LockCommand) setupLock(client *api.Client, prefix, name string) (*LockUnlock, error) { // Use the DefaultSemaphoreKey extension, this way if a lock and // semaphore are both used at the same prefix, we will get a conflict // which we can report to the user. key := path.Join(prefix, api.DefaultSemaphoreKey) if c.verbose { c.Ui.Info(fmt.Sprintf("Setting up lock at path: %s", key)) } opts := api.LockOptions{ Key: key, SessionName: name, } l, err := client.LockOpts(&opts) if err != nil { return nil, err } lu := &LockUnlock{ lockFn: l.Lock, unlockFn: l.Unlock, cleanupFn: l.Destroy, inUseErr: api.ErrLockInUse, } return lu, nil }