From 0d86dca852aad4a531f4c1dd40b4528c796023a5 Mon Sep 17 00:00:00 2001 From: Ammar Bandukwala Date: Wed, 20 Mar 2024 11:53:32 -0500 Subject: [PATCH] fix(codersdk): abort in-progress writes/reads when closing websocket (#12650) Fixes #9203 Related #12065 Also, adds some basic tracing infrastructure that we can build upon for more improvements. --- cli/root.go | 17 +++++++++++++++++ codersdk/websocket.go | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/cli/root.go b/cli/root.go index a5c77417bf..88af2860ed 100644 --- a/cli/root.go +++ b/cli/root.go @@ -18,6 +18,7 @@ import ( "os/signal" "path/filepath" "runtime" + "runtime/trace" "strings" "syscall" "text/tabwriter" @@ -139,6 +140,22 @@ func (r *RootCmd) AGPL() []*serpent.Command { // Main is the entrypoint for the Coder CLI. func (r *RootCmd) RunMain(subcommands []*serpent.Command) { + // This configuration is not available as a standard option because we + // want to trace the entire program, including Options parsing. + goTraceFilePath, ok := os.LookupEnv("CODER_GO_TRACE") + if ok { + traceFile, err := os.OpenFile(goTraceFilePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0o644) + if err != nil { + panic(fmt.Sprintf("failed to open trace file: %v", err)) + } + defer traceFile.Close() + + if err := trace.Start(traceFile); err != nil { + panic(fmt.Sprintf("failed to start trace: %v", err)) + } + defer trace.Stop() + } + rand.Seed(time.Now().UnixMicro()) cmd, err := r.Command(subcommands) diff --git a/codersdk/websocket.go b/codersdk/websocket.go index a872c20197..5b55ca8c3f 100644 --- a/codersdk/websocket.go +++ b/codersdk/websocket.go @@ -32,7 +32,7 @@ func (c *wsNetConn) Write(b []byte) (n int, err error) { } func (c *wsNetConn) Close() error { - defer c.cancel() + c.cancel() return c.Conn.Close() }