UPSTREAM: 74959: track poststarthook registration stacks for debugging
@@ -20,6 +20,7 @@ import (
"errors"
"fmt"
"net/http"
+ "runtime/debug"
"github.com/golang/glog"
@@ -58,6 +59,9 @@ type PostStartHookProvider interface {
type postStartHookEntry struct {
hook PostStartHookFunc
+ // originatingStack holds the stack that registered postStartHooks. This allows us to show a more helpful message
+ // for duplicate registration.
+ originatingStack string
// done will be closed when the postHook is finished
done chan struct{}
@@ -85,15 +89,16 @@ func (s *GenericAPIServer) AddPostStartHook(name string, hook PostStartHookFunc)
if s.postStartHooksCalled {
return fmt.Errorf("unable to add %q because PostStartHooks have already been called", name)
}
- if _, exists := s.postStartHooks[name]; exists {
- return fmt.Errorf("unable to add %q because it is already registered", name)
+ if postStartHook, exists := s.postStartHooks[name]; exists {
+ // this is programmer error, but it can be hard to debug
+ return fmt.Errorf("unable to add %q because it was already registered by: %s", name, postStartHook.originatingStack)
}
// done is closed when the poststarthook is finished. This is used by the health check to be able to indicate
// that the poststarthook is finished
done := make(chan struct{})
s.AddHealthzChecks(postStartHookHealthz{name: "poststarthook/" + name, done: done})
- s.postStartHooks[name] = postStartHookEntry{hook: hook, done: done}
+ s.postStartHooks[name] = postStartHookEntry{hook: hook, originatingStack: string(debug.Stack()), done: done}
return nil
}
