=== salgado is now known as salgado-afk [00:04] I suspect Distribution:+bugtarget-portlet-bugfilters-stats is going to be mondo painful [00:04] Yes. [00:04] also we need to remove the override on Archive:+index [00:05] How low is it now? [00:05] The page, I mean. [00:05] Not the 16000 override. [00:05] 8.26 [00:05] Nice. [00:05] https://devpad.canonical.com/~lpqateam/ppr/lpnet/2011-03/daily_2011-03-15_2011-03-16/pageids.html [00:05] Kill it. [00:05] Yes, but that takes a couple of minutes to load. [00:07] Hmm. Maybe I want to look at Person:+contactuser. [00:07] Since its 99% is twice the next worst. [00:08] 0.11 [00:08] mean sql [00:08] For +contactuser? [00:08] hmm, 99th percentile forsql is mising [00:08] wgrant: yes [00:08] Right. [00:08] It'll be mail. [00:08] wgrant: its probably mail sending [00:09] wgrant: we would benefit a lot if we had instrumentation on how long sending each email takes [00:09] its been hard getting that evaluated by is (for fairly good reasons) - but it still an open question around where the issues live [00:10] archive:+index should wait for monday [00:20] lifeless: can I get you to mentor wallyworld? https://code.launchpad.net/~thumper/launchpad/blueprint-linked-bug-tasks/+merge/53734 [00:22] thumper: I need to pop up to the shops for lunch stuff [00:22] thumper: will review after [00:22] lifeless: ok, thanks [00:30] Does anyone know of a way to use feature flags in JavaScript? [00:31] yes [00:31] export the value of the flag in the .pt file [00:31] interpret it in your js [00:34] lifeless: That was my plan, but I was having trouble getting some context values. Maybe I'll try again. [00:35] its been done before :) [00:35] huwshimi: e.g. showing the render time in the top right [00:45] lifeless: heh no wonder it wasn't working. The feature flag wasn't set. The shame. [00:45] huwshimi: rotfl [00:46] lifeless: I didn't realise that it didn't keep them between make runs [00:46] huwshimi: make schema will zerg them from your dev insance [00:47] huwshimi: 'make run' won't reset them [00:47] lifeless: I didn't think I'd done a make schema... but maybe I had [00:47] huwshimi: make schema completly resets the db to 'pristine sampledata' [00:47] yeah [00:47] Now to wash my eyes out for saying 'pristine sampledata' [00:52] * thumper is mildly confused by a comment in code [00:53] model/person.py line 1797 [00:54] thumper: i guess _getPrecachedPersons isn't in the interface? [00:54] it doesn't need to be [00:54] lifeless, i liek your idea about incomplete (bug 737008) [00:54] the self object isn't security wrapped [00:54] <_mup_> Bug #737008: old incomplete bugs are not treated as incomplete < https://launchpad.net/bugs/737008 > [00:54] once inside the object [00:54] maybe we should make that bug ask for what you said (as Low) [00:54] you are free of the security proxy on self [00:54] poolie: care to do that ? [00:54] sure [00:55] thumper: sure, but if you did getUtility(IPersonSet) you get a proxied object [00:55] thumper: you can use the proxied set and see what happens.... [00:55] mwhudson: yes you do [00:55] but once you call a method on the object (that is in the interface) [00:55] the self passed through isn't wrapped [00:56] otherwise that'd be insane [00:56] sure [00:56] * thumper is 98% sure of this [00:57] bbs [01:49] lifeless: you back? [01:49] anyone know how to clear the storm cache for tests? [01:58] store.reset [01:58] store.invalidate [01:58] IIRC [01:59] hmm [01:59] I should have been on leave today [02:00] oh yes, the memorial [02:01] I'll talk to flacoste, do a day off next week [02:03] thumper: ^ store answers for you === statik_ is now known as statik [02:17] lifeless: ta [02:17] lifeless: do I need both, or just the second? [02:18] either [02:19] one is deeper than the other [02:19] invalidate will cause existing objects to be refreshed from the db on next use [02:19] reset will make them unusable and cause errors if you try to carry an object from before the reset forward [02:24] ok [02:24] anyone remember off the top of their head what the storm equivalent of the sqlobject SQLRelatedJoin is? [02:25] lifeless, i wonder if you (or mrevell or someone) should post to the blog to explain about the critical/high/low categories [02:25] re all the "why is this now Low" comments [02:26] hmm [02:26] possibly [02:26] but there have only been 3 or 4 [02:26] in several hundred bug updates [02:26] (one bug - the wiki one - had a longer discussion that I'm counting as one) [02:27] I don't think this is really all that interesting to most users of lp [02:29] maybe not [02:34] I think people are responding because they get notified [02:34] and would do so even if they knew that medium is equivalent to low, because the thing they care about is having their change made [02:40] OMFG [02:40] this code is soooooo... bad [02:40] * thumper enfixorates [02:43] thumper: Which code? [02:44] sprints [02:44] Heh. [02:45] like the way to add an attendee, it iterated through all the attendees to see if the person matched [02:46] huwshimi, did you think you fixed the bug where you have to press enter twice to save the tag list? [02:46] doesn't seem fixed for me on lpnet [02:47] one enter selects the tag, the other saves [02:47] huwshimi: btw [02:47] yes, i know [02:47] huwshimi: try putting a non-typeahead tag into a bug [02:47] but that makes no sense if i've already completely entered a tag [02:47] poolie: The fix is in lazr-js which I haven't got around to releasing a new version of yet. [02:48] huwshimi: its not done till its done [02:48] ok thanks [02:48] just wondered if it was in-progess or failed validation [02:48] 1029 OOPS-1902EE937 BugTask:+nominate [02:48] 1029 statements on +nominate!? [02:48] win [02:48] sorry just one more thing there, what controls which tags show up in the portlet? [02:49] oh, deja vu, this is a caching bug, isn't it? [02:49] Probably, yes. [03:08] :( [03:08] Sprints are that bad? [03:09] Can I burn bug heat? [03:09] wgrant: no [03:10] :( [03:10] Does anybody use it enough that the performance penalty is worth it? [03:10] the performance penalty is not intrinsic to having heat [03:11] No. [03:11] But we need to either optimise or destroy. [03:11] optimise [03:11] distro are asking for heat improvements [03:11] Well, destruction is the ultimate optimisation :) [03:11] :( [03:11] getUtility(IPersonSet).getPrecachedPersonsFromIDs isn't doing what I'd expect [03:11] if we don't deliver the (thing) then its not optimisation anymore [03:12] thumper: list() [03:12] thumper: are you listifying it and passing need_validity=True ? [03:12] thumper: You need to evaluate the result. [03:12] wgrant: yeah got that [03:12] and I ahve need_validity=True [03:12] ok [03:12] so what are you seeing [03:12] but it is still doing the valid query for some of them [03:12] and if I add more people [03:12] then it does shit loads more [03:12] even getting some people [03:12] I'm wondering if I'm hitting the storm cache limit [03:12] where are you doing the preloading ? [03:13] there is no cache limit [03:13] test says different [03:13] lifeless: Even in tests? [03:13] its much more likely that something is triggering loading and doing a person:fmt before your eager load happens [03:13] I'm preloading in Sprint.attendances [03:13] * thumper tries something [03:13] wgrant: if you test with getUserBrowser, should be same as prod [03:14] thumper: you're using the matcher for testing this, right ? [03:14] yep [03:14] and the DatabaseFunctionalLayer [03:14] BrowsersWithQueryLimit or whatever it was [03:23] Hmm. [03:23] I wonder. [03:23] wgrant: dangerous [03:23] Should I turn recalculateBugHeat into something that adds a commit hook? [03:23] As a quick fix for all this heat badness. [03:23] what do you mean [03:24] At the moment any change to a bug calls recalculateBugHeat, which then sets maxheat everywhere and blah. [03:24] Some views call addChange several times. [03:26] so [03:26] uhm [03:26] I don't know what you should do [03:26] I can share the thoughts I had looking at this previously [03:26] Well, I should move heat updating to a job. [03:26] But that's a bit hard. [03:27] hi thumper [03:27] updating the heat in a context should be exactly two single-row queries always. [03:27] bac: hi [03:27] thumper: hey could you re-review my branch? i addressed all of your issues. [03:27] ok [03:27] wgrant: [in the current design/implementation] [03:28] bac: diff is updating [03:28] thumper: despite what i said in the earlier comment, i've removed the line-height altogether [03:28] wgrant: the fact that its now looked like a very low hanging fruit [03:28] s/now/not/ [03:28] Yippie, build fixed! [03:28] Project db-devel build #464: FIXED in 4 hr 44 min: https://hudson.wedontsleep.org/job/db-devel/464/ [03:28] lifeless: if I reduce the number of people I add to the sprint, I get expected behaviour. with 30 people, it is fine, with 50 I get some validation queries, with 100 I get people and validation queries [03:28] lifeless: so I'm guessing it is a caching issue [03:31] thumper: I've done some pretty large datasets and not see that, but you might be right [03:31] thumper: is it constant regardless of people in launchpad.dev (I use the harness to populate data for that sort of manual test) [03:32] wgrant: does that make sense, or have I been to minimal in my description ? [03:32] lifeless: It makes sense. [03:33] lifeless: I guess it should be reasonably cheap, but it's still going to be somewhat duplicated. [03:33] I'll fix the underlying stuff first. [03:33] (mostly the fact that DSP's pk isn't (distribution, sourcepackagename), so Storm likes to reretrieve it lots) [03:33] wgrant: things like: why do we query 'hottest bug' - if this bug has higher heat, update the cache, if not do nothing unless our heat lowered, and in that case [rare] query highest bug and set if and only if different [03:35] lifeless: Right. [03:35] wgrant: I don't see any reason to move heat to a job [03:36] wgrant: I wouldn't object to it per se, I just don't see anything driving it [03:38] lifeless: so where is this storm cache defined? [03:38] rendered locally, a sprint with 100 attendees was 30 queries [03:38] 200 attendees was 30 queries [03:38] 400 attendees was 102 [03:39] wondering if I was hitting the limit again [03:39] heh, do we even use stormsugar.py [03:39] I was looking for it [03:39] but didn't end up using it [03:40] thumper: grep for StupidCache [03:40] Is that seriously its name? [03:40] bac: I think you were too aggressive in your code removal [03:40] bac: with no link it should be a and it is no more [03:43] lifeless: Well, for one thing it seems pretty unwise to be locking Ubuntu during every change to an Ubuntu bug. [03:44] wgrant: right, but only *one bug* can cause that [03:44] wgrant: note that all bug updates will take a row lock preventing deletes on ubuntu [03:44] lifeless: We hope. [03:45] wgrant: if there are two bugs fighting for peak heat [03:45] wgrant: we can deal [03:45] Maybe. [03:46] StevenK: What are you doing to Jenkins? [03:46] Moving it [03:46] Well, moving its DNS name to lpci.w.o [03:46] Aha. [03:47] hmm [03:48] does bug expiry look a the project group ? [03:48] if so, that would explain why its not working for launchpad [03:48] and there is no ui for setting it on project gourp [03:49] It doesn't seem to use the project group setting. [03:50] wgrant: It should announce URLs as lpci.w.o anyway. hudson.w.o is now a CNAME. [03:50] wth defines 'fixed elsewhere' [03:50] zomg [03:50] lifeless: Where have you seen that? [03:50] we support *per distroseries* bug expiry [03:50] Er, what? [03:50] Do we? [03:50] https://lp-oops.canonical.com/oops.py/?oopsid=1857C157#longstatements query 4 [03:51] That seems like crack. [03:51] Pure crack. [03:51] its mindblowingly insane [03:51] lifeless: Er. [03:51] That's not per-distroseries bug expiry. [03:51] That's finding bugs in distroseries in distributions that are expirable. [03:52] Sigh, lp-oops DIAF [03:52] It always misbehaves for me [03:52] Authentication drops the query string, yes. [03:52] https://bugs.launchpad.net/ubuntu/+bugtarget-portlet-bugfilters-stats - thats where the 'fixed elsewhere' thing shows up [03:52] wgrant: thats true, but the query is nutjob noddy anyway [03:52] lifeless: Welcome to Launchpad. [03:53] wgrant: And https://lp-oops.canonical.com/ is the most unhelpful front page EVER [03:54] argh [03:55] extra_clauses.append("BugTask.bug IN " "(SELECT DISTINCT bug FROM BugCve)") [03:55] -not win- [03:56] StevenK: Ouch, whatever server is running that site must be really hurting if that's running in debug mode [03:57] huwshimi: That's devpad. [03:57] the fixed elsewhere queries are buggy too - they ignore product series bugs [03:58] wgrant: I'm guessing it doesn't have much ram free. [04:01] Meh, it's only 220MiB into swap [04:05] well we probably shouldn't be running it in dev mode anyway [04:05] or rather debug mode [04:05] huwshimi: why not? [04:06] lifeless: In debug mode Django holds every query in ram [04:06] huwshimi: since start up? [04:06] huwshimi: or for a request lifetime? [04:06] lifeless: I think so [04:07] The only thing that isn't playing so nice with carob is the PPR [04:07] generation ? [04:07] Yes [04:07] yeah, its started failing again [04:08] lifeless: Sorry I mean, I think it is since start up [04:08] huwshimi: right, well that could be cause for concern, yes. [04:08] lifeless: Let me just check the docs [04:09] lifeless: "It is also important to remember that when running with DEBUG turned on, Django will remember every SQL query it executes. This is useful when you are debugging, but on a production server, it will rapidly consume memory." from: http://docs.djangoproject.com/en/dev/ref/settings/#debug [04:10] hahahahahahha [04:10] my respect for django just increased [04:10] so, could you please file a bug on oops-tools noting this? [04:12] lifeless: You had some? :-) [04:12] StevenK: its gone so far in one direction that things that make it worse, make it better [04:13] wgrant: Last SPR processed by p-s-c was for edgy. [04:13] StevenK: We are getting somewhere. [04:13] Slowly. [04:14] The OO.o SPRs are taking 1 minute. [04:18] lifeless: We might have to check our other Django deploys too. [04:19] (I believe we have others) [04:20] * wgrant stabs postgres in the eye. [04:21] * mwhudson has one too.... [04:21] (but it hardly uses the database so that might be ok) [04:22] lifeless: https://bugs.launchpad.net/oops-tools/+bug/737327 [04:22] <_mup_> Bug #737327: django should not be running in debug mode on production, it will eat all the RAM < https://launchpad.net/bugs/737327 > [04:23] https://code.launchpad.net/~thumper/launchpad/sprint-attendees/+merge/53941 [04:24] lifeless: and other review poke [04:24] * thumper goes to get friday takeaways [04:30] thumper: reviewing [04:30] thumper: I have suggestions fwiw, but nothing mandatory so far [04:32] ok, I'll look later [04:32] * thumper afk [04:38] wgrant: do you know where the contents of /srv/launchpad.net/ubuntu-archive/ubuntu-distscopy come from? [04:42] jtv: It's maintained by the script. [04:43] It keeps two copies of the dists tree around. [04:43] So it can do reasonably atomic updates. [04:43] wgrant: what is "the" script? [04:43] "the script" being cron.publish-ftpmaster [04:43] Ah [04:43] It grabs the backed up dists tree ubuntu-distscopy, and moves it to ubuntu/dists.new [04:44] It then runs the publisher on that. [04:44] I see it copying _from_ ubuntu-distscopy… does it write _to_ ubuntu-distscopy further on? [04:44] See cleanup() near the top. [04:44] So this is a chicken-and-egg situation? [04:45] Howso? [04:45] # Create backup dists folder, if this is the first time. [04:46] That copies _from_ ubuntu-distscopy [04:46] Then it will move the empty folder to dists.new, swap dists and dists.new bring the new dists.new up to date, then move dists.new into ubuntu-distscopy [04:46] s/ bring/, bring/ [04:46] But publish-distro is failing to write a Release file there [04:46] Oh? [04:47] grumpy? [04:47] No, a freshly-created distroseries. [04:47] Does it have any ComponentSelections? [04:47] Errr [04:47] You need ComponentSelections in all your publishable series. [04:47] what's a component selection? [04:47] Or you'll have no components. [04:47] And the publisher will crash. [04:47] "Components? But Andy Tanenbaum told me that Linux was monolithic!" [04:47] (not optimal, but it's better than lucilleconfig) [04:48] Bug #675042 [04:48] <_mup_> Bug #675042: Release file generation fails for series without components < https://launchpad.net/bugs/675042 > [04:48] Does that look like what you're seeing? [04:49] Yes, except it's not in /var/tmp/archive. [04:49] So, try adding a ComponentSelection for main to your new series. [04:50] Does the test publisher know how to do that for me? [04:51] I doubt it. [04:51] Not even the LOF does. [04:51] The Line Of Flight? [04:51] Launchpad Object Factory. [04:52] I'm tempted to fix the bug, but in this case that'd probably be hiding incomplete test coverage for cron.publish-ftpmaster, wouldn't it? [04:53] It would. [04:58] * jtv sings hi-ho, making componentselections we go [05:04] lifeless: Hi. [05:06] wgrant: hi [05:06] hi ho [05:06] hi ho [05:06] its off to work we go? [05:06] Ha ha. [05:06] Could you please explain analyze query 106 from https://lp-oops.canonical.com/oops.py/?oopsid=OOPS-1902A2028? [05:06] It is a wonderful 9978ms abomination. [05:06] \o/ [05:07] It takes about 30s on mawson, and adding a very sensible index brings it down to 2s. [05:07] what bug [05:08] Bug #276950, probably. [05:08] <_mup_> Bug #276950: DistroSeries:+queue Timeout accepting many packages queue page < https://launchpad.net/bugs/276950 > [05:08] Although this is probably only bad on GETs. [05:08] still running [05:08] Heh [05:09] I guess the index was not terribly bad when it was created. [05:10] still going [05:10] I'm going to go fiddle this portlet a bit more and check back in a bit [05:10] Thanks. [05:11] ok, on the bug [05:11] hot is 600ms [05:12] Bah. [05:12] Thanks. [05:12] cold is 201945.176 [05:13] Over 2 minutes? [05:13] wgrant: so you're adding distinct there [05:13] Over three minutes. [05:13] to stop redundant rows? [05:13] I presume so. [05:14] lets see [05:14] 53 rows [05:16] 720 rows without the distinct [05:18] wgrant: so its doing about 10 times the work needed [05:18] wgrant: because the non distinct version is still 600ms [05:19] lifeless: It must think that a full scan is a better idea. It's probably right. [05:23] wgrant: rephrasing it may work [05:24] wgrant: its doing index scans [05:24] wgrant: an index that permits doing distinct inline may make it a lot better, we can ask stub to play with that later [05:29] wgrant: I'm adding a makeComponentSelection to the factory. [05:29] jtv: Why? [05:29] the constructor is fairly trivial. [05:29] The only bonus is omitting an import. [05:30] wgrant: makes it easy to say self.factory.makeComponentSelection(distroseries, "main") [05:31] Ah [05:31] Accepts component, component name, or none. [05:31] Also, it means that yokels such as yours truly won't have to worry about just how trivial they are to create. :-) [05:32] And meanwhile I'm on to the next hurdle: missing Sources files [05:33] Even with a component? [05:33] It may be the thing you ran into with my parallelization branch—it's a-f. [05:33] WARNING a-f: E: Could not open file /var/tmp/archive/distribution510022/dists.new/distroseries510031/main/source/Sources.bz2.new - open (2: No such file or directory) [05:34] Hmmm. [05:34] Does that dir exist? [05:35] (Luckily I rigged this test with a "now tar up the temp directory so I can have a look" finale) [05:35] Heh [05:35] oh wait, this is in /var/tmp [05:36] It'd be nice to avoid messing with /var/tmp, wouldn't it? [05:36] Yuck, crud piling up there! [05:37] wgrant: the dists.new directory isn't present [05:37] What's in /var/tmp/archive? [05:37] Besides dozens of distribution dirs. [05:39] Dozens of distribution-like dirs with "-cache," "-misc," "-overrides," "-partner," or "-temp" suffixed to their names. [05:40] What evil have to done to cron.publish-ftpmaster? It sounds like it's not moving the backup in. [05:40] s/have to/have you/ [05:42] I made it use a temp directory instead of /srv/launchpad.net, I sabotaged the lockfile usage, and I faked dsync-flist and commercial-compat.sh. That's about it, really. [05:43] echo "$(date -R): Moving backup dists into place..." [05:43] Does it do that? [05:44] wgrant: so its about 300ms in the bpr lookup [05:44] and 300-500 (depending on plan) in the bpph filtering [05:44] lifeless: Right. [05:45] 210814 rows in bpph [05:46] wgrant: yes it does do "Moving backup dists into place…" [05:46] jtv: Then why is dists.new not there? :/ [05:47] wgrant: well we solved that one by adding the ComponentSelection didn't we? [05:47] 16:37:12 < jtv> wgrant: the dists.new directory isn't present [05:48] dists.new's existence is not really related to ComponentSelection. [05:49] wgrant: but how does the (non-)existence of dists.new relate to this problem? [05:49] To the Sources problem, I mean. [05:50] Oh, I guess it probably moved it back away by the time you checked... [05:52] wgrant: I'd get stub to try that index [05:52] lifeless: Which? [05:52] wgrant: the one you said helped on mawson ? [05:52] Ah, right. [05:53] It still doesn't make it awesome. But I guess we'll see. [05:53] whats it on btw ? [05:53] bpph(archive, distroseries, status) [05:53] It cuts the BPPH search time massively. So probably not much help in the hot case. [05:55] Er, distroarchseries, but yeah. [05:56] ok, I'm going to stop fiddling [05:56] this is another case of overnormalisation [05:56] Thanks for trying. [05:56] bpr's shouldn't be shared [05:56] Oh? [05:56] For efficiency they should not. [05:56] For every other reason they should be. [05:57] or we should do a fact table for this [05:57] rather than chained content tables [05:57] * lifeless handwaves [05:58] This is the sort of situation in which cross-table indices would work well. The underlying table is immutable, so there is no concern there. [05:58] But yes, we do reasonably urgently need to denormalise a bit. [06:00] We also need collection preload helpers. [06:03] * lifeless sobs at related_projects in person.py [06:10] it aggregates product pillar counts but nothing else [06:10] Better than nothing. [06:10] Just. [06:35] Time for the buying of the foodstuffs, ja? === jtv is now known as jtv-eat [07:32] Yay, only two CCW oopses so far today. [07:53] wgrant: false positives still, or actual things-we-need-to-act-on ? [07:54] lifeless: The latter. [07:54] wgrant: excellent [07:54] wgrant: well, excellent that we can tell. [07:54] what is the issue? [07:56] Well, they are sort of actual things. Some of our code is crashing, possibly due to broken remote bug trackers. [07:56] But they are real code bugs. [07:57] cool [07:57] Fragile parsers, basically. [08:27] hi henninge, hi rvba === jtv-eat is now known as jtv [08:36] I can has review? https://code.launchpad.net/~lifeless/launchpad/bug-711071/+merge/53956 [08:48] lifeless: Hi Robert, I have two MP which include db changes, but I can't get a hold of stub these days ... maybe you could take a look at these (the db part)? [08:48] https://code.launchpad.net/~rvb/launchpad/db-distroseries-migrate-owner-to-registrant/+merge/53770 [08:48] https://code.launchpad.net/~rvb/launchpad/db-dds-diffpage-form/+merge/53913 [09:01] rvba: both should be looked at by stub [09:01] I will note though that this [09:01] 718 - potemplate.distroseries.owner = self.factory.makePerson( [09:01] 719 + makePerson = self.factory.makePerson [09:01] 720 + potemplate.distroseries.distribution.owner = makePerson( [09:01] 721 password='test') [09:01] is an ugly change [09:02] indeed [09:02] potemplate.distroseries.distribution.owner = \ [09:02] I'm still trying to change that [09:02] self.factory.makePerson(password='test') [09:02] would be better [09:03] the "makePerson = self.factory.makePerson" is only here for not having a really long line [09:03] indeed - see the \ instead [09:04] that was my first move ... but I've been advised the opposite ;-) ... and made the change [09:05] who by? [09:05] there was a meme that \ is bad, but that is a broken meme [09:05] Julian, the big guy :-) [09:05] I don't mess why people that tall :-) [09:06] s/why/with/ [09:06] (heck, 80 character limits are bad - we really should make usre of the realities of our development environments) [09:06] rvba: so its neither here nor there [09:06] rvba: I will only say, that seeing that, I would do a driveby fix if I was in the area [09:07] rvba: id do this: [09:07] distribution = potemplate.distroseries.distribution [09:07] distribution.owner = self.factory.makePerson(...) [09:08] Hi jtv! [09:08] s/id/I'd/ [09:08] henninge: this looks like a better option indeed [09:11] lifeless: any 'final thought' on this? [09:12] rvba: what henninge suggests is ok [09:13] rvba: however as I say, stub should look at these patches, he should be around AFAIK [09:13] lifeless: henninge thanks for the drive by advice :-) [09:13] lifeless: I'll ask him about the db part yes [09:14] rvba: np [09:16] morning all [09:17] hi bigjools === almaisan-away is now known as al-maisan [09:28] bigjools: what are the specs of the machine you run lp tests on ? - and how long does it take? [09:29] [to run everything, that is] [09:29] I have 2 machines [09:29] quad core Phenom, with 3 very sad cores doing nothing, takes 270 minutes [09:29] thats amd right ? [09:30] but 4 core - moderately old? [09:30] the "quad core" i5 with SSD takes about 240 IIRC but not run it on there for a while [09:30] 270 minutes? Is that with or without Windmill? [09:30] w/o [09:30] it's about 4.5 hours now [09:30] When I got my new machine in December, it was slightly under 3 hours. [09:30] yes, we have had a massive regression in time [09:30] ec2 is back down around 3.5 [09:31] Not much worse than it used to be. [09:31] Since I killed Windmill. === adeuring changed the topic of #launchpad-dev to: https://dev.launchpad.net/ | firefighting: - | On call reviewer: adeuring | https://code.launchpad.net/launchpad-project/+activereviews/ [09:36] adeuring: https://code.launchpad.net/~lifeless/launchpad/bug-711071/+merge/53956 [09:36] lifeless: I'll look [09:37] thanks [09:48] adeuring: Hi, I'd appreciate a review of https://code.launchpad.net/~rvb/launchpad/db-dds-diffpage-form/+merge/53913 [09:49] rvba: sure, let me just finish a review for Robert [09:49] adeuring: sure [09:49] thx [09:58] wgrant: my last ec2 took 4 hours [10:00] bigjools: Mine take between 3:30 and 3:45 [10:02] lifeless: sorry missed your question, yeah the Phenom is 2 years old now [10:03] I'm considering a new desktop [10:03] but parallel test runs... could breathe new life into it :) [10:03] yeah [10:03] will want 2-4GB per core though [10:04] lifeless: if money is not a problem I'd get an i7 [10:04] [because of silly overheads] [10:04] or perhaps there's better now [10:04] bigjools: I have a gen-1 i7, limited to 6GB memory [10:04] they're not slack :) [10:04] bigjools: runs like a rocket, but nowhere near enough memory to use all the cores well [10:04] not even for compiling drizzle ;P [10:05] lifeless: memory contention? [10:05] bus ^ [10:05] footprint [10:05] ah [10:05] 8 g++ instances >> 6GB of ram, for instance [10:08] lifeless: r=me [10:09] adeuring: thanks! [10:09] should fix 80 timeouts/day [10:10] huh, thats oddd [10:10] there is no 'set commit message' widget on https://code.launchpad.net/~lifeless/launchpad/bug-711071/+merge/53956 [10:10] or am I crazy? [10:12] there is now. weird === al-maisan is now known as almaisan-away === almaisan-away is now known as al-maisan [10:57] Morning, everyone. === al-maisan is now known as almaisan-away === almaisan-away is now known as al-maisan [11:03] stub: thanks for your review on my branch (lp:~rvb/launchpad/db-distroseries-migrate-owner-to-registrant) ... a question though: [11:03] stub: patch-2208-53-0.sql was adding a new 'registrant' column to distribution. This branch renames the 'owner' column into registrant for distroseries. Could you elaborate on where the conflict is? [11:04] rvba: The conflict is in my mind then :) [11:04] I'll change that now [11:04] stub: all right thx ;-) [11:06] lol [11:22] rvba: r=me [11:24] deryck: Javascript tests, lib/lp/registry/javascript/tests/test_milestone_table.html for example, are messed up; the skin appears missing. Applying http://paste.ubuntu.com/582035/ fixes it. I'm wondering if my build changes last week broke this. Do you know much about this? [11:30] adeuring: thx for the review, just pushed the changes you suggested. [11:31] rvba: great, thanks! [11:31] stub: thank you for your reviews. I just pushed the modifications you requested. === al-maisan is now known as almaisan-away [11:37] allenap: I think the CSS was broken because we changed to fetchCSS: false in the test. I never worked out what CSS it wanted because it was just trying the Yahoo CDN with some massive list of CSS. [11:37] allenap: so if adding that file link fixes it, awesome! [11:38] allenap: we had to set fetchCSS false to better play with Windmill as the test runnner. [11:38] deryck: Cool. As long as it wasn't me :) I might @import it from test.css. [11:38] allenap: sounds good. [11:38] Thanks for your help. [11:38] np. Thank you for working on this! [11:39] jml: Your assignment of that bug is encouraging. [11:39] wgrant: I'm just looking into it right now. No amazing insights. [11:39] Oh :( [11:39] Well, good luck... [11:39] wgrant: do you have any clue as to why the comment says "run a job that will not time out first, followed by a job that is sure to time out." when the code seems to only run one job? [11:40] rvba: Looks fine [11:41] jml: StuckJob is two jobs. [11:41] wgrant: ta. [11:41] See iterReady... the first one has an arg of 1, the second 2. Only when the arg is 2 does it sleep. [11:41] yeah. I see now. [11:42] It is not really sensible. [11:42] it seems a bit indirect. [11:47] huh. If I'm reading this correctly, TwistedJobRunner only runs one job at a time. [12:12] night y'all [12:13] lifeless: nn - just replying to your ha uploaders email BTW [12:13] bigjools: cool,thanks [12:14] nearly done if you want to wait :) [12:27] bigjools: take the time to reply fully [12:27] bigjools: I'm just lining up the ducks to point losas at after we finish the appserver capacity work, so there isn't a panic - we can knock ideas back and forth for maybe a couple of weeks without impacting schedules [12:28] * lifeless halts() [12:29] lifeless: np at all [12:31] :( [12:32] jml: No luck? === henninge is now known as henninge-lunch [12:32] Or perhaps anti-luck? [12:32] wgrant: some success. [12:33] wgrant: test_shhh manipulates sys.path on import and doesn't clean it up, which is why the _pythonpath thing doesn't bite us on the full suite run. [12:33] jml: Ahhh. [12:34] ampoule tries to get the correct sys.path for the "must be available" packages by importing them in the current process and manipulating their path. [12:34] Yep. [12:34] I got that bit. [12:34] OK. [12:34] It's a bit odd. [12:34] went down a bit of a rabbit hole assuming it was something to do with zope.testing respawning. [12:34] As did I, but then I deleted some stuff to prevent that and it was still broken. [12:35] I didn't think that test_shhh might have been doing path evil. [12:38] I'm going to change test_timeout to temporarily extend sys.path and fix up the test_shhh thing in another branch. [12:39] ... and file a bug about providing a decent mechanism for doing this with python-fixtures. [12:49] adeuring: Are you accepting reviews today? === bac changed the topic of #launchpad-dev to: https://dev.launchpad.net/ | firefighting: - | On call reviewer: adeuring, bac | https://code.launchpad.net/launchpad-project/+activereviews/ [12:49] gmb: i am if adeuring isn't [12:49] gmb: yes, but i'd like to start my lunch break right now. [12:49] adeuring: Ok, no worries. [12:50] So, bac. Hi :). [12:50] bac: https://code.launchpad.net/~gmb/launchpad/non-js-muting-bug-734732/+merge/53981 if you please [12:50] good morning === salgado-afk is now known as salgado [13:12] hi mrevell [13:12] Hello bac [13:13] * jml sets the test to run 50 times over and takes a brief programmer's break === almaisan-away is now known as al-maisan === henninge-lunch is now known as henninge [14:36] deryck: I'm trying to use jquery, but I can't figure it out. The queries in lib/lp/code/windmill/tests/test_recipe_index.py succeed on my page, and they shouldn't, because it's a different page. [14:36] deryck: e.g. self.client.waits.forElement(jquery=u'("div#edit-build_daily a.editicon.sprite.edit")', timeout=5) [14:37] ok, that's a bit scary. [14:37] abentley: you don't get an error with that on your page? [14:37] deryck: No. [14:38] deryck: it's green. [14:38] deryck: I'm using a pdb session to test. [14:39] deryck: meanwhile, $("ul#branch") fails, even though firebug identifies an element that way. [14:40] Apparently, the $ makes the difference. [14:42] abentley: can you commit the test you have to your branch so I can pull and run it? [14:42] deryck: sure, one sec. [14:44] deryck: pushed to bzr+ssh://bazaar.launchpad.net/~abentley/launchpad/js-translation [14:44] abentley: ack. [14:44] oh yippee, another Windmill hang! [14:44] deryck: run with bin/test -t test_sharing_details windmill --layer=WindmillLayer [14:45] abentley: let me get a bt on my current Windmill hang, and then I'll kill it and look at yours. [14:45] deryck: thanks! [14:59] adeuring, bac: I have a minor JS branch for review, if you'd be so kind: https://code.launchpad.net/~gmb/launchpad/fix-js-errors-bug-737557/+merge/54007 [14:59] gmb: i'll do it [14:59] gmb: I'll look [14:59] i win! [14:59] bac: ok ;) [15:00] Thanks :) [15:00] bac: https://code.launchpad.net/~gmb/launchpad/fix-js-errors-bug-737557/+merge/54007 [15:00] Dur. [15:00] Sorry, forgot I'd pasted it. [15:11] abentley: ok, sorry. got what I need now. Turning to your branch. [15:11] sinzui: are you saying you want me to put the line-height: 20 back in? [15:13] bac: no. I do not want that instruction anywhere in the code base [15:14] sinzui: good -- it's gone [15:14] \o/ [15:15] Sorry about the confusion. I got very distracted yesterday evening. I composed my reply to you, but never sent it [15:37] abentley: ok, so this has me terrified of the reliability of jquery selectors now. [15:38] deryck: sorry. [15:38] abentley: if you try to click jquery=u'("div#edit-build_daily a.editicon.sprite.edit")' it will fail. But using waits.forElement or asserts.assertNode, it passes. [15:38] abentley: which clearly makes no sense and is wrong [15:40] adeuring or bac, can you review https://code.launchpad.net/~leonardr/lazr.restful/operation-sanity-check/+merge/54014 ? [15:40] deryck: so avoid using with those? I've been plugging away using xpath, and it's... beauty-challenged. [15:40] leonardr: i'll look [15:40] great [15:41] abentley: I'm not sure what to recommend at this point. xpath is equally problematic. You often get false positives the same way, from crafting xpath expressions you don't understand. [15:41] adeuring: i'll fill in some background in a comment [15:41] since the feature is new [15:41] leonardr: great, thanks! [15:42] abentley: or fragile tests from poorly crafted xpath. [15:42] abentley: and there is no way to hang IDs off this html? because of the menu stuff. [15:42] deryck: I wonder if any of our intermittant failures are from waits.forElement(jquery= ? [15:43] abentley: if it's a failure and not a hang, that's easy to check -- i.e. was it a jquery line? Hangs don't appear related to this at all. [15:44] Project devel build #553: FAILURE in 4 hr 58 min: https://lpci.wedontsleep.org/job/devel/553/ === al-maisan is now known as almaisan-away [15:44] deryck: Yes, not hangs. But failing to wait long enough would cause a failure on a later line. [15:44] right [15:45] indeed, it's something to look out for. [15:45] adeuring: background is added [15:45] abentley: but we're only using it in recipe tests at this point, I think. [15:45] deryck: I could use ids, but classes seemed a better approach, because I could consistently use the same value-- class=incomplete, not id=branch-incomplete [15:46] abentley: I don't see an issue with specific IDs. Reuse is not always a virtue when dealing with the DOM and js and js testing. [15:46] Then I can do foo=Y.one('#branch'), foo.one('.incomplete') [15:47] It just makes it simpler once you've got the checklist node. [15:48] but you can hang id="branch-incomplete" off the element just for the sake of testing. sure, it's hacked on, but if the test is less fragile. [15:49] abentley: I leave it to you, though. Just warning that xpath is usually a source of trouble at some point. But maybe this is easy enough xpath. [15:49] deryck: I would rather not have both class=incomplete and id=branch-incomplete. That's a DRY violation to me. [15:50] abentley: sure, but I'm arguing DRY is not that big a deal in HTML. ;) :) [15:50] deryck: But I hadn't realized the testing implications before, so perhaps it's better to change my approach now. [15:50] abentley: yeah, HTML is not code. ;) [15:51] deryck: i'm saying if I add ids, I'll remove the classes. No need for both.' [15:51] abentley: but I do agree it's generally better if you can avoid. less characters, less to download. but our testing story is weak without the ids. and you could just use branch-incomplete and not the class. [15:51] agreed ^^ :-) [15:53] abentley: ok, so I'll lunch now, if you've got everything you need. [15:53] deryck: anyhow, I think I have to use xpath with the picker. [15:53] abentley: maybe so. this is one area where we've had to use it and can't avoid it in the past. [15:54] deryck: cool. Thanks. Enjoy lunch. [15:54] ok, cool. thanks! === deryck is now known as deryck[lunch] [16:12] mrevell, hi. I'm trying to find the accordion prototyping round 2 version 2 slides [16:12] I found https://dev.launchpad.net/LEP/BetterBugSubscriptionsAndNotifications/Testing/AccordionPrototypingRound2 === salgado is now known as salgado-lunch [16:13] which has version 2 [16:13] Ah, glad you got it gary_poster [16:13] but I can't find version 2 [16:13] and https://wiki.canonical.com/Launchpad/UserResearch/BugSubsFeb2011/Round2 points to the wrong location (round 1) [16:13] Oh, sorry [16:13] Let me look [16:13] thank you [16:16] mrevell, found it somehow or other :-) [16:16] gary_poster, I've created a page at https://dev.launchpad.net/LEP/BetterBugSubscriptionsAndNotifications/Testing/AccordionPrototypingRound2/Version2 which links to the 5 slides and I've updated the wiki page [16:16] on Canonical [16:16] awesome thank you mrevell [16:18] no probs :) [16:23] leonardr: r=me. Thanks for the new checks and for the explanation! [17:08] bac: will you have time to review https://code.launchpad.net/~sinzui/launchpad/tea-and-biscuts/+merge/54041 today? === deryck[lunch] is now known as deryck === salgado-lunch is now known as salgado === adeuring changed the topic of #launchpad-dev to: https://dev.launchpad.net/ | firefighting: - | On call reviewer: bac | https://code.launchpad.net/launchpad-project/+activereviews/ === beuno is now known as beuno-lunch [18:01] deryck: turns out there's some picker logic in testing.windmill.widgets, so we don't need to use xpath for it. [18:02] excellent! [18:02] I forgot about that actually. Sorry. [18:03] deryck: np [18:07] deryck: how would you test for the absence of a class on a node? Currently, I'm doing self.client.waits.forElement(xpath='//*[@id="branch"]/*[@class="complete sprite yes"]') to ensure the node is not unseen. [18:10] abentley: that looks fine. Are you worried that by not being explict about the absence of unseen that the test will pass but not be correct? [18:10] deryck: I'm just wondering if you would avoid using xpath for that, and if so, how. [18:12] abentley: well, I would have mad the ID "branch-complete" or given it some other unique ID, to avoid the xpath. As we talked about eariler. [18:13] deryck: okay, but if you did that and did forElement(id="branch-complete"), how would you know what the class was? [18:13] leonardr: ping [18:13] jcsackett, yo [18:14] hi. do you have a few minutes to mumble or skype about webservice stuff? [18:14] abentley: I wouldn't test that in Windmill. I would do that in the YUI test. I wouldn't worry much about DOM in the Windmill test. You really should only care the data was saved correctly. [18:15] jcsackett, sure, 1 minuteeeeeee [18:15] leonardr: thanks. [18:15] deryck: If I don't wait until the dom is updated, how do I know when it's safe to check the model? [18:16] abentley: do you not add some class when you remove the unseen class, i.e. changing it to "seen"? [18:16] deryck: all pickers are using the wrong headings. I do not think the instructions should be a heading at all in fact. That will make the text smaller [18:16] sinzui: agreed. Just plain on text. [18:17] deryck: No, I don't add a "seen" class. But I could use the other element, where I add "unseen". [18:17] deryck: I can start this in a hour or so...I was irked by the very add-member issue this morning when testing [18:17] abentley: yes, that would work. [18:17] deryck: Okay, how would that work? [18:18] deryck: forElement(id="branch-incomplete") still won't wait until the DOM is updated. [18:19] abentley: I'm getting confused. :-) I thought you just said you could wait for the unseen class on the other element. so waits.forElement(blah blah blah about the other element now). That won't work? [18:20] sinzui: thanks! Did something change recently to cause this? [18:20] deryck: I've got lots of elements that have the unseen element, so waits.forElement(class="unseen") will not wait until branch-incomplete gains the class. [18:20] jcsackett: expose_as_webservice_entry() [18:20] s/unseen element/unseen class/ [18:20] exposed() [18:21] deryck: sort of. Heading sizes were updated to be like the guidelines. but in this specific case, the instructions exceeded the default width of the picker last December when we fixed security in team membership [18:21] expose_as_webservice_collection() [18:22] deryck: it's fine if the answer is "I would use xpath in that case". [18:23] abentley: can you craft an xpath expression or jquery selector? That would be my suggestion, yes. Use one of those. [18:23] sinzui: ah, gotcha. [18:23] deryck: I am already using an xpath expression, so I'll just keep using it, then. [18:25] abentley: ok. [18:28] deryck: you said to avoid xpath where possible. I was just exploring where that's possible. [18:29] abentley: yeah, maybe it's not possible here. I'm always worried when we're checking for the visibility of an element. But maybe there's no other way to know the page changed. [18:31] deryck: when the page changes, one element becomes visible, the other is hidden, and the href and contents of a link are changed. [18:34] abentley: so I'd check for the contents change then. [18:34] abentley: textIn [18:36] ah, crap, that's an assert [18:36] deryck: all the uses I see are client.asserts.assertTextIn. Is there a waits version? [18:37] abentley: yeah, that's what I just noticed. Let me look [18:40] abentley: so that won't work. Sorry. You could do waits.forElementProperty to do the classname or href nicer than xpath. [18:40] deryck: Ah, okay. === beuno-lunch is now known as beuno [19:14] \o/ [19:20] OK. I think I've got this failure reproducing consistently. [19:20] Time to make some food and then track the bugger down. [20:04] Have a nice weekend, everyone. [20:22] hi jcsackett, where do i see the diff overlay you mention? [20:25] jcsackett: nm, i found it [20:31] bac: good thing. i never got the ding i usually get to let me know someone's pinging me. :-) [20:41] nice branch jcsackett, r=ac [20:41] er, r=bac [20:42] thanks, bac. [20:44] sinzui: standup at 5:30 or at 6, given our other members are enjoying the weekend? [20:44] We can do it now if you like [20:46] sinzui: right now i am at a coffee shop. i'm figuring out when i need to make the short walk back home. :-) [20:46] Ping me when you are ready [20:46] sinzui: righto. === bac changed the topic of #launchpad-dev to: https://dev.launchpad.net/ | firefighting: - | On call reviewer: - | https://code.launchpad.net/launchpad-project/+activereviews/ [21:07] wallyworld, do you know where thumper is? i'd like to do the standup and then take a nap [21:08] unless... oh, wait, it's saturday for oyu, isn't it? [21:08] leonardr: yes it is [21:08] take a nap [21:08] ok, never mind then. nap time! talk to you on monday/tuesday [21:16] sinzui: i am now in a mumble friendly place. i can do standup whenever you like. [21:16] I think ampoule handle timeouts badly [21:16] jcsackett: starting mumble === salgado is now known as salgado-afk [22:58] Yippie, build fixed! [22:58] Project devel build #554: FIXED in 5 hr 16 min: https://lpci.wedontsleep.org/job/devel/554/ [23:33] Project windmill build #72: FAILURE in 1 hr 16 min: https://lpci.wedontsleep.org/job/windmill/72/