-
Notifications
You must be signed in to change notification settings - Fork 17.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
cmd/go: cache hit takes too long on a test that opens many files #26726
Comments
Perhaps related to #26562. |
I ran it again like this
and the output seems to say that the same hashes are being recomputed many times.
It looks like the check could be sped up a lot by only computing the hashes once. |
Before this change, the same hashes were being computed multiple times in some cases. This gets the case reported in issue golang#26726 down from over 30s to .8s.
Change https://golang.org/cl/127155 mentions this issue: |
Simplifying
The question is how to do it without giving up correctness. |
The symlink issue is being fixed in #26562 already. |
Change https://golang.org/cl/127635 mentions this issue: |
Closing this as a duplicate of #26562. |
Evaluating the symlinks was slowing down test cache checks. Fixes #26562 Fixes #26726 ijt:~/gopath/src/issue26562$ cat foo_test.go package foo_test import ( "fmt" "os" "path/filepath" "testing" ) // package and imports snipped func TestCache(t *testing.T) { tmp := os.TempDir() for i := 0; i < 1000000; i++ { os.Stat(filepath.Join(tmp, fmt.Sprintf("%d", i))) } } ijt:~/gopath/src/issue26562$ time ~/github/go/bin/go test -count=1 PASS ok issue26562 9.444s real 0m10.021s user 0m2.344s sys 0m7.835s ijt:~/gopath/src/issue26562$ time ~/github/go/bin/go test . ok issue26562 (cached) real 0m0.802s user 0m0.551s sys 0m0.306s Change-Id: I3ce7f7b68bb5b9e802069f277e79e1ed3c162622 Reviewed-on: https://go-review.googlesource.com/127635 Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
Change https://golang.org/cl/127715 mentions this issue: |
It breaks on the Darwin builders, with --- FAIL: TestTestCacheInputs (21.65s) go_test.go:5371: file.txt: old=2018-08-02 15:12:21.136438 -0700 PDT m=+219.458659208, info.ModTime=2018-08-02 15:12:21 -0700 PDT go_test.go:5377: running testgo [test testcache] go_test.go:5377: standard output: go_test.go:5377: ok testcache 0.013s go_test.go:5378: running testgo [test testcache] go_test.go:5378: standard output: go_test.go:5378: ok testcache (cached) go_test.go:5382: running testgo [test testcache] go_test.go:5382: standard output: go_test.go:5382: ok testcache 0.172s go_test.go:5384: running testgo [test testcache] go_test.go:5384: standard output: go_test.go:5384: ok testcache (cached) go_test.go:5387: running testgo [test testcache -run=FileSize] go_test.go:5387: standard output: go_test.go:5387: ok testcache 0.012s go_test.go:5388: running testgo [test testcache -run=FileSize] go_test.go:5388: standard output: go_test.go:5388: ok testcache (cached) go_test.go:5391: running testgo [test testcache -run=FileSize] go_test.go:5391: standard output: go_test.go:5391: ok testcache 0.008s go_test.go:5393: running testgo [test testcache -run=FileSize] go_test.go:5393: standard output: go_test.go:5393: ok testcache (cached) go_test.go:5396: running testgo [test testcache -run=Chdir] go_test.go:5396: standard output: go_test.go:5396: ok testcache 0.417s go_test.go:5397: running testgo [test testcache -run=Chdir] go_test.go:5397: standard output: go_test.go:5397: ok testcache (cached) go_test.go:5400: running testgo [test testcache -run=Chdir] go_test.go:5400: standard output: go_test.go:5400: ok testcache (cached) go_test.go:5401: did not notice file size change go_test.go:5401: pattern \(cached\) found unexpectedly in standard output FAIL Original CL description: Evaluating the symlinks was slowing down test cache checks. Fixes #26562 Fixes #26726 ijt:~/gopath/src/issue26562$ cat foo_test.go package foo_test import ( "fmt" "os" "path/filepath" "testing" ) // package and imports snipped func TestCache(t *testing.T) { tmp := os.TempDir() for i := 0; i < 1000000; i++ { os.Stat(filepath.Join(tmp, fmt.Sprintf("%d", i))) } } ijt:~/gopath/src/issue26562$ time ~/github/go/bin/go test -count=1 PASS ok issue26562 9.444s real 0m10.021s user 0m2.344s sys 0m7.835s ijt:~/gopath/src/issue26562$ time ~/github/go/bin/go test . ok issue26562 (cached) real 0m0.802s user 0m0.551s sys 0m0.306s Updates #26562 Updates #26726 Change-Id: I7914ee57dc75bcbd7f0ea01c70bed97d67c810ea Reviewed-on: https://go-review.googlesource.com/127715 Run-TryBot: Ian Lance Taylor <[email protected]> Reviewed-by: Brad Fitzpatrick <[email protected]>
Change https://golang.org/cl/127818 mentions this issue: |
I'd still really like to find a way to make the approach of CL 127635 - stop evaluating symlinks at all - work. I'll try to take a look in the next couple weeks. |
If anyone wants to make another run at this, the description for CL 127715 includes the output of the failing test. |
Fixes golang#26726 Change-Id: I94cae97f96debfb443ead647e6de35febfe95da3
Change https://go.dev/cl/511915 mentions this issue: |
I'm able to consistently reproduce this while trying to test a fix for #64702. |
For golang#26726 Change-Id: Ic1499abf847f161206462d9238bb19cdeba302c3
Change https://go.dev/cl/563595 mentions this issue: |
What version of Go are you using (
go version
)?go1.10.2
Does this issue reproduce with the latest release?
Yes.
What operating system and processor architecture are you using (
go env
)?What did you do?
What did you expect to see?
The second test run should have taken under 1s since nothing changed.
What did you see instead?
It took over 30s.
@zombiezen suggested that the slowness arises from the wire tests opening many packages under
$GOROOT
for type checking, makinggo test
spend a lot of time checking their hashes when deciding whether there is a cache hit.The text was updated successfully, but these errors were encountered: