Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@tomclegg.ca>
+func (h *Handler) Done() <-chan struct{} {
+ return nil
+}
+
func neverRedirect(*http.Request, []*http.Request) error { return http.ErrUseLastResponse }
func (h *Handler) setup() {
func neverRedirect(*http.Request, []*http.Request) error { return http.ErrUseLastResponse }
func (h *Handler) setup() {
return disp.pool.CheckHealth()
}
return disp.pool.CheckHealth()
}
+// Done implements service.Handler.
+func (disp *dispatcher) Done() <-chan struct{} {
+ return disp.stopped
+}
+
// Stop dispatching containers and release resources. Typically used
// in tests.
func (disp *dispatcher) Close() {
// Stop dispatching containers and release resources. Typically used
// in tests.
func (disp *dispatcher) Close() {
type Handler interface {
http.Handler
CheckHealth() error
type Handler interface {
http.Handler
CheckHealth() error
}
type NewHandlerFunc func(_ context.Context, _ *arvados.Cluster, token string, registry *prometheus.Registry) Handler
}
type NewHandlerFunc func(_ context.Context, _ *arvados.Cluster, token string, registry *prometheus.Registry) Handler
logger.WithError(err).Errorf("error notifying init daemon")
}
go func() {
logger.WithError(err).Errorf("error notifying init daemon")
}
go func() {
+ // Shut down server if caller cancels context
<-ctx.Done()
srv.Close()
}()
<-ctx.Done()
srv.Close()
}()
+ go func() {
+ // Shut down server if handler dies
+ <-handler.Done()
+ srv.Close()
+ }()
err = srv.Wait()
if err != nil {
return 1
err = srv.Wait()
if err != nil {
return 1
func (eh errorHandler) CheckHealth() error {
return eh.err
}
func (eh errorHandler) CheckHealth() error {
return eh.err
}
+
+// Done returns a closed channel to indicate the service has
+// stopped/failed.
+func (eh errorHandler) Done() <-chan struct{} {
+ return doneChannel
+}
+
+var doneChannel = func() <-chan struct{} {
+ done := make(chan struct{})
+ close(done)
+ return done
+}()
+func (agg *Aggregator) Done() <-chan struct{} {
+ return nil
+}
+
func (agg *Aggregator) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
agg.setupOnce.Do(agg.setup)
sendErr := func(statusCode int, err error) {
func (agg *Aggregator) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
agg.setupOnce.Do(agg.setup)
sendErr := func(statusCode int, err error) {
+// Done implements service.Handler.
+func (srv *Server) Done() <-chan struct{} {
+ return nil
+}
+
func (srv *Server) run() {
var err error
if srv.RunOptions.Once {
func (srv *Server) run() {
var err error
if srv.RunOptions.Once {
+func (h *handler) Done() <-chan struct{} {
+ return nil
+}
+
func newHandlerOrErrorHandler(ctx context.Context, cluster *arvados.Cluster, token string, reg *prometheus.Registry) service.Handler {
var h handler
serviceURL, ok := service.URLFromContext(ctx)
func newHandlerOrErrorHandler(ctx context.Context, cluster *arvados.Cluster, token string, reg *prometheus.Registry) service.Handler {
var h handler
serviceURL, ok := service.URLFromContext(ctx)
handler *handler
mux *http.ServeMux
setupOnce sync.Once
handler *handler
mux *http.ServeMux
setupOnce sync.Once
lastReqID int64
lastReqMtx sync.Mutex
lastReqID int64
lastReqMtx sync.Mutex
rtr.setupOnce.Do(rtr.setup)
return rtr.eventSource.DBHealth()
}
rtr.setupOnce.Do(rtr.setup)
return rtr.eventSource.DBHealth()
}
+
+func (rtr *router) Done() <-chan struct{} {
+ return rtr.done
+}
"git.arvados.org/arvados.git/lib/cmd"
"git.arvados.org/arvados.git/lib/service"
"git.arvados.org/arvados.git/lib/cmd"
"git.arvados.org/arvados.git/lib/service"
QueueSize: cluster.API.WebsocketServerEventQueue,
Logger: ctxlog.FromContext(ctx),
}
QueueSize: cluster.API.WebsocketServerEventQueue,
Logger: ctxlog.FromContext(ctx),
}
+ done := make(chan struct{})
go func() {
eventSource.Run()
ctxlog.FromContext(ctx).Error("event source stopped")
go func() {
eventSource.Run()
ctxlog.FromContext(ctx).Error("event source stopped")
- if !testMode {
- os.Exit(1)
- }
}()
eventSource.WaitReady()
if err := eventSource.DBHealth(); err != nil {
}()
eventSource.WaitReady()
if err := eventSource.DBHealth(); err != nil {
client: client,
eventSource: eventSource,
newPermChecker: func() permChecker { return newPermChecker(*client) },
client: client,
eventSource: eventSource,
newPermChecker: func() permChecker { return newPermChecker(*client) },