// updateCommandFunc executes the "update" command. func updateCommandFunc(cmd *cobra.Command, args []string, client *etcd.Client) (*etcd.Response, error) { if len(args) == 0 { return nil, errors.New("Key required") } key := args[0] value, err := argOrStdin(args, os.Stdin, 1) if err != nil { return nil, errors.New("Value required") } ttl := updateTTLFlag return client.Update(key, value, uint64(ttl)) }
func (locker *EtcdLocker) acquire(client *etcd.Client, key string, ttl uint64, wait bool) (Lock, error) { hasLock := false key = addPrefix(key) lock, err := addLockDirChild(client, key) if err != nil { return nil, errgo.Mask(err) } for !hasLock { res, err := client.Get(key, true, true) if err != nil { return nil, errgo.Mask(err) } if len(res.Node.Nodes) > 1 { sort.Sort(res.Node.Nodes) if res.Node.Nodes[0].CreatedIndex != lock.Node.CreatedIndex { if !wait { client.Delete(lock.Node.Key, false) return nil, &Error{res.Node.Nodes[0].Value} } else { err = locker.Wait(lock.Node.Key) if err != nil { return nil, errgo.Mask(err) } } } else { // if the first index is the current one, it's our turn to lock the key hasLock = true } } else { // If there are only 1 node, it's our, lock is acquired hasLock = true } } // If we get the lock, set the ttl and return it _, err = client.Update(lock.Node.Key, lock.Node.Value, ttl) if err != nil { return nil, errgo.Mask(err) } return &EtcdLock{client, lock.Node.Key, lock.Node.CreatedIndex}, nil }