StevenK | And I lose buildbot bingo rather spectacularly. | 00:26 |
---|---|---|
StevenK | rick_h_: No fair if you force it. | 00:26 |
rick_h_ | StevenK: I didn't touch it :P | 00:40 |
=== slank is now known as slank_away | ||
StevenK | wgrant: Haha, it takes DF 13 minutes to work out the source size of the primary archive. | 01:46 |
StevenK | I daresay binary size is far worse. | 01:48 |
wgrant | Quite | 01:48 |
wgrant | StevenK: Oh, why didn't you just trivially fix that rev rather than reverting it? | 01:49 |
StevenK | I saw multiple issues in the failures | 01:49 |
wgrant | Wasn't it all just the webservice.py import removals? | 01:49 |
StevenK | I wasn't sure | 01:50 |
StevenK | Quicker to revert and reland | 01:50 |
StevenK | (After checking, if I care) | 01:50 |
StevenK | wgrant: So we can't do the repository size in the request, and we can't do it in a job, and it's too slow for the publisher :-( | 01:51 |
wgrant | Indeed | 01:52 |
StevenK | We could possibly denorm published size onto spph and bpph | 01:52 |
StevenK | And then just traverse that | 01:52 |
wgrant | That would change the definition substantially (and probably fatally), and not be hugely fast anyway | 01:52 |
StevenK | We're running out of places we can do it :-( | 01:53 |
wgrant | It will probably require a redefinition of what an archive's size means, or a (archive, filename)ish denormalised table | 01:53 |
wgrant | Neither of which is easy | 01:53 |
wgrant | Pick another bug :) | 01:53 |
StevenK | Eh, it answers the question you asked last time I bought it up | 01:54 |
wgrant | What was the question? | 01:54 |
wgrant | I'm pretty sure I said it was probably too slow to ever calculate fully in one hit very much | 01:54 |
StevenK | "How long does it take to calculate the size for the primary archive, if we do it in the publisher?" | 01:55 |
StevenK | Or so | 01:55 |
wgrant | Well | 01:55 |
wgrant | If I did pose that question, it was mostly to demonstrate that it was dreadfully slow | 01:55 |
StevenK | Which makes the answer 'an eon or so' | 01:55 |
wgrant | And so your approach was invalid | 01:55 |
StevenK | wgrant: Are you working on the +sharing critical? | 01:56 |
wgrant | No | 01:56 |
wgrant | But it's trivial, so feel free | 01:56 |
wgrant | While you're there you should also check that the unused AP pruner will DTRT in terms of Product.information_type | 01:57 |
* StevenK watches kanban choke his browser | 01:58 | |
wgrant | StevenK: That doesn't look very constant... | 02:38 |
lifeless | its slow cause its cold cache IO | 02:46 |
wgrant | Nope | 02:46 |
wgrant | Unless cold cache magically causes 40 repetitions | 02:46 |
lifeless | repo size stuff | 02:46 |
lifeless | back up an hour | 02:47 |
wgrant | Oh, yeah, obviously | 02:47 |
wgrant | There's a lot of rows | 02:47 |
wgrant | Most of which won't be poked much | 02:47 |
lifeless | O(files) will always be slow for that | 02:47 |
wgrant | So the cache will always be slow | 02:47 |
wgrant | s/cache/query/ | 02:47 |
lifeless | you need sublinear scaling for that one. | 02:47 |
wgrant | Yes | 02:47 |
wgrant | Of course | 02:47 |
wgrant | That's what i said :) | 02:47 |
wgrant | It needs a complete redesign | 02:47 |
wgrant | hence defer | 02:47 |
lifeless | e.g. event based recalc and a cached value. | 02:47 |
wgrant | Precisely | 02:47 |
wgrant | But it's too slow to even do event-based full recalc in the current model | 02:48 |
wgrant | So it needs to be reworked even further | 02:48 |
lifeless | wgrant: !cite | 02:48 |
lifeless | [its not clear to me that thats the case] | 02:48 |
wgrant | Let's say 20k binaries per DAS | 02:50 |
wgrant | Average of 5 or 6 DASes per series | 02:50 |
wgrant | Maybe 6 published series at a time | 02:50 |
wgrant | + 20k sources per series | 02:50 |
wgrant | So that's >600k pubs for the primary archive | 02:51 |
wgrant | Which isn't huge | 02:51 |
StevenK | And an average of 3 files per publication | 02:51 |
wgrant | But we don't need that hot | 02:51 |
wgrant | So we should keep it cold if we can | 02:51 |
wgrant | StevenK: Not quite, due to binaries it'll be more like 1.5-2 I suspect | 02:51 |
StevenK | wgrant: Then you have things like linux and firefox that build 10,000 binaries | 02:52 |
wgrant | There are better things to keep in wildcherry's cache than millions of Ubuntu rows | 02:52 |
wgrant | When we can relatively easily cache | 02:52 |
wgrant | Similar to branchrevision | 02:53 |
lifeless | how often does the primary archive do deletes (vs updates) ? | 02:53 |
wgrant | Having to keep that hot for anything to work is completely completely stupid | 02:53 |
wgrant | lifeless: > hourly | 02:53 |
wgrant | Since stuff gets superseded | 02:53 |
lifeless | sure | 02:53 |
StevenK | p-d-r is seperate from the publisher | 02:53 |
lifeless | so what I'd be inclined to do is to use something like twitters graph thing to keep this hot | 02:54 |
lifeless | and have a size calculating spout | 02:54 |
wgrant | So | 02:54 |
lifeless | hot as in live in-memory on a small number of machines | 02:54 |
wgrant | Things we can deploy in the next 5 years | 02:54 |
lifeless | heh :) | 02:54 |
wgrant | - Not a Twitter graph thing | 02:54 |
wgrant | We need a solution to this in the next 12 months | 02:54 |
StevenK | So I think the current query works fine for small PPAs. But it scales horribly | 02:54 |
wgrant | So deploying anything exotic is entirely out of the question | 02:55 |
wgrant | And wildcherry has enough cache issues as it is | 02:55 |
lifeless | you don't need to query wildcherry | 02:57 |
StevenK | wgrant: So we create a proprietary project, set it to public and make certain a PUBLIC AccessPolicy wasn't created? | 03:04 |
wgrant | StevenK: Yes | 03:06 |
wgrant | StevenK: So, more work required on +queue :( | 03:08 |
StevenK | :-( | 03:08 |
StevenK | It still makes too many queries? | 03:08 |
StevenK | DONE precise on qas is 129 | 03:09 |
StevenK | Which is like 1/3rd | 03:09 |
wgrant | 24 PackageBuild queries, plus lots of other stuff | 03:09 |
wgrant | https://oops.canonical.com/oops.py/?oopsid=OOPS-566218b1efc27aca3c77c68091a09d83 | 03:10 |
StevenK | Yeah, I just read the query log on qas | 03:11 |
StevenK | The lowest hanging fruit is certainly PackageBuild | 03:11 |
StevenK | wgrant: Hm, now I remember. I couldn't get my test cases to make the PB queries so I moved on. | 03:14 |
wgrant | You clearly need more PUBs | 03:18 |
StevenK | 15 isn't enough? | 03:19 |
wgrant | So | 03:21 |
wgrant | Work out where the PB queries come from | 03:21 |
wgrant | Then work out why they aren't appearing in your test | 03:21 |
StevenK | wgrant: However, we can slam the two bugs back to In Progress and qa-ok | 03:23 |
wgrant | Yes | 03:23 |
StevenK | wgrant: Based on my reading of the code, the 16 PUBLIC APs won't be deleted, there are probably APGs holding them in | 03:31 |
wgrant | StevenK: APGs don't hold them | 03:34 |
wgrant | Only APAs and sharing policies do | 03:34 |
wgrant | But the sharing policies will probably keep them | 03:35 |
StevenK | We can fix those up without a code change, though? | 03:36 |
wgrant | Well, we'll delete them manually | 03:36 |
wgrant | _pruneUnusedPolicies keeps anything that's permitted by a sharing policy. | 03:37 |
wgrant | Including any public types that shouldn't have had an AP in the first place. | 03:37 |
StevenK | wgrant: I'm confused, do we need a code change to clean up? Or when you say delete you mean "DELETE FROM" ? | 03:39 |
wgrant | We could switch _pruneUnusedPolicies to always prune policies that are public, but that's pointless because they shouldn't exist in the first place | 03:40 |
wgrant | It would be best to SQL them away manually | 03:40 |
StevenK | 'if not self.obj.archive.private' causes PB lookups? :-( | 03:50 |
wgrant | Sure | 03:50 |
wgrant | Archive is on PB | 03:50 |
StevenK | wgrant: Sure, but from ViewSourcePackageRelease ? | 03:51 |
wgrant | Um | 03:51 |
wgrant | SPR.archive doesn't exist | 03:51 |
wgrant | So no, you're wrong :) | 03:51 |
wgrant | Sounds more like ViewBinaryPackageBuild | 03:52 |
wgrant | Indeed | 03:52 |
StevenK | Right | 03:52 |
StevenK | Perhaps self.factory.makeBuildPackageUpload is missing some bits, then | 03:54 |
StevenK | wgrant: https://code.launchpad.net/~stevenk/launchpad/no-public-for-all-projects/+merge/141700 | 04:35 |
wgrant | StevenK: _prepare_to_set_sharing_policy already knows how to restrict it to just private types | 04:43 |
wgrant | We shouldn't duplicate that logic. | 04:43 |
StevenK | Let me move into _ensurePolicies then | 04:46 |
StevenK | wgrant: http://pastebin.ubuntu.com/1490688/ | 04:48 |
wgrant | Sounds reasonable | 04:49 |
StevenK | wgrant: Actually, http://pastebin.ubuntu.com/1490691/ | 04:50 |
wgrant | Indeed | 04:53 |
StevenK | Oh wonderful, I think I've broken diff generation for that MP | 05:09 |
StevenK | Ah, look at that. | 05:17 |
StevenK | wgrant: Can haz +1 now? | 05:17 |
StevenK | MismatchError: queries do not match: 52 != 87 | 05:31 |
StevenK | Success | 05:31 |
wgrant | StevenK: Done | 05:33 |
wgrant | What did you eliminate? | 05:33 |
StevenK | I eliminated nothing. I reached into the BPB's BPR and called addFile | 05:34 |
wgrant | Ah | 05:35 |
StevenK | wgrant: And sorry for my OCD forcing +39/-41 on you :-) | 05:35 |
StevenK | Right, preloading PB gets us down to 73 | 05:37 |
StevenK | wgrant: http://pastebin.ubuntu.com/1490769/ gets us to 30 queries on the API, and 57 on the web | 05:46 |
=== almaisan-away is now known as al-maisan | ||
StevenK | We don't really need to preload PBs, Components and Sections in getAll(), but it was trival. | 05:48 |
wgrant | getAll should basically only be used by getPackageUploads and +queue, right? | 05:49 |
wgrant | So it's probably not too bad to aggressively preload | 05:49 |
StevenK | Pretty much, yes | 05:49 |
StevenK | I'd like to preload away the PackageDiff stuff, but that doesn't look easy | 05:50 |
wgrant | I thought you already looked at doing that | 05:50 |
wgrant | Oh right, you gave up after I told you your trivial implementation wouldn't work? | 05:50 |
StevenK | I did, yes | 05:50 |
StevenK | wgrant: If you're happy enough with that diff I can put together an MP? | 05:51 |
wgrant | IIRC it just iterates over SPR.package_diffs | 05:52 |
wgrant | Which is going to be relatively easily to cachedpropertyify | 05:52 |
* StevenK peers | 05:52 | |
wgrant | It's been a while since I was over there | 05:52 |
wgrant | But I don't see why it would do otherwise | 05:53 |
wgrant | Yeah | 05:53 |
wgrant | wgrant@lplucid:~/launchpad/lp-branches/devel$ bzr grep package_diffs lib/lp/soyuz/templates/ | 05:53 |
wgrant | lib/lp/soyuz/templates/distroseries-queue.pt: <tr tal:define="diffs packageupload/sourcepackagerelease/package_diffs" | 05:53 |
wgrant | lib/lp/soyuz/templates/sourcepackagerelease-diffs.pt: tal:define="diffs context/package_diffs" | 05:53 |
wgrant | cachedproperty | 05:53 |
wgrant | done | 05:53 |
wgrant | (well, plus a couple of lines here and there to prepopulate and invalidate) | 05:53 |
StevenK | It's a SQLMutlipleJoin, so I can cheat by _package_diffs, or rewrite to something actually using IStore | 05:54 |
StevenK | SQLMultipleJoin, even | 05:54 |
wgrant | It's unlikely that much actually cares that it's an SQLMultipleJoin | 05:55 |
wgrant | It can probably be turned into a simple cachedproperty list, but you'll have to look at the other callsites | 05:55 |
wgrant | Seem to be only 5 non-test callsites | 05:57 |
wgrant | ez | 05:57 |
StevenK | wgrant: Eh, easy enough to copy the pattern that PackageUpload uses with sources vs _sources | 05:58 |
wgrant | As I said in the last MP, that's pretty pointless | 05:59 |
wgrant | If nothing needs a resultset then a resultset need not be exposed at all | 05:59 |
wgrant | Never expose unnecessary interfaces | 05:59 |
wgrant | Or you end up with something like Launchpad :) | 05:59 |
wgrant | (it appears that none of the callsites will notice if you make it a lisT) | 06:00 |
StevenK | + @cachedproperty | 06:00 |
StevenK | + def package_diffs(self): | 06:00 |
StevenK | + return list(self._package_diffs) | 06:00 |
wgrant | Bad StevenK | 06:01 |
StevenK | Ah ha, so you *do* want the destruction of the SQLMultipleJoin | 06:01 |
wgrant | It's pointless to keep it | 06:01 |
wgrant | return list(Store.of(self).find(PackageDiff, to_source=self).order_by(Desc(PackageDiff.date_requested))) | 06:02 |
wgrant | done | 06:02 |
StevenK | Right, which I was in the middle of typing when you said that ... | 06:04 |
StevenK | wgrant: Not sure where to invalidate SPR.package_diffs, but that preloading gets us to 53 queries. | 06:17 |
StevenK | Except that the LFA and LFC preloading helps not at all | 06:17 |
wgrant | DId you preload the correct LFAs and LFCs? | 06:20 |
wgrant | wgrant@lplucid:~/launchpad/lp-branches/devel$ bzr grep '\bPackageDiff\(' | 06:20 |
wgrant | lib/lp/soyuz/model/packagediff.py:class PackageDiff(SQLBase): | 06:20 |
wgrant | lib/lp/soyuz/model/sourcepackagerelease.py: return PackageDiff( | 06:20 |
wgrant | lib/lp/testing/factory.py: PackageDiff( | 06:20 |
StevenK | Easy | 06:22 |
wgrant | Huh | 06:39 |
wgrant | I just removed all the writable bits of the BuildFarmJob and PackageBuild security configuration | 06:40 |
wgrant | And the only tests that appear to fail are those that test the permissions directly | 06:40 |
lifeless | \o/ | 06:53 |
czajkowski | aloha | 08:50 |
=== al-maisan is now known as almaisan-away | ||
adeuring | ood morning | 09:11 |
czajkowski | adeuring: hopefuly not an odd morning either :) | 09:12 |
adeuring | czajkowski: yeah: i need to clean my keayboard from tobacco crumbs... | 09:13 |
adeuring | brb | 09:15 |
=== almaisan-away is now known as al-maisan | ||
=== al-maisan is now known as almaisan-away | ||
=== yofel_ is now known as yofel | ||
=== slank_away is now known as slank | ||
=== Ursinha-afk is now known as Ursinha | ||
czajkowski | rick_h_: http://i.imgur.com/OWtoF.jpg | 16:05 |
rick_h_ | czajkowski: I'm sending help, hold on tight! | 16:05 |
=== deryck is now known as deryck[lunch] | ||
=== almaisan-away is now known as al-maisan | ||
=== al-maisan is now known as almaisan-away | ||
=== BradCrittenden is now known as bac | ||
=== deryck[lunch] is now known as deryck | ||
=== almaisan-away is now known as al-maisan | ||
=== al-maisan is now known as almaisan-away | ||
sinzui | buildbot is seriously harshing my mellow | 21:00 |
czajkowski | sinzui: I'm going to go with that's not a good mellow | 22:32 |
Generated by irclog2html.py 2.7 by Marius Gedminas - find it at mg.pov.lt!