package main
import (
- "context"
"net/http"
"os"
"os/signal"
+ "sync"
"syscall"
"time"
"git.curoverse.com/arvados.git/sdk/go/arvados"
"git.curoverse.com/arvados.git/sdk/go/auth"
- "git.curoverse.com/arvados.git/sdk/go/ctxlog"
"github.com/julienschmidt/httprouter"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/sirupsen/logrus"
Metrics *metrics
httpHandler http.Handler
+ setupOnce sync.Once
Logger logrus.FieldLogger
Dumper logrus.FieldLogger
}
// Start sets up and runs the balancer.
-func (srv *Server) Start(ctx context.Context) {
- srv.init(ctx)
-
- var err error
- if srv.RunOptions.Once {
- _, err = srv.runOnce()
- } else {
- err = srv.runForever(nil)
- }
- if err != nil {
- srv.Logger.Error(err)
- }
+func (srv *Server) Start() {
+ srv.setupOnce.Do(srv.setup)
+ go srv.run()
}
-func (srv *Server) init(ctx context.Context) {
- if srv.RunOptions.Logger == nil {
- srv.RunOptions.Logger = ctxlog.FromContext(ctx)
- }
-
- srv.Logger = srv.RunOptions.Logger
- srv.Dumper = srv.RunOptions.Dumper
-
+func (srv *Server) setup() {
if srv.Cluster.ManagementToken == "" {
srv.httpHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "Management API authentication is not configured", http.StatusForbidden)
}
}
+func (srv *Server) run() {
+ var err error
+ if srv.RunOptions.Once {
+ _, err = srv.runOnce()
+ } else {
+ err = srv.runForever(nil)
+ }
+ if err != nil {
+ srv.Logger.Error(err)
+ }
+}
+
func (srv *Server) runOnce() (*Balancer, error) {
bal := &Balancer{
Logger: srv.Logger,