Export: trimming enhancements - #3530
Conversation
setting subincludes at package level instead of at target level
- register subinclude statements in the package metadata - filter subincludes label - export all non build_target related statements
…dary build def with sources the updated test uses non-standard child naming to validate new trimming logic
…a to also avoid tracking inside subincludes
…Parser is set. This wasn't an issue before since we would force close all the channels and fail during the first parse, but now we will attempt to wait for parsed package during an export.
…ents (including non-target generators). The reason for pivoting is that the previous implementation failed to identify necessary subincludes for variable declarations or other builtin methods (string join)
…ls to interpretStatements with the package level scope (e.g. for loop)
…y if blocks that have interpreted stmts (var redeclaration)
… they were interpreted oir not
toastwaffle
left a comment
There was a problem hiding this comment.
Nearly there!
As ever, comments phrased as questions probably imply a need for code comments
| return int64(bs.Start) | ||
| } | ||
|
|
||
| // hashBuildStatement mixes the Start and End byte coordinates to produce a unique 64-bit hash. |
There was a problem hiding this comment.
I feel like for amusement we should state that "This does introduce a 4,294,967,296 byte size limit on BUILD files processed by Please"
Also, is it at all concerning that our hash is not uniformly distributed? What's worse - a non-uniform distribution, or doing more work to make it uniform?
| @@ -0,0 +1,2 @@ | |||
| [parse] | |||
| BuildFileName = BUILD_FILE No newline at end of file | |||
There was a problem hiding this comment.
supernit: missing trailing newline
| custom_file( | ||
| name = "unneeded", | ||
| src = "unneeded.txt", | ||
| ) No newline at end of file |
There was a problem hiding this comment.
supernit: missing trailing newline
| @@ -0,0 +1,2 @@ | |||
| [parse] | |||
| BuildFileName = BUILD_FILE No newline at end of file | |||
There was a problem hiding this comment.
supernit: missing trailing newline
| name = "_foo#sub", | ||
| srcs = ["BUILD_FILE"], | ||
| visibility = ["PUBLIC"], | ||
| ) No newline at end of file |
There was a problem hiding this comment.
supernit: missing trailing newline
| @@ -0,0 +1,2 @@ | |||
| [parse] | |||
| BuildFileName = BUILD_FILE No newline at end of file | |||
There was a problem hiding this comment.
supernit: missing trailing newline
peterebden
left a comment
There was a problem hiding this comment.
I have some worries about crossing package responsibilities here - I get there's a lot more information we need to store to support this, and we can work through a bunch of that, but I think some of these changes like wanting to request parses from code post the actual build is a line we shouldn't cross (and I think maybe we don't have to).
| // is when exporting dependencies of targets that are not explicitly used but adjacent/related. | ||
| KeepParserRunning bool | ||
| // WaitForDisplay is a function that blocks until the display thread has finished. | ||
| WaitForDisplay func() |
There was a problem hiding this comment.
This feels very out of place here. I don't think the build state should need to know about this.
| // calls to the parser. This is needed to support the export operation since the export logic will | ||
| // attempt to export targets that have not been parsed during the normal build phase. An example | ||
| // is when exporting dependencies of targets that are not explicitly used but adjacent/related. | ||
| KeepParserRunning bool |
There was a problem hiding this comment.
I'm really uncomfortable about this. It feels very strange to keep things around post the actual build running. I'm also not clear how it can really work, since in general the parser needs to be able to request further builds, so you don't just need the parser running, you need the whole build 'engine' ready to go again.
IIUC the requirement is for export to be able to request additional parses of things 'alongside' in the same BUILD file but weren't original targets. I think we could solve this more simply by make it parse all those things in the first place - the faster version is to convert all initial labels to :all, the dumber version is to just parse everything for export in the first place, so we know the graph is complete when we get there.
| // BuildStatement represents the start and end byte positions of a parsed statement in a BUILD file. | ||
| type BuildStatement struct { | ||
| Start, End int | ||
| } |
There was a problem hiding this comment.
This isn't fundamentally bad, but it does all feel like something that core doesn't currently deal with.
I guess we do need it sitting on Package really, but I wonder if it'd be better being an unimplemented interface in this package, and having other packages that know about BUILD file source stuff implement it.
| ] + [f'plz --repo_root="{exported_repo}" {cmd}' for cmd in cmd_on_export] | ||
|
|
||
| test_cmd = [cmd.replace("plz ", "$TOOLS_PLEASE ") for cmd in test_cmd] | ||
| cache_args = '--override=cache.dir:"$($TOOLS_PLEASE query reporoot)"/plz-out/test-cache' |
There was a problem hiding this comment.
This is very fragile. I ran into corruption of this directory fairly quickly - presumably due to multiple tests running simultaneously that fought over it.
There was a problem hiding this comment.
I think it might be reasonable to add some locking to the cache so separate processes exclude each other, which should fix this. I can look at that separately.
Enhancements to plz export, moving from a basic target-level trimming (using gc.RewriteFile) to build statement-level trimming, including only the required build rules and subincludes.
For consistency, we format all the exported BUILD files.
Changelog:
src/export/export.goto enforce better separation of the DefaultExporter (for trimming) and NoTrimExporter.