Skip to content

x/tools/cmd/gopls: data race on (*Server).client #30091

Closed
@pwaller

Description

@pwaller

What version of Go are you using (go version)?

$ go version
go version devel +4b3f04c63b Thu Jan 10 18:15:48 2019 +0000 linux/amd64

Does this issue reproduce with the latest release?

Yes, I am testing on 7f7074d (master at time of writing) with the recent patch for URI escaping applied.

git fetch https://go.googlesource.com/tools refs/changes/77/161077/2 && git cherry-pick FETCH_HEAD

What did you do?

Compile gopls with -race. Use cmd/gopls/forward. Use vscode-go. I am working out of my $GOPATH using modules, and have GO111MODULE=on.

I then did some development using vscode and observed the crash. Afraid I don't have a precise sequence to reproduce, but I wasn't doing anything fancy beyond just using the editor to edit code and perhaps jump to definition.

What did you expect to see?

Things working as normal.

What did you see instead?

The race detector reports warnings and then some time later I also encounter a panic with a nil pointer dereference. I'm including the nil dereference since these may be related?

Nil pointer dereference panic:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x8e7976]

goroutine 20 [running]:
golang.org/x/tools/internal/lsp/cmd.(*Server).Run.func1(0xc004582700, 0xc004582440, 0xffffffffffffffff, 0xc0045568e8, 0x8, 0x0, 0x0)
	/home/pwaller/.local/src/golang.org/x/tools/internal/lsp/cmd/server.go:104 +0x306
golang.org/x/tools/internal/jsonrpc2.(*Conn).run(0xc0001a7e30, 0xa77d00, 0xc0000bc010, 0x0, 0x0)
	/home/pwaller/.local/src/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go:332 +0x895
golang.org/x/tools/internal/jsonrpc2.NewConn.func4(0xc0001a7e30, 0xa77d00, 0xc0000bc010)
	/home/pwaller/.local/src/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go:110 +0x51
created by golang.org/x/tools/internal/jsonrpc2.NewConn
	/home/pwaller/.local/src/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go:109 +0x261

Data race warnings:

==================
WARNING: DATA RACE
Read at 0x00c00010e640 by goroutine 9:
  golang.org/x/tools/internal/lsp.(*server).cacheAndDiagnose.func1()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/diagnostics.go:29 +0x11b

Previous write at 0x00c00010e640 by goroutine 7:
  golang.org/x/tools/internal/lsp.RunServerOnPort.func1()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/server.go:51 +0xfc

Goroutine 9 (running) created at:
  golang.org/x/tools/internal/lsp.(*server).cacheAndDiagnose()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/diagnostics.go:23 +0x14e
  golang.org/x/tools/internal/lsp.(*server).DidOpen()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/server.go:176 +0xae
  golang.org/x/tools/internal/lsp/protocol.serverHandler.func1()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/protocol/server.go:147 +0x1e37
  golang.org/x/tools/internal/jsonrpc2.(*Conn).run()
      /home/pwaller/.local/src/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go:321 +0xa39
  golang.org/x/tools/internal/jsonrpc2.NewConn.func4()
      /home/pwaller/.local/src/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go:110 +0x50

Goroutine 7 (running) created at:
  golang.org/x/tools/internal/lsp.RunServerOnPort()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/server.go:48 +0x2a7
  golang.org/x/tools/internal/lsp/cmd.(*Server).Run()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/cmd/server.go:113 +0x1f5
  golang.org/x/tools/internal/tool.Main.func2()
      /home/pwaller/.local/src/golang.org/x/tools/internal/tool/tool.go:130 +0xb6
  golang.org/x/tools/internal/tool.Main()
      /home/pwaller/.local/src/golang.org/x/tools/internal/tool/tool.go:131 +0x29f
  golang.org/x/tools/internal/lsp/cmd.(*Application).Run()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/cmd/cmd.go:67 +0x546
  golang.org/x/tools/internal/tool.Main.func2()
      /home/pwaller/.local/src/golang.org/x/tools/internal/tool/tool.go:130 +0xb6
  golang.org/x/tools/internal/tool.Main()
      /home/pwaller/.local/src/golang.org/x/tools/internal/tool/tool.go:131 +0x29f
  main.main()
      /home/pwaller/.local/src/golang.org/x/tools/cmd/gopls/main.go:20 +0x128
==================
==================
WARNING: DATA RACE
Read at 0x00c000102098 by goroutine 9:
  golang.org/x/tools/internal/lsp/protocol.(*clientDispatcher).PublishDiagnostics()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/protocol/client.go:188 +0x3e
  golang.org/x/tools/internal/lsp.(*server).cacheAndDiagnose.func1()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/diagnostics.go:29 +0x15b

Previous write at 0x00c000102098 by goroutine 7:
  golang.org/x/tools/internal/lsp/protocol.RunServer()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/protocol/protocol.go:27 +0x1a6
  golang.org/x/tools/internal/lsp.RunServerOnPort.func1()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/server.go:49 +0xb7

Goroutine 9 (running) created at:
  golang.org/x/tools/internal/lsp.(*server).cacheAndDiagnose()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/diagnostics.go:23 +0x14e
  golang.org/x/tools/internal/lsp.(*server).DidOpen()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/server.go:176 +0xae
  golang.org/x/tools/internal/lsp/protocol.serverHandler.func1()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/protocol/server.go:147 +0x1e37
  golang.org/x/tools/internal/jsonrpc2.(*Conn).run()
      /home/pwaller/.local/src/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go:321 +0xa39
  golang.org/x/tools/internal/jsonrpc2.NewConn.func4()
      /home/pwaller/.local/src/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go:110 +0x50

Goroutine 7 (running) created at:
  golang.org/x/tools/internal/lsp.RunServerOnPort()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/server.go:48 +0x2a7
  golang.org/x/tools/internal/lsp/cmd.(*Server).Run()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/cmd/server.go:113 +0x1f5
  golang.org/x/tools/internal/tool.Main.func2()
      /home/pwaller/.local/src/golang.org/x/tools/internal/tool/tool.go:130 +0xb6
  golang.org/x/tools/internal/tool.Main()
      /home/pwaller/.local/src/golang.org/x/tools/internal/tool/tool.go:131 +0x29f
  golang.org/x/tools/internal/lsp/cmd.(*Application).Run()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/cmd/cmd.go:67 +0x546
  golang.org/x/tools/internal/tool.Main.func2()
      /home/pwaller/.local/src/golang.org/x/tools/internal/tool/tool.go:130 +0xb6
  golang.org/x/tools/internal/tool.Main()
      /home/pwaller/.local/src/golang.org/x/tools/internal/tool/tool.go:131 +0x29f
  main.main()
      /home/pwaller/.local/src/golang.org/x/tools/cmd/gopls/main.go:20 +0x128
==================
==================
WARNING: DATA RACE
Write at 0x00c00010e668 by goroutine 8:
  golang.org/x/tools/internal/lsp.(*server).setContent()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/diagnostics.go:44 +0x128
  golang.org/x/tools/internal/lsp.(*server).cacheAndDiagnose()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/diagnostics.go:20 +0xea
  golang.org/x/tools/internal/lsp.(*server).DidOpen()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/server.go:176 +0xae
  golang.org/x/tools/internal/lsp/protocol.serverHandler.func1()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/protocol/server.go:147 +0x1e37
  golang.org/x/tools/internal/jsonrpc2.(*Conn).run()
      /home/pwaller/.local/src/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go:321 +0xa39
  golang.org/x/tools/internal/jsonrpc2.NewConn.func4()
      /home/pwaller/.local/src/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go:110 +0x50

Previous read at 0x00c00010e668 by goroutine 9:
  golang.org/x/tools/internal/lsp.(*server).cacheAndDiagnose.func1()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/diagnostics.go:31 +0x218

Goroutine 8 (running) created at:
  golang.org/x/tools/internal/jsonrpc2.NewConn()
      /home/pwaller/.local/src/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go:109 +0x260
  golang.org/x/tools/internal/lsp/protocol.RunServer()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/protocol/protocol.go:26 +0x179
  golang.org/x/tools/internal/lsp.RunServerOnPort.func1()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/server.go:49 +0xb7

Goroutine 9 (running) created at:
  golang.org/x/tools/internal/lsp.(*server).cacheAndDiagnose()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/diagnostics.go:23 +0x14e
  golang.org/x/tools/internal/lsp.(*server).DidOpen()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/server.go:176 +0xae
  golang.org/x/tools/internal/lsp/protocol.serverHandler.func1()
      /home/pwaller/.local/src/golang.org/x/tools/internal/lsp/protocol/server.go:147 +0x1e37
  golang.org/x/tools/internal/jsonrpc2.(*Conn).run()
      /home/pwaller/.local/src/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go:321 +0xa39
  golang.org/x/tools/internal/jsonrpc2.NewConn.func4()
      /home/pwaller/.local/src/golang.org/x/tools/internal/jsonrpc2/jsonrpc2.go:110 +0x50
==================

/cc @stamblerre

Metadata

Metadata

Assignees

No one assigned

    Labels

    FrozenDueToAgeNeedsFixThe path to resolution is known, but the work has not been done.goplsIssues related to the Go language server, gopls.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions