]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.r57] http/pprof: fix POST reading bug
authorRuss Cox <rsc@golang.org>
Tue, 3 May 2011 05:43:30 +0000 (01:43 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 3 May 2011 05:43:30 +0000 (01:43 -0400)
««« CL 4430075 / ca45c67d28cf
http/pprof: fix POST reading bug

R=bradfitz
CC=golang-dev
https://golang.org/cl/4430075
»»»

TBR=adg
CC=golang-dev
https://golang.org/cl/4454053

src/cmd/prof/gopprof
src/pkg/http/pprof/pprof.go

index 8fa00cbe8c5b41d84c5c6e0e2d94dc2970b5ae82..8863fc623842c4d6109ac80baa38aa792b00c182 100755 (executable)
@@ -2880,17 +2880,18 @@ sub FetchSymbols {
     my @toask = @pcs;
     while (@toask > 0) {
       my $n = @toask;
-      if ($n > 49) { $n = 49; }
+      # NOTE(rsc): Limiting the number of PCs requested per round
+      # used to be necessary, but I think it was a bug in
+      # debug/pprof/symbol's implementation.  Leaving here
+      # in case I am wrong.
+      #        if ($n > 49) { $n = 49; }
       my @thisround = @toask[0..$n];
-my $t = @toask;
-print STDERR "$n $t\n";
       @toask = @toask[($n+1)..(@toask-1)];
       my $post_data = join("+", sort((map {"0x" . "$_"} @thisround)));
       open(POSTFILE, ">$main::tmpfile_sym");
       print POSTFILE $post_data;
       close(POSTFILE);
 
-print STDERR "SYMBL!\n";
       my $url = SymbolPageURL();
       $url = ResolveRedirectionForCurl($url);
       my $command_line = "$CURL -sd '\@$main::tmpfile_sym' '$url'";
index bc79e218320cb9b0c4941866cc9fa01b85fe8ecb..917c7f877a32a5dedd1a40e8de72675b3a20c593 100644 (file)
@@ -26,6 +26,7 @@ package pprof
 
 import (
        "bufio"
+       "bytes"
        "fmt"
        "http"
        "os"
@@ -88,10 +89,14 @@ func Profile(w http.ResponseWriter, r *http.Request) {
 func Symbol(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "text/plain; charset=utf-8")
 
+       // We have to read the whole POST body before
+       // writing any output.  Buffer the output here.
+       var buf bytes.Buffer
+
        // We don't know how many symbols we have, but we
        // do have symbol information.  Pprof only cares whether
        // this number is 0 (no symbols available) or > 0.
-       fmt.Fprintf(w, "num_symbols: 1\n")
+       fmt.Fprintf(&buf, "num_symbols: 1\n")
 
        var b *bufio.Reader
        if r.Method == "POST" {
@@ -109,14 +114,19 @@ func Symbol(w http.ResponseWriter, r *http.Request) {
                if pc != 0 {
                        f := runtime.FuncForPC(uintptr(pc))
                        if f != nil {
-                               fmt.Fprintf(w, "%#x %s\n", pc, f.Name())
+                               fmt.Fprintf(&buf, "%#x %s\n", pc, f.Name())
                        }
                }
 
                // Wait until here to check for err; the last
                // symbol will have an err because it doesn't end in +.
                if err != nil {
+                       if err != os.EOF {
+                               fmt.Fprintf(&buf, "reading request: %v\n", err)
+                       }
                        break
                }
        }
+
+       w.Write(buf.Bytes())
 }