Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions cmd/livepeer/starter/starter.go
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,12 @@ func StartLivepeer(ctx context.Context, cfg LivepeerConfig) {
}
// Initialize LB transcoder
n.Transcoder = core.NewLoadBalancingTranscoder(devices, tf)
// Store self-check function for on-demand transcoder health verification
selfCheckDevices, selfCheckFactory := devices, tf
n.TranscoderSelfCheck = func() error {
_, err := core.TestTranscoderCapabilities(selfCheckDevices, selfCheckFactory)
return err
}
} else {
// for local software mode, enable most capabilities but remove expensive decoders and non-H264 encoders
capsToRemove := []core.Capability{core.Capability_HEVC_Decode, core.Capability_HEVC_Encode, core.Capability_VP8_Encode, core.Capability_VP9_Decode, core.Capability_VP9_Encode}
Expand Down
1 change: 1 addition & 0 deletions core/livepeernode.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ type LivepeerNode struct {
OrchSecret string
Transcoder Transcoder
TranscoderManager *RemoteTranscoderManager
TranscoderSelfCheck func() error // Re-runs GPU transcoding capability test; set at startup
Balances *AddressBalances
Capabilities *Capabilities
ExternalCapabilities *ExternalCapabilities
Expand Down
27 changes: 27 additions & 0 deletions server/webserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package server

import (
"flag"
"fmt"
"net/http"

// pprof adds handlers to default mux via `init()`
Expand Down Expand Up @@ -112,10 +113,36 @@ func (s *LivepeerServer) cliWebServerHandlers(bindAddr string) *http.ServeMux {
mux.Handle("/getLogLevel", getLogLevelHandler())
mux.Handle("/debug", s.debugHandler())

// Health check
mux.Handle("/self-check", s.selfCheckHandler())

// Metrics
if monitor.Enabled {
mux.Handle("/metrics", monitor.Exporter)
}

return mux
}

func (s *LivepeerServer) selfCheckHandler() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed. Use POST.", http.StatusMethodNotAllowed)
return
}
selfCheck := s.LivepeerNode.TranscoderSelfCheck
if selfCheck == nil {
http.Error(w, "Self-check not available: node is not configured as a transcoder with hardware acceleration", http.StatusServiceUnavailable)
return
}
glog.Info("Running transcoder self-check...")
if err := selfCheck(); err != nil {
glog.Errorf("Transcoder self-check failed: %v", err)
http.Error(w, fmt.Sprintf("Self-check FAILED: %v", err), http.StatusServiceUnavailable)
return
}
glog.Info("Transcoder self-check passed")
w.WriteHeader(http.StatusOK)
fmt.Fprint(w, "Self-check PASSED: transcoder capabilities verified")
})
}
Loading