1
0
mirror of https://github.com/golang/go synced 2024-09-30 16:08:36 -06:00
go/godoc
Kevin Burke 96caea4103 godoc: fix runaway goroutine use
Previously we would spin up a new goroutine for every directory
we needed to parse. Since parent directories cannot exit until
children have exited, in large GOPATH directories we could have 8000+
goroutines evaluating directories concurrently. The race detector uses
tsan, and tsan can handle a maximum of 8192 concurrent threads at one
time.

Limit the number of concurrent threads. It is difficult to do this
in a way that does not involve a child being blocked on a parent
completing to spin up goroutines for itself to complete. Solve this by
completing work on the main thread if there are no additional workers
available to help complete work.

I was expecting limiting the concurrency to hurt performance, but it
actually significantly improves it. Benchmarks were performed using CL
94904 at tip, and with goroutines at 2, 4, and 8 times the number of
CPU's.

$ benchstat tip.benchmark gated-2.benchmark gated-4.benchmark gated-8.benchmark
name \ time/op    tip.benchmark  gated-2.benchmark  gated-4.benchmark  gated-8.benchmark
NewDirectory-4       293ms ± 2%         262ms ± 4%         252ms ± 4%         253ms ± 2%

name \ alloc/op   tip.benchmark  gated-2.benchmark  gated-4.benchmark  gated-8.benchmark
NewDirectory-4       218MB ± 0%         218MB ± 0%         218MB ± 0%         218MB ± 0%

name \ allocs/op  tip.benchmark  gated-2.benchmark  gated-4.benchmark  gated-8.benchmark
NewDirectory-4        513k ± 0%          508k ± 0%          509k ± 0%          510k ± 0%

Fixes golang/go#22110.

Change-Id: If01f78f1fc53cd195e4f8f6988c3c39b3c275992
Reviewed-on: https://go-review.googlesource.com/94955
Reviewed-by: Yury Smolsky <yury@smolsky.by>
Reviewed-by: Kevin Burke <kev@inburke.com>
2018-03-18 01:21:57 +00:00
..
analysis godoc: fix crash in -analysis 2017-06-13 17:41:52 +00:00
dl godoc/dl: provide JSON feed of releases 2018-02-23 16:36:39 +00:00
proxy godoc/proxy: remove unused cacheKey function 2018-01-05 02:11:35 +00:00
redirect x/tools/godoc: fix redirect to Gerrit 2017-07-31 16:24:22 +00:00
short godoc: hide appengine dependencies behind build tags 2016-01-04 23:08:03 +00:00
static godoc/static: add x/time subrepo 2018-03-17 16:38:46 +00:00
util tools: add import comments. 2014-12-09 22:42:16 +00:00
vfs godoc: don't try to follow all symlinks 2017-08-07 23:14:37 +00:00
appengine.go godoc: proxy /compile requests to play.golang.org 2018-01-04 23:58:58 +00:00
cmdline_test.go cmd/godoc: provide -all flag to output unexported identifiers 2018-03-16 16:52:36 +00:00
cmdline.go cmd/godoc: provide -all flag to output unexported identifiers 2018-03-16 16:52:36 +00:00
corpus.go godoc: init corpus in a separate goroutine in http mode 2018-02-13 20:23:58 +00:00
dirtrees.go godoc: fix runaway goroutine use 2018-03-18 01:21:57 +00:00
format.go go.tools/godoc: Fix jump-to-line in source view. 2013-08-01 11:52:25 +10:00
godoc17_test.go x/tools/cmd/godoc: fix broken links in composite literals 2017-02-17 22:21:49 +00:00
godoc_test.go godoc: fix out-of-bounds panic when serving top-level files 2017-08-04 00:32:20 +00:00
godoc.go godoc: fix out-of-bounds panic when serving top-level files 2017-08-04 00:32:20 +00:00
index_test.go x/tools/godoc: gofmt -s -w 2017-02-15 21:42:32 +00:00
index.go godoc: remove some unused code 2017-01-09 19:59:23 +00:00
linkify.go godoc: use "IsPredeclared" of go/doc 2017-11-15 18:22:28 +00:00
meta.go go.tools: use golang.org/x/... import paths 2014-11-10 08:50:40 +11:00
page.go godoc: add GoogleCN property to pages 2017-08-02 21:09:52 +00:00
parser.go go.tools: use golang.org/x/... import paths 2014-11-10 08:50:40 +11:00
pres.go cmd/godoc: provide -all flag to output unexported identifiers 2018-03-16 16:52:36 +00:00
README.md godoc: add GoogleCN property to pages 2017-08-02 21:09:52 +00:00
search.go godoc: add GoogleCN property to pages 2017-08-02 21:09:52 +00:00
server.go godoc: show synopses for subdirectories in package view 2018-02-23 18:19:23 +00:00
snippet.go godoc: revert support for Go 1.8 aliases 2016-11-04 21:17:32 +00:00
spec.go godoc: move bulk of the code to the package 2013-07-17 17:09:54 +10:00
spot.go godoc: add search results that point to documentation instead of source. 2013-11-21 11:55:42 -05:00
tab.go godoc: add missing copyright 2015-04-27 04:29:37 +00:00
template.go go.tools: use golang.org/x/... import paths 2014-11-10 08:50:40 +11:00

godoc

This directory contains most of the code for running a godoc server. The executable lives at golang.org/x/tools/cmd/godoc.

Development mode

In production, CSS/JS/template assets need to be compiled into the godoc binary. It can be tedious to recompile assets every time, but you can pass a flag to load CSS/JS/templates from disk every time a page loads:

godoc -templates=$GOPATH/src/golang.org/x/tools/godoc/static -http=:6060

Recompiling static assets

The files that live at static/style.css, static/jquery.js and so on are not present in the final binary. They are placed into static/static.go by running go generate. So to compile a change and test it in your browser:

  1. Make changes to e.g. static/style.css.

  2. Run go generate golang.org/x/tools/godoc/static so static/static.go picks up the change.

  3. Run go install golang.org/x/tools/cmd/godoc so the compiled godoc binary picks up the change.

  4. Run godoc -http=:6060 and view your changes in the browser. You may need to disable your browser's cache to avoid reloading a stale file.