diff --git a/libnetwork/diagnose/diagnose.go b/libnetwork/diagnose/diagnose.go index 2849397486..7e299cc254 100644 --- a/libnetwork/diagnose/diagnose.go +++ b/libnetwork/diagnose/diagnose.go @@ -4,6 +4,7 @@ import ( "fmt" "net" "net/http" + "strconv" "sync" "github.com/sirupsen/logrus" @@ -81,7 +82,7 @@ func (n *Server) EnableDebug(ip string, port int) { // go func() { // http.Serve(n.sk, n.mux) // }() - http.ListenAndServe(":8000", n.mux) + http.ListenAndServe(":"+strconv.Itoa(port), n.mux) } // DisableDebug stop the dubug and closes the tcp socket diff --git a/libnetwork/networkdb/networkdbdiagnose.go b/libnetwork/networkdb/networkdbdiagnose.go index d70cec7bb6..01429a5381 100644 --- a/libnetwork/networkdb/networkdbdiagnose.go +++ b/libnetwork/networkdb/networkdbdiagnose.go @@ -5,7 +5,9 @@ import ( "net/http" "strings" + stackdump "github.com/docker/docker/pkg/signal" "github.com/docker/libnetwork/diagnose" + "github.com/sirupsen/logrus" ) const ( @@ -24,6 +26,7 @@ var NetDbPaths2Func = map[string]diagnose.HTTPHandlerFunc{ "/deleteentry": dbDeleteEntry, "/getentry": dbGetEntry, "/gettable": dbGetTable, + "/dump": dbStackTrace, } func dbJoin(ctx interface{}, w http.ResponseWriter, r *http.Request) { @@ -240,3 +243,12 @@ func dbGetTable(ctx interface{}, w http.ResponseWriter, r *http.Request) { } } } + +func dbStackTrace(ctx interface{}, w http.ResponseWriter, r *http.Request) { + path, err := stackdump.DumpStacks("/tmp/") + if err != nil { + logrus.WithError(err).Error("failed to write goroutines dump") + } else { + fmt.Fprintf(w, "goroutine stacks written to %s", path) + } +} diff --git a/libnetwork/test/networkDb/Dockerfile b/libnetwork/test/networkDb/Dockerfile index 5dd7b20e8f..f30a6b423c 100644 --- a/libnetwork/test/networkDb/Dockerfile +++ b/libnetwork/test/networkDb/Dockerfile @@ -1,5 +1,7 @@ FROM alpine +RUN apk --no-cache add curl + COPY testMain /app/ WORKDIR app