func (o *Server) ObtainConfig() (err error) { e := NewEnvGetter(fmt.Sprintf("OORT_%s", strings.ToUpper(o.serviceName)), "_") envSkipSRV := e.Get("SKIP_SRV") // Check whether we're supposed to skip loading via srv method if strings.ToLower(envSkipSRV) != "true" { s := &srvconf.SRVLoader{ SyndicateURL: e.Get("SYNDICATE_OVERRIDE"), } s.Record, err = GenServiceID(o.serviceName, "syndicate", "tcp") if err != nil { if e.Get("SYNDICATE_OVERRIDE") == "" { log.Println(err) } else { log.Fatalln("No SYNDICATE_OVERRIDE provided and", err) } } if e.Get("SYNDICATE_OVERRIDE") != "" { log.Println("Over wrote syndicate url with url from env!", e.Get("SYNDICATE_OVERRIDE")) } nc, err := s.Load() if err != nil { return err } o.ring, err = ring.LoadRing(bytes.NewReader(nc.Ring)) if err != nil { return fmt.Errorf("Error while loading ring for config get via srv lookup: %s", err) } err = ring.PersistRingOrBuilder(o.ring, nil, fmt.Sprintf("%s/ring/%d-%s.ring", o.cwd, o.ring.Version(), o.serviceName)) if err != nil { return err } o.localID = nc.Localid o.ring.SetLocalNode(o.localID) o.ringFile = fmt.Sprintf("%s/ring/%d-%s.ring", o.cwd, o.ring.Version(), o.serviceName) err = o.loadCmdCtrlConfig() if err != nil { return err } } else { // if you skip the srv load you have to provide all of the info in env vars! log.Println("Skipped SRV Config attempting to load from env") s, err := strconv.ParseUint(e.Get("LOCALID"), 10, 64) if err != nil { return fmt.Errorf("Unable to load env specified local id") } o.localID = s o.ringFile = e.Get("RING_FILE") o.ring, _, err = ring.RingOrBuilder(o.ringFile) if err != nil { return fmt.Errorf("Unable to road env specified ring: %s", err) } o.ring.SetLocalNode(o.localID) err = o.loadCmdCtrlConfig() if err != nil { return err } } return nil }
//ringBuilderPersisterFn is the default ring & builder persistence method used when a ring change is triggered. // It writes out first the builder file THEN the ring file. If the write of the builder file fails it immediately // returns an error. By default it writes changes to version-servicename.{builder|ring}. If renameMaster is true // it will instead write directly to servicename.{builder|ring} // TODO: if renameMaster is true we should just write to a tmp file and mv in place or the like func (s *Server) ringBuilderPersisterFn(c *RingChange, renameMaster bool) (error, error) { //Write Ring/Builder out to versioned file names if !renameMaster { if err := ring.PersistRingOrBuilder(nil, c.b, fmt.Sprintf("%s/%d-%s.builder", s.cfg.RingDir, c.v, s.servicename)); err != nil { return err, nil } if err := ring.PersistRingOrBuilder(c.r, nil, fmt.Sprintf("%s/%d-%s.ring", s.cfg.RingDir, c.v, s.servicename)); err != nil { return nil, err } return nil, nil } //Write Ring/Builder out to plain servicename.ring and servicename.builder files if err := ring.PersistRingOrBuilder(nil, c.b, fmt.Sprintf("%s/%s.builder", s.cfg.RingDir, s.servicename)); err != nil { return err, nil } if err := ring.PersistRingOrBuilder(c.r, nil, fmt.Sprintf("%s/%s.ring", s.cfg.RingDir, s.servicename)); err != nil { return nil, err } return nil, nil }