tree icon indicating copy to clipboard operation
tree copied to clipboard

Parallelize readdir() reading and stat().

Open james-antill opened this issue 3 years ago • 0 comments

This is a port of the parallel node.Visit() code from my fork. It spawns upto 32 goroutines to do a node.Visit() and when it reaches the limit each goroutine will fall back to processing them directly. The code should work identically if the global semWait is set to 0.

It does work, however there are currently four test failures that only happen when semWait is set all due to of the same root problem ... the nodes are added to the directory in the semi random order they are received from the channel (see line 513). The way each test "sorts" is a noop, so the original order is kept.

In theory you can "fix" some of this with:

  • Part of this patch which sorts by name/mtime/etc. as well as directory, when we do dir. sorts: https://github.com/james-antill/tree/commit/d27032aae2d9670771daf4af00fea4705e5ceacf

  • This patch which sorts by name as well as size/ctime/mtime when we sort by those: https://github.com/james-antill/tree/commit/ff168c233d0550b05a4244ea4bb515094058ec73

  • and in a similar situation, sort directory sizes by printed size: https://github.com/james-antill/tree/commit/76d027f7e68240dd1fcb6271157dec2efe49cb58

james-antill avatar Apr 01 '21 20:04 james-antill