X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d904fbcd2e67054784954c0af54ef8758a37f5ea..a88aa282a8da52589053244f4ef41283d51f629a:/lib/boot/supervisor.go diff --git a/lib/boot/supervisor.go b/lib/boot/supervisor.go index 4b15266006..ddc17953d2 100644 --- a/lib/boot/supervisor.go +++ b/lib/boot/supervisor.go @@ -113,28 +113,24 @@ func (super *Supervisor) Start(ctx context.Context) { super.done = make(chan struct{}) sigch := make(chan os.Signal) - signal.Notify(sigch, syscall.SIGINT, syscall.SIGTERM) - defer signal.Stop(sigch) + signal.Notify(sigch, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP) go func() { - for sig := range sigch { - super.logger.WithField("signal", sig).Info("caught signal") - if super.err == nil { - super.err = fmt.Errorf("caught signal %s", sig) - } - super.cancel() - } - }() - - hupch := make(chan os.Signal) - signal.Notify(hupch, syscall.SIGHUP) - defer signal.Stop(hupch) - go func() { - for sig := range hupch { - super.logger.WithField("signal", sig).Info("caught signal") - if super.err == nil { - super.err = errNeedConfigReload + defer signal.Stop(sigch) + for { + select { + case <-ctx.Done(): + return + case sig := <-sigch: + super.logger.WithField("signal", sig).Info("caught signal") + if super.err == nil { + if sig == syscall.SIGHUP { + super.err = errNeedConfigReload + } else { + super.err = fmt.Errorf("caught signal %s", sig) + } + } + super.cancel() } - super.cancel() } }() @@ -251,13 +247,9 @@ func (super *Supervisor) runCluster() error { } if super.ListenHost == "" { - if urlhost := super.cluster.Services.Controller.ExternalURL.Host; urlhost != "" { - if h, _, _ := net.SplitHostPort(urlhost); h != "" { - super.ListenHost = h - } else { - super.ListenHost = urlhost - } - } else { + u := url.URL(super.cluster.Services.Controller.ExternalURL) + super.ListenHost = u.Hostname() + if super.ListenHost == "" { super.ListenHost = "0.0.0.0" } } @@ -370,14 +362,14 @@ func (super *Supervisor) runCluster() error { runServiceCommand{name: "keepstore", svc: super.cluster.Services.Keepstore}, runServiceCommand{name: "keep-web", svc: super.cluster.Services.WebDAV}, runServiceCommand{name: "ws", svc: super.cluster.Services.Websocket, depends: []supervisedTask{seedDatabase{}}}, - installPassenger{src: "services/api"}, - runPassenger{src: "services/api", varlibdir: "railsapi", svc: super.cluster.Services.RailsAPI, depends: []supervisedTask{createCertificates{}, seedDatabase{}, installPassenger{src: "services/api"}}}, + installPassenger{src: "services/api", varlibdir: "railsapi"}, + runPassenger{src: "services/api", varlibdir: "railsapi", svc: super.cluster.Services.RailsAPI, depends: []supervisedTask{createCertificates{}, seedDatabase{}, installPassenger{src: "services/api", varlibdir: "railsapi"}}}, seedDatabase{}, } if !super.NoWorkbench1 { tasks = append(tasks, - installPassenger{src: "apps/workbench", depends: []supervisedTask{seedDatabase{}}}, // dependency ensures workbench doesn't delay api install/startup - runPassenger{src: "apps/workbench", varlibdir: "workbench1", svc: super.cluster.Services.Workbench1, depends: []supervisedTask{installPassenger{src: "apps/workbench"}}}, + installPassenger{src: "apps/workbench", varlibdir: "workbench1", depends: []supervisedTask{seedDatabase{}}}, // dependency ensures workbench doesn't delay api install/startup + runPassenger{src: "apps/workbench", varlibdir: "workbench1", svc: super.cluster.Services.Workbench1, depends: []supervisedTask{installPassenger{src: "apps/workbench", varlibdir: "workbench1"}}}, ) } if !super.NoWorkbench2 { @@ -387,10 +379,14 @@ func (super *Supervisor) runCluster() error { } if super.ClusterType != "test" { tasks = append(tasks, - runServiceCommand{name: "dispatch-cloud", svc: super.cluster.Services.DispatchCloud}, runServiceCommand{name: "keep-balance", svc: super.cluster.Services.Keepbalance}, ) } + if super.cluster.Containers.CloudVMs.Enable { + tasks = append(tasks, + runServiceCommand{name: "dispatch-cloud", svc: super.cluster.Services.DispatchCloud}, + ) + } super.tasksReady = map[string]chan bool{} for _, task := range tasks { super.tasksReady[task.String()] = make(chan bool) @@ -467,6 +463,7 @@ func (super *Supervisor) WaitReady() bool { super.logger.Infof("waiting for %s to be ready", id) if !super2.WaitReady() { super.logger.Infof("%s startup failed", id) + super.Stop() return false } super.logger.Infof("%s is ready", id) @@ -480,6 +477,7 @@ func (super *Supervisor) WaitReady() bool { select { case <-ticker.C: case <-super.ctx.Done(): + super.Stop() return false } if super.healthChecker == nil { @@ -824,9 +822,6 @@ func (super *Supervisor) autofillConfig() error { &super.cluster.Services.Workbench1, &super.cluster.Services.Workbench2, } { - if svc == &super.cluster.Services.DispatchCloud && super.ClusterType == "test" { - continue - } if svc.ExternalURL.Host == "" { port, err := nextPort(defaultExtHost) if err != nil { @@ -847,7 +842,8 @@ func (super *Supervisor) autofillConfig() error { } } if super.NoWorkbench1 && svc == &super.cluster.Services.Workbench1 || - super.NoWorkbench2 && svc == &super.cluster.Services.Workbench2 { + super.NoWorkbench2 && svc == &super.cluster.Services.Workbench2 || + !super.cluster.Containers.CloudVMs.Enable && svc == &super.cluster.Services.DispatchCloud { // When workbench1 is disabled, it gets an // ExternalURL (so we have a valid listening // port to write in our Nginx config) but no