func acquire(c *etcd.Client, key, value string, ttl uint64) (uint64, error) { resp, err := c.Create(key, value, ttl) if err != nil { return 0, err } return resp.EtcdIndex, nil }
// acquireOrRenewLease either races to acquire a new master lease, or update the existing master's lease // returns true if we have the lease, and an error if one occurs. // TODO: use the master election utility once it is merged in. func (c *Config) acquireOrRenewLease(etcdClient *etcd.Client) (bool, error) { result, err := etcdClient.Get(c.key, false, false) if err != nil { if tools.IsEtcdNotFound(err) { // there is no current master, try to become master, create will fail if the key already exists _, err := etcdClient.Create(c.key, c.whoami, c.ttl) if err != nil { return false, err } c.lastLease = time.Now() return true, nil } return false, err } if result.Node.Value == c.whoami { glog.Infof("key already exists, we are the master (%s)", result.Node.Value) // we extend our lease @ 1/2 of the existing TTL, this ensures the master doesn't flap around if result.Node.Expiration.Sub(time.Now()) < time.Duration(c.ttl/2)*time.Second { _, err := etcdClient.CompareAndSwap(c.key, c.whoami, c.ttl, c.whoami, result.Node.ModifiedIndex) if err != nil { return false, err } } c.lastLease = time.Now() return true, nil } glog.Infof("key already exists, the master is %s, sleeping.", result.Node.Value) return false, nil }
func MustCreate(c *etcd.Client, logger *log.Logger, key, value string, ttl uint64) *etcd.Response { resp, err := c.Create(key, value, ttl) if err != nil { logger.Panicf("Create failed. Key: %s, err: %v", key, err) } return resp }
// makeCommandFunc executes the "make" command. func makeCommandFunc(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 := mkTtlFlag return client.Create(key, value, uint64(ttl)) }
func TryOccupyTask(client *etcd.Client, name string, taskID uint64, connection string) (bool, error) { _, err := client.Create(TaskHealthyPath(name, taskID), "health", 3) if err != nil { if strings.Contains(err.Error(), "Key already exists") { return false, nil } return false, err } idStr := strconv.FormatUint(taskID, 10) client.Delete(FreeTaskPath(name, idStr), false) _, err = client.Set(TaskMasterPath(name, taskID), connection, 0) if err != nil { return false, err } return true, nil }
// Send etcd Data and output. func setETCD(client *etcd.Client, full_key, value string) { log.Printf("Setting %s => %s \n", full_key, value) client.Create(full_key, value, 0) }