replace gracehttp.Handler with http.Server for maximum control
this is a backward incompatible change as such. http.Server is a superset of what gracehttp.Handler was and the fix is trivial.
This commit is contained in:
parent
6bda16a267
commit
792bc8817c
@ -21,9 +21,9 @@ var (
|
|||||||
func main() {
|
func main() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
gracehttp.Serve(
|
gracehttp.Serve(
|
||||||
gracehttp.Handler{*address0, newHandler("Zero ")},
|
&http.Server{Addr: *address0, Handler: newHandler("Zero ")},
|
||||||
gracehttp.Handler{*address1, newHandler("First ")},
|
&http.Server{Addr: *address1, Handler: newHandler("First ")},
|
||||||
gracehttp.Handler{*address2, newHandler("Second")},
|
&http.Server{Addr: *address2, Handler: newHandler("Second")},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,12 +14,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Handler struct {
|
type serverSlice []*http.Server
|
||||||
Addr string
|
|
||||||
Handler http.Handler
|
|
||||||
}
|
|
||||||
|
|
||||||
type handlersSlice []Handler
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
verbose = flag.Bool("gracehttp.log", true, "Enable logging.")
|
verbose = flag.Bool("gracehttp.log", true, "Enable logging.")
|
||||||
@ -27,9 +22,9 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Creates new listeners for all the given addresses.
|
// Creates new listeners for all the given addresses.
|
||||||
func (handlers handlersSlice) newListeners() ([]grace.Listener, error) {
|
func (servers serverSlice) newListeners() ([]grace.Listener, error) {
|
||||||
listeners := make([]grace.Listener, len(handlers))
|
listeners := make([]grace.Listener, len(servers))
|
||||||
for index, pair := range handlers {
|
for index, pair := range servers {
|
||||||
addr, err := net.ResolveTCPAddr("tcp", pair.Addr)
|
addr, err := net.ResolveTCPAddr("tcp", pair.Addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf(
|
return nil, fmt.Errorf(
|
||||||
@ -45,14 +40,14 @@ func (handlers handlersSlice) newListeners() ([]grace.Listener, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Serve on the given listeners and wait for signals.
|
// Serve on the given listeners and wait for signals.
|
||||||
func (handlers handlersSlice) serveWait(listeners []grace.Listener) error {
|
func (servers serverSlice) serveWait(listeners []grace.Listener) error {
|
||||||
if len(handlers) != len(listeners) {
|
if len(servers) != len(listeners) {
|
||||||
return errListenersCount
|
return errListenersCount
|
||||||
}
|
}
|
||||||
errch := make(chan error, len(listeners)+1) // listeners + grace.Wait
|
errch := make(chan error, len(listeners)+1) // listeners + grace.Wait
|
||||||
for i, l := range listeners {
|
for i, l := range listeners {
|
||||||
go func(i int, l net.Listener) {
|
go func(i int, l net.Listener) {
|
||||||
err := http.Serve(l, handlers[i].Handler)
|
err := servers[i].Serve(l)
|
||||||
// The underlying Accept() will return grace.ErrAlreadyClosed
|
// The underlying Accept() will return grace.ErrAlreadyClosed
|
||||||
// when a signal to do the same is returned, which we are okay with.
|
// when a signal to do the same is returned, which we are okay with.
|
||||||
if err != nil && err != grace.ErrAlreadyClosed {
|
if err != nil && err != grace.ErrAlreadyClosed {
|
||||||
@ -74,8 +69,8 @@ func (handlers handlersSlice) serveWait(listeners []grace.Listener) error {
|
|||||||
// Serve will serve the given pairs of addresses and listeners and
|
// Serve will serve the given pairs of addresses and listeners and
|
||||||
// will monitor for signals allowing for graceful termination (SIGTERM)
|
// will monitor for signals allowing for graceful termination (SIGTERM)
|
||||||
// or restart (SIGUSR2).
|
// or restart (SIGUSR2).
|
||||||
func Serve(givenHandlers ...Handler) error {
|
func Serve(servers ...*http.Server) error {
|
||||||
handlers := handlersSlice(givenHandlers)
|
sslice := serverSlice(servers)
|
||||||
listeners, err := grace.Inherit()
|
listeners, err := grace.Inherit()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
err = grace.CloseParent()
|
err = grace.CloseParent()
|
||||||
@ -93,7 +88,7 @@ func Serve(givenHandlers ...Handler) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if err == grace.ErrNotInheriting {
|
} else if err == grace.ErrNotInheriting {
|
||||||
listeners, err = handlers.newListeners()
|
listeners, err = sslice.newListeners()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -103,7 +98,7 @@ func Serve(givenHandlers ...Handler) error {
|
|||||||
} else {
|
} else {
|
||||||
return fmt.Errorf("Failed graceful handoff: %s", err)
|
return fmt.Errorf("Failed graceful handoff: %s", err)
|
||||||
}
|
}
|
||||||
err = handlers.serveWait(listeners)
|
err = sslice.serveWait(listeners)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -33,9 +33,9 @@ func main() {
|
|||||||
log.Fatalf("Error writing startup json: %s", err)
|
log.Fatalf("Error writing startup json: %s", err)
|
||||||
}
|
}
|
||||||
err = gracehttp.Serve(
|
err = gracehttp.Serve(
|
||||||
gracehttp.Handler{*address0, newHandler()},
|
&http.Server{Addr: *address0, Handler: newHandler()},
|
||||||
gracehttp.Handler{*address1, newHandler()},
|
&http.Server{Addr: *address1, Handler: newHandler()},
|
||||||
gracehttp.Handler{*address2, newHandler()},
|
&http.Server{Addr: *address2, Handler: newHandler()},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error in gracehttp.Serve: %s", err)
|
log.Fatalf("Error in gracehttp.Serve: %s", err)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user