func main() { rootConfig, err := config.NewConfig(os.Args) logger := rootConfig.Logger err = rootConfig.Validate() if err != nil { logger.Fatal("Error validating config:", err, lager.Data{"config": rootConfig}) } go func() { logger.Info(fmt.Sprintf("Starting profiling server on port %d", rootConfig.ProfilerPort)) err := http.ListenAndServe(fmt.Sprintf("0.0.0.0:%d", rootConfig.ProfilerPort), nil) if err != nil { logger.Error("profiler failed with error", err) } }() if _, err := os.Stat(rootConfig.StaticDir); os.IsNotExist(err) { logger.Fatal(fmt.Sprintf("staticDir: %s does not exist", rootConfig.StaticDir), nil) } backends := domain.NewBackends(rootConfig.Proxy.Backends, logger) arpManager := domain.NewArmManager(logger) cluster := domain.NewCluster( backends, rootConfig.Proxy.HealthcheckTimeout(), logger, arpManager, ) handler := api.NewHandler(backends, logger, rootConfig.API, rootConfig.StaticDir) members := grouper.Members{ { Name: "proxy", Runner: proxy.NewRunner(cluster, rootConfig.Proxy.Port, logger), }, { Name: "api", Runner: api.NewRunner(rootConfig.API.Port, handler, logger), }, } if rootConfig.HealthPort != rootConfig.API.Port { members = append(members, grouper.Member{ Name: "health", Runner: health.NewRunner(rootConfig.HealthPort, logger), }) } group := grouper.NewDynamic(os.Kill, len(members), len(members)) process := ifrit.Invoke(group) inserter := group.Client().Inserter() for _, member := range members { inserter <- member } group.Client().Close() err = waitUntilReady(process, logger) if err != nil { logger.Fatal("Error starting switchboard", err, lager.Data{"proxyConfig": rootConfig.Proxy}) } logger.Info("Proxy started", lager.Data{"proxyConfig": rootConfig.Proxy}) err = ioutil.WriteFile(rootConfig.PidFile, []byte(strconv.Itoa(os.Getpid())), 0644) if err == nil { logger.Info(fmt.Sprintf("Wrote pidFile to %s", rootConfig.PidFile)) } else { logger.Fatal("Cannot write pid to file", err, lager.Data{"pidFile": rootConfig.PidFile}) } err = <-process.Wait() if err != nil { logger.Fatal("Switchboard exited unexpectedly", err, lager.Data{"proxyConfig": rootConfig.Proxy}) } }
for b := range c { result = append(result, b) } return result } JustBeforeEach(func() { logger := lagertest.NewTestLogger("Backends test") backendConfigs := []config.Backend{ {"localhost", 50000, 60000, "status", "backend-0"}, {"localhost", 50001, 60001, "status", "backend-1"}, {"localhost", 50002, 60002, "status", "backend-2"}, } backends = domain.NewBackends(backendConfigs, logger) }) Describe("Concurrent operations", func() { It("do not result in a race", func() { readySetGo := make(chan interface{}) doneChans := []chan interface{}{ make(chan interface{}), make(chan interface{}), make(chan interface{}), make(chan interface{}), make(chan interface{}), } backend := backends.Any()