Closed
Bug 995762
Opened 9 years ago
Closed 9 years ago
moz.build processing could take as much as 15 minutes!
Categories
(Firefox Build System :: General, defect)
Tracking
(Not tracked)
RESOLVED
FIXED
mozilla31
People
(Reporter: ehsan.akhgari, Assigned: mshal)
Details
Attachments
(4 files, 2 obsolete files)
160.05 KB,
text/plain
|
Details | |
130.45 KB,
patch
|
Details | Diff | Splinter Review | |
171.21 KB,
image/png
|
Details | |
4.14 KB,
patch
|
mshal
:
review+
|
Details | Diff | Splinter Review |
I just rebased on top of master and did a ./mach build, and here's what happened: 0:17.57 checking for LC_MESSAGES... (cached) yes 0:17.57 checking for localeconv... (cached) yes 0:17.64 checking for __cxa_demangle... (cached) yes 0:17.65 checking for -pipe support... yes 0:17.66 checking whether C compiler supports -fprofile-generate... yes 0:17.68 checking for correct overload resolution with const and templates... no 0:17.69 checking for tm_zone tm_gmtoff in struct tm... (cached) yes 0:17.74 checking what kind of list files are supported by the linker... filelist 0:17.76 checking for posix_fadvise... (cached) no 0:17.77 checking for posix_fallocate... (cached) no 0:17.80 checking for setlocale... (cached) yes 0:17.80 checking for localeconv... (cached) yes 0:17.81 creating ./config.status 0:18.02 Reticulating splines... 15:38.34 Finished reading 2541 moz.build files in 1.91s 15:38.34 Processed into 6927 build config descriptors in 4.01s 15:38.34 Backend executed in 914.20s 15:38.34 2573 total backend files; 3 created; 40 updated; 2530 unchanged; 0 deleted; 238 -> 1025 Makefile 15:38.34 Total wall time: 920.32s; CPU time: 919.51s; Efficiency: 100%; Untracked: 0.20s 15:38.76 From dist/public: Kept 0 existing; Added/updated 0; Removed 0 files and 0 directories. 15:38.77 From dist/sdk: Kept 0 existing; Added/updated 0; Removed 26 files and 4 directories. 15:38.82 From dist/private: Kept 0 existing; Added/updated 0; Removed 155 files and 2 directories. 15:39.45 From dist/bin: Kept 85 existing; Added/updated 0; Removed 3432 files and 356 directories. 15:39.49 From dist/idl: Kept 1138 existing; Added/updated 1; Removed 0 files and 0 directories. 15:39.66 From dist/include: Kept 3979 existing; Added/updated 4; Removed 192 files and 6 directories. 15:41.00 From _tests: Kept 17373 existing; Added/updated 13; Removed 764 files and 110 directories. 15:41.24 cd include; /Applications/Xcode.app/Contents/Developer/usr/bin/make private_export 15:41.24 Creating /Users/ehsan/moz/src/obj-ff-dbg.noindex/dist/private/nss 15:41.25 cd mangle; /Applications/Xcode.app/Contents/Developer/usr/bin/make private_export 15:41.27 Creating /Users/ehsan/moz/src/obj-ff-dbg.noindex/dist/private/dbm Not sure at all what happened there. Previously I was on https://hg.mozilla.org/mozilla-central/rev/d68c74e48075, and now I am on https://hg.mozilla.org/mozilla-central/rev/ebdf2740dc3e.
Reporter | ||
Comment 1•9 years ago
|
||
Reporter | ||
Comment 2•9 years ago
|
||
This is all of my local modifications
Reporter | ||
Comment 3•9 years ago
|
||
To make things more interesting, after a clobber I could not reproduce. My tree was fully built before the rebase of course.
Assignee | ||
Comment 4•9 years ago
|
||
I can reproduce this by switching between git commits d506740 and efc5497c, and just running './config.status' in between. froydnj pointed out in IRC that it appears to be related to file diffing. Attached is a profile graph from a bad run (that takes ~3 minutes instead of the usual ~9 seconds). The slow runtime goes away if I force self._capture_diff to False in FileAvoidWrite(). I'm still looking at why exactly the diffing is so slow - just thought I'd mention it in case gps would know off-hand :)
Assignee | ||
Comment 5•9 years ago
|
||
At least in the particular case of the two commits I tested, the slow runtime is all because of diffing all-tests.json, which is ~15MB.
Assignee | ||
Comment 6•9 years ago
|
||
It seems the problem is a severe performance limitation of difflib, and I'm not sure how easy that will be to fix. In the meantime we can avoid evaluating the diff generator unless --diff is specified. The '\n'.join() was causing the immediate evaluation even if --diff wasn't used, so this patch moves the join to config_status.py where the diff is displayed. Note that fh.diff is also used in BackendMakeFile:diff(), but I don't know if that's actually used.
Attachment #8406280 -
Flags: review?(gps)
Comment 7•9 years ago
|
||
Comment on attachment 8406280 [details] [diff] [review] 0001-Bug-995762-don-t-evaluate-diff-unless-it-s-needed.patch Review of attachment 8406280 [details] [diff] [review]: ----------------------------------------------------------------- Generators FTW! Great patch.
Attachment #8406280 -
Flags: review?(gps) → review+
Assignee | ||
Comment 8•9 years ago
|
||
Unfortunately my patch breaks 'make check' due to 'self.assertIsInstance(faw.diff, unicode)' lines in test_util.py, since the generator object doesn't count as unicode. Should I just delete those assertIsInstance lines? Or is there a better way to fix that?
Flags: needinfo?(gps)
Assignee | ||
Comment 9•9 years ago
|
||
Assuming that removing those lines is ok, here's the new patch. It passes try this time: https://tbpl.mozilla.org/?tree=Try&rev=18d454d1d426 If you want me to fix the tests some other way just let me know!
Attachment #8406280 -
Attachment is obsolete: true
Attachment #8406853 -
Flags: review?(gps)
Flags: needinfo?(gps)
Assignee | ||
Updated•9 years ago
|
Assignee: nobody → mshal
Comment 10•9 years ago
|
||
Comment on attachment 8406853 [details] [diff] [review] 0001-Bug-995762-don-t-evaluate-diff-unless-it-s-needed.patch Review of attachment 8406853 [details] [diff] [review]: ----------------------------------------------------------------- ::: python/mozbuild/mozbuild/test/test_util.py @@ -132,2 @@ > self.assertIn('-old', faw.diff) > self.assertIn('+new', faw.diff) Oh, I'm surprised this still works! I would rewrite this as: diff = '\n'.join(faw.diff) self.assertIn('-old', diff) self.assertIn('+new', diff) @@ -141,5 @@ > faw = FileAvoidWrite(path, capture_diff=True) > faw.write('new') > faw.close() > > - self.assertIsInstance(faw.diff, unicode) Ditto. Expand the diff inline.
Attachment #8406853 -
Flags: review?(gps) → review+
Assignee | ||
Comment 11•9 years ago
|
||
Updated with review comments, r+ carried forward.
Attachment #8406853 -
Attachment is obsolete: true
Attachment #8408244 -
Flags: review+
Assignee | ||
Comment 12•9 years ago
|
||
inbound: https://hg.mozilla.org/integration/mozilla-inbound/rev/a0aa1d05d7cf
Comment 13•9 years ago
|
||
https://hg.mozilla.org/mozilla-central/rev/a0aa1d05d7cf
Status: NEW → RESOLVED
Closed: 9 years ago
Flags: in-testsuite+
Resolution: --- → FIXED
Target Milestone: --- → mozilla31
Updated•5 years ago
|
Product: Core → Firefox Build System
You need to log in
before you can comment on or make changes to this bug.
Description
•