diff --git a/cmd/ipfs/daemon.go b/cmd/ipfs/daemon.go index 9d2ca2269..01c111935 100644 --- a/cmd/ipfs/daemon.go +++ b/cmd/ipfs/daemon.go @@ -448,6 +448,7 @@ func serveHTTPApi(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, error corehttp.VersionOption(), defaultMux("/debug/vars"), defaultMux("/debug/pprof/"), + corehttp.MutexFractionOption("/debug/pprof-mutex/"), corehttp.MetricsScrapingOption("/debug/metrics/prometheus"), corehttp.LogOption(), } diff --git a/core/corehttp/mutex_profile.go b/core/corehttp/mutex_profile.go new file mode 100644 index 000000000..db39a7bc9 --- /dev/null +++ b/core/corehttp/mutex_profile.go @@ -0,0 +1,45 @@ +package corehttp + +import ( + "net" + "net/http" + "runtime" + "strconv" + + core "github.com/ipfs/go-ipfs/core" +) + +// MutexFractionOption allows to set runtime.SetMutexProfileFraction via HTTP +// using POST request with parameter 'fraction'. +func MutexFractionOption(path string) ServeOption { + return func(_ *core.IpfsNode, _ net.Listener, mux *http.ServeMux) (*http.ServeMux, error) { + mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + if err := r.ParseForm(); err != nil { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(err.Error())) + return + } + + asfr := r.Form.Get("fraction") + if len(asfr) == 0 { + w.WriteHeader(http.StatusBadRequest) + return + } + + fr, err := strconv.Atoi(asfr) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(err.Error())) + return + } + log.Infof("Setting MutexProfileFraction to %d", fr) + runtime.SetMutexProfileFraction(fr) + }) + + return mux, nil + } +} diff --git a/test/sharness/t0110-gateway.sh b/test/sharness/t0110-gateway.sh index 8c5d4982f..89901a22f 100755 --- a/test/sharness/t0110-gateway.sh +++ b/test/sharness/t0110-gateway.sh @@ -106,6 +106,21 @@ test_expect_success "output only has one transfer encoding header" ' test_cmp tecount_out tecount_exp ' +curl_pprofmutex() { + curl -f -X POST "http://127.0.0.1:$apiport/debug/pprof-mutex/?fraction=$1" +} + +test_expect_success "set mutex fraction for pprof (negative so it doesn't enable)" ' + curl_pprofmutex -1 +' + +test_expect_success "test failure conditions of mutex pprof endpoint" ' + test_must_fail curl_pprofmutex && + test_must_fail curl_pprofmutex that_is_string && + test_must_fail curl -f -X GET "http://127.0.0.1:$apiport/debug/pprof-mutex/?fraction=-1" +' + + test_expect_success "setup index hash" ' mkdir index && echo "
" > index/index.html &&