From 278cabecf3b881eb35194398cccb997b46edd4b0 Mon Sep 17 00:00:00 2001 From: Haowei Cai Date: Thu, 28 Mar 2019 16:55:03 -0700 Subject: [PATCH 1/2] document the usage of errCh Kubernetes-commit: 5809b6a4282f7ce58e0d815d9326289a8ee7ddb6 --- pkg/server/filters/timeout.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/server/filters/timeout.go b/pkg/server/filters/timeout.go index 56cd8a4ce..4ade375a2 100644 --- a/pkg/server/filters/timeout.go +++ b/pkg/server/filters/timeout.go @@ -92,7 +92,8 @@ func (t *timeoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - errCh := make(chan interface{}) + // resultCh is used as both errCh and stopCh + resultCh := make(chan interface{}) tw := newTimeoutWriter(w) go func() { defer func() { @@ -103,12 +104,13 @@ func (t *timeoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { buf = buf[:runtime.Stack(buf, false)] err = fmt.Sprintf("%v\n%s", err, buf) } - errCh <- err + resultCh <- err }() t.handler.ServeHTTP(tw, r) }() select { - case err := <-errCh: + case err := <-resultCh: + // panic if error occurs; stop otherwise if err != nil { panic(err) } From 4ff581692bc7ed7f18be66feb6326d8b8c41bb89 Mon Sep 17 00:00:00 2001 From: Haowei Cai Date: Mon, 1 Apr 2019 11:02:39 -0700 Subject: [PATCH 2/2] remove TrimSuffix and document buffer size Kubernetes-commit: 0e61b77826f23cbf835002a9eef5722bb1cfdf53 --- pkg/endpoints/handlers/rest.go | 5 +++-- pkg/server/filters/timeout.go | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/endpoints/handlers/rest.go b/pkg/endpoints/handlers/rest.go index 3728a3b77..5b76cfa45 100644 --- a/pkg/endpoints/handlers/rest.go +++ b/pkg/endpoints/handlers/rest.go @@ -25,7 +25,6 @@ import ( "net/http" "net/url" goruntime "runtime" - "strings" "time" "k8s.io/apimachinery/pkg/api/errors" @@ -195,10 +194,12 @@ func finishRequest(timeout time.Duration, fn resultFunc) (result runtime.Object, defer func() { panicReason := recover() if panicReason != nil { + // Same as stdlib http server code. Manually allocate stack + // trace buffer size to prevent excessively large logs const size = 64 << 10 buf := make([]byte, size) buf = buf[:goruntime.Stack(buf, false)] - panicReason = strings.TrimSuffix(fmt.Sprintf("%v\n%s", panicReason, string(buf)), "\n") + panicReason = fmt.Sprintf("%v\n%s", panicReason, buf) // Propagate to parent goroutine panicCh <- panicReason } diff --git a/pkg/server/filters/timeout.go b/pkg/server/filters/timeout.go index 4ade375a2..e79da50bf 100644 --- a/pkg/server/filters/timeout.go +++ b/pkg/server/filters/timeout.go @@ -99,6 +99,8 @@ func (t *timeoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { defer func() { err := recover() if err != nil { + // Same as stdlib http server code. Manually allocate stack + // trace buffer size to prevent excessively large logs const size = 64 << 10 buf := make([]byte, size) buf = buf[:runtime.Stack(buf, false)]