func setRing(cfg torus.Config, r torus.Ring) error { client, err := etcdv3.New(etcdv3.Config{Endpoints: []string{cfg.MetadataAddress}, TLS: cfg.TLS}) if err != nil { return err } defer client.Close() resp, err := client.Get(context.Background(), MkKey("meta", "the-one-ring")) if err != nil { return err } if len(resp.Kvs) == 0 { return torus.ErrNoGlobalMetadata } oldr, err := ring.Unmarshal(resp.Kvs[0].Value) if err != nil { return err } if oldr.Version() != r.Version()-1 { return torus.ErrNonSequentialRing } b, err := r.Marshal() if err != nil { return err } _, err = client.Put(context.Background(), MkKey("meta", "the-one-ring"), string(b)) return err }
func (c *etcdCtx) SetRing(ring torus.Ring) error { oldr, etcdver, err := c.getRing() if err != nil { return err } if oldr.Version() != ring.Version()-1 { return torus.ErrNonSequentialRing } b, err := ring.Marshal() if err != nil { return err } key := MkKey("meta", "the-one-ring") txn := c.etcd.Client.Txn(c.getContext()).If( etcdv3.Compare(etcdv3.Version(key), "=", etcdver), ).Then( etcdv3.OpPut(key, string(b)), ) resp, err := txn.Commit() if err != nil { return err } if resp.Succeeded { return nil } return torus.ErrAgain }