/srv/irclogs.ubuntu.com/2011/05/11/#launchpad-dev.txt

sinzuiwgrant: mumble?00:01
wgrantsinzui: You can't hear me?00:02
sinzuiOnce again I think I need to restart to hear00:02
lifelessI'm amazed our test suite works at all00:09
lifelessos.environ['HOME'] = self.root00:10
lifelessin the buildd tactestsetup affects all subsequent tests.00:11
lifelessbut00:11
lifelessit helpfully deletes that directory00:11
wgrantHeh00:11
lifelessso when rabbit tries to start up00:12
lifelessit uses that as home00:12
lifelesswhich doesn't exist00:12
wgrantAhh00:12
lifelesstwo bugs: rabbit should isolate itself.00:12
lifelessand we should restore global state we futz with00:12
lifeless\o/00:13
lifelessbug 780794 if you're interested00:14
_mup_Bug #780794: tests of/using BuilddSlaveTestSetup mangle global state for other tests <build-infrastructure> <Launchpad itself:Triaged> < https://launchpad.net/bugs/780794 >00:14
sinzuiwgrant: I am perplexed. My test script only passes the person changes. None of the question_target methods work00:30
wgrantsinzui: Did you change the inheritance hierarchy?00:30
wgrantsinzui: Each object has a single interface exported.00:31
wgrantSo eg. IProduct needs to inherit IQuestionTarget.00:31
sinzuiNo, But I am wondering I I need to00:31
wgrantProduct cannot implement IProduct and IQuestionTarget directly.00:31
sinzuiokay, that is my mistake00:32
sinzuiwgrant The branch is okay to release, but I need to followup with another branch to pass my test00:33
wgrantsinzui: Great, thanks.00:33
LPCIBotYippie, build fixed!00:36
LPCIBotProject db-devel build #535: FIXED in 5 hr 31 min: https://lpci.wedontsleep.org/job/db-devel/535/00:36
lifelessdoes Failure in test testEpochNonInteger (lp.archivepublisher.tests.test_debversion.VersionTests)00:49
lifelesshappen for anyone else?00:49
wgrantHave you run update-sourcecode lately?00:51
wgrantThat test is new.00:51
wgrant30 rev deploy time :(00:53
lifelessno, I haven't00:55
wgrantlifeless: It was a bug in python-debian.00:59
wgrantSo update-sourcecode and try again.00:59
wgrantGreeeeeeeen01:01
wgrantzomg01:02
wgrantAssignee picker on +filebug works on qastaging.01:02
LPCIBotProject windmill-devel build #63: STILL FAILING in 44 min: https://lpci.wedontsleep.org/job/windmill-devel/63/01:20
wgrantHmm.01:40
wgrantI wonder how many users the API export of archive.checkUpload has.01:41
* wgrant checks the PPR.01:42
lifeless\o/\o/\o/\o/\o/\o/01:44
wgrant?01:44
wgrantRabbit working?01:44
lifelessyup01:44
lifelesslp-land in a second01:44
wgrant!!!01:44
wgrantDid you decrapify the U1 harness a bit?01:45
lifelessa tad more01:45
wgrantGreat.01:45
wgrantNext stop: wildcherry.01:45
lifelessbut I want the darn thing in tree01:45
wgrantYeah.01:45
lifelessso that the next 'if we had queues' comment I see I can drop the bomb on01:45
wgrantYes yes yse.01:45
lifelessof course, we have 1 person (jtv) with srs queue experience01:45
lifelessso its not at cargo cult point yet01:46
wgrant:( 127 checkUpload calls last month.01:46
wgrantMaybe I can grep logs and destroy whoever is doing that.01:46
jtvStereotactic RadioSurgery?01:46
wgrantBecause it's a shit API.01:46
lifelessjtv: serious01:47
jtvlifeless: ah... so, exciting rabbit things happening?  Gimme!01:47
lifeless:)01:50
jtvoh damn crappy shitty damn bad connection I smegging hate this01:52
lifeless:>01:52
lifelessso I answered you with01:52
lifeless:)01:52
jtvlifeless: got the smileys, and would be joining in the smiles if it weren't for the broken connections!01:55
spmo/ jtv01:55
jtvHi spm!01:55
jtvAnd the good thing about bad connections is you get to keep saying hello to your friends.  :)01:56
lifelessjtv: the next step is a Layer for rabbit, which should be trivial with the fixture01:56
jtvAigh!  Not a layer!  We want resources and fixtures!01:56
lifelessjtv: and after that we probably need some test support - things to say 'a message was sent' and so on01:56
lifelessjtv: we have a fixture01:56
lifelessjtv: but it needs to fit in the current test layout01:56
jtvWhich we all hate :)01:57
lifelesssure01:57
lifelessorthogonal problem01:57
jtvTrue.01:58
lifelessanyhow01:58
lifelesspull devel01:58
lifelessits there01:58
jtvGreat01:58
jtvMeanwhile, I thought I was being clever but am running into problems that you'd be able to help with.01:58
lifelessshoot01:58
jtvMy test takes 6s or so.  I thought I could speed it up by re-using test SPPH objects across tests, because creating those seems to be taking most of the time.01:59
jtvI had a really nice idea for that: a generator that caches a list of SPPHs.01:59
jtvYou request one, it gives you the next one from its cached list.01:59
lifelessthe db layer rolls back the db01:59
jtvYes.  :(01:59
lifelesseither have one test, or accept the cost, or test narrower layers that don't need the db (oops the last one is [for now] science fiction)02:00
jtvI suppose I might produce fakes, but it gets a bit hackey.02:00
jtv(Thank you, alarm clock, but I've been at work for hours)02:00
jtvThis particular one is pretty painful.  It'd have been nice to avoid it.02:01
jtvI do have a plan B:02:01
jtvsee if somewhere in the factory we do commits just for the Librarian's sake.02:01
jtvIf so, use FakeLibrarian and replace the commit with the fake.02:02
jtvIt's really ridiculous: at one point I'm spending 0.4s on creating 2 test objects!02:02
lifelessyeah02:02
lifelessthats about 10 tests in bzr :>02:02
jtvHmm not a lot of committing going on in the factory these days.  That's good, but it means the remaining fruit hangs higher.02:03
wgrantjtv: Have you profiled?02:03
wgrantThat's hideous.02:03
wgrantAlternatively use makeSourcePackagePublishingHistory, which doesn't create any files AFAIK.02:04
jtvOnly print-profiling so far.02:04
wgrantAt least I was able to use it in DatabaseFunctionalLayer without a problem.02:04
jtvIt _is_ makeSourcePackagePublishingHistory that's taking up that time.02:04
jtvIt seems to be a bit irregular somehow.02:04
wgrantSome apparently trivial utility operations can be really slow.02:06
wgrantNFI why.02:06
jtvI'm going to try it in "make harness" with SQL logging on.02:08
jtvSee if it's doing any outrageous DB work.02:08
wgrantYeah.02:09
wgrantThere's lots of SQL.02:09
wgrantHuh.02:10
wgrantmakeSPPH repeatably takes 0.3s02:10
wgrantThat's awful :/02:10
jtvQuite.02:11
jtvImagine what we could save if we had an easy way around that.02:11
wgrantI guess it creates lots of people.02:11
wgrantWhich is slow.02:11
wgrantBecause of Account.02:11
jtvI was going to ask about that: how does that currently work?02:12
wgrantWhich?02:12
wgrantAccount?02:12
jtvAccount.  I half expected to see commits to synchronize the account/LP dbs.02:12
wgrantRight, that was removed a while ago.02:12
wgrantSince we no longer have a HA auth store.02:12
wgrantBecause SSO is a separate DB.02:12
wgrantSo you no longer need to commit after creating people.02:13
lifelessand session is also not replicated02:13
lifelessif we fail over its trashed02:13
wgrantLooks like creating a person takes 15 queries :(02:13
wgrantStill should be quick, though.02:13
* wgrant fires up a profiler.02:13
wgrant:( no context manager profiler02:14
jtvCan't start one of the regular python profilers in "make harness"?02:16
jtvLooks like makeArchive() takes up a significant portion of the time of a makeSPPH().02:17
wgrantYes. But a context manager would probably be easier.02:17
lifelessbzrlib.lsprof.profile(...) is your friend02:18
lifelessand yes, it works in harness02:18
wgrantCan we just merge bzrlib into the standard library or something?02:18
lifeless*blink*02:18
lifelesslp.testing.storm02:19
* lifeless sobs02:19
wgrantDoes not exist.02:19
lifelesslib/lp/testing/storm.py02:19
lifelesspull devel02:19
lifelessits quite buggy for new generic code02:20
wgrantI pull in trepidation.02:20
lifelesssinzui: when you said hack, I didn't imagine this02:21
lifelesssinzui: (sorry for being negative; it is a bit of a tricky problem)02:22
wgrant28% in the DB, 20% clearing lazr.restful memcache...02:26
lifelessthe representation cache?02:26
wgrantYes.02:26
lifelessturn the f*er off02:26
wgrant10% on top of the 28% in the storm tracer.02:26
lifelessI thought the representation cache was off in prod anyhow02:27
wgrantIt is.02:27
wgrantKilling the representation cache only shaved off a bit under 10%.02:29
wgrantNow 50% in storm, 40% in the DB.02:30
lifelessOOPS-1957DY3602:31
lifelessactually filing a bug should not lookup similar bugs ><02:32
lifelessright, bug 78083502:32
_mup_Bug #780835: representation cache a pessimism <lazr.restful:New> < https://launchpad.net/bugs/780835 >02:32
jtvPessimism or pessimization?02:33
lifelessbah02:33
lifelessyes02:33
lifelessESLEEPFFFFAIL02:33
jtvHmm I got some savings of a few tens of seconds by eliding Person constructions.02:34
lifelessfixed02:34
wgrantjtv: createPersonAndEmail seems to take 33% of the time.02:35
wgrantAnd a third of that is EmailAddress.new...02:36
wgrantHow.02:36
lifeless                                                                                                                       02:37
lifeless        if self.getByEmail(email) is not None:02:37
lifeless            raise EmailAddressAlreadyTaken(02:37
lifeless                "The email address '%s' is already registered." % email)02:37
lifelessLBYL :(02:37
wgrantYeah.02:37
lifeless        assert status in EmailAddressStatus.items02:37
lifelessis inefficient (should be a type check)02:37
wgrantStill trivial.02:38
lifelessvalid_email looks sane enough02:39
lifelesshow many persons are you creating?02:39
wgrant5, looks like.02:39
lifelessoh02:39
lifelessthat LBYL isn't indexed.02:39
wgrantAha.02:39
lifelesspossibly02:39
wgrantIt must be, surely.02:39
lifelessneed to check one more thing02:39
lifeless    "emailaddress__lower_email__key" UNIQUE, btree (lower(email))02:39
lifelessah, it is02:40
wgrant6% in PersonSet.getByName :(02:40
jtvAt <100 persons in the sample data, would it matter anyway?02:40
lifelessjtv: psosibly ;>02:40
jtvI nearly halved my test time just by eliminating makePerson calls.02:40
lifelessbut02:40
lifelessits stupid to have an index on a function02:40
wgrantlifeless:02:40
lifelesswhen we can apply the function on data insertion02:40
wgrant Sort  (cost=6.65..6.66 rows=1 width=39) (actual time=0.146..0.146 rows=0 loops=1)02:40
wgrant   Sort Key: email02:41
wgrant   Sort Method:  quicksort  Memory: 25kB02:41
wgrantBut should still be fast, given how small it is :/02:41
wgrant   ->  Seq Scan on emailaddress  (cost=0.00..6.64 rows=1 width=39) (actual time=0.096..0.096 rows=0 loops=1)02:41
wgrant         Filter: (lower(email) = 'email755122@example.com'::text)02:41
wgrantThat's the plan.02:41
wgrantSo WTF is it so slow.02:41
wgrantIt's sub-ms.02:41
jtvlifeless: absolutely... especially because last I heard, function indexes weren't quite as effective as I expected.02:41
lifelessspecifically, all queries on email come from our appservers02:41
lifelessjoins are on id02:41
lifelessso we should be able to lower() in the appserver before querying rather than in the db02:42
lifelessanyhoo02:42
lifelesswgrant: how many ms does your profiling think it is?02:42
lifelesswgrant: and what profiler did you use?02:42
wgrant5% of roughly 300ms.02:42
wgrantSo 15ms.02:42
wgrantI used bzrlib.lsprof.02:43
lifelessok02:43
wgrantThe query is 200µs hot.02:43
lifelessso @ 15ms that suggtests 14ms in python02:43
jtvwgrant: what exactly was slow?02:43
lifelesswgrant: how long does the profiler think the cursor get took ?02:43
wgrantjtv: EmailAddressSet.getByEmail02:44
jtvWeirdness.02:44
jtvUnexpected ASCII/Unicode conversion issue?02:44
jtv(Since this is one of the few cases where ASCII would probably be fine)02:45
wgrantkcachegrind confuses me.02:45
wgrantOr maybe it's just lying to me. It's not showing any callees beyond selectOne.02:47
lifelessyou've turned min-node down ?02:47
wgrantAs low as it goes, yes. But it's still showing some nodes without children. Hrm.02:51
lifelessC modules add some fun02:51
jtvStripped?02:51
jtvOr otherwise without debug info?02:51
lifelessthey show as a monolithic block in the profiler02:52
lifelessbecause the profiler works by running code between every opcode02:52
lifeless(thats a lie, its every line, shrug)02:52
lifelessand when C modules call back into python the callgraph can be fun02:53
spiv'perf' can sometimes show you where C modules are consuming time.02:53
spiv(Not tied into the Python callstack at all, of course)02:53
wgrantI think kcachegrind might just be broken.02:53
wgrantgprof2dot sees calls into EmailAddress.new as expected. kcachegrind sees 0.02:53
lifelesswin02:54
wgrantHmm. kcachegrind shows two createPersonAndEmail functions.02:55
wgrantI wonder if some C in the middle is breaking everything.02:55
wgrantOne of them has no calls.02:55
wgrantAnd the one with no calls calls the uncalled functions!02:55
wgrantThat's not very nice.02:55
lifeless\o/02:55
lifelessthat might be fixed by jams recent lsprof tweak in bzrlib actually02:55
wgrantAhh, and the harness will be using ancient bzr...02:56
wgrant2.2.2 :/02:56
wgrantWe should really fix that.02:57
lifelessyes!02:57
lifelessbzr team have been doing that02:57
wgrantHave they?02:57
lifelessthats my understanding02:57
lifelessIMBW02:57
wgrantI don't think it's been updated since Code was disbanded and then everyone ran away,.02:58
wgrantIt was last changed 2011-02-09, when I applied a patch for a stacking bug.02:58
wgrantSo it hasn't been upgraded since Code evaporated.02:58
wgrant=> bzr probably doesn't do it.02:59
wgrantlifeless: Ahh, that's much better.03:12
wgrantThe tree is no longer lots of trees.03:12
wgrant(after a quick port to 2.4b2)03:13
wgrantPerhaps I will toss it at ec2 and see what breaks.03:18
wgrantAfter I work out how to use weave_fmt properly as a plugin.03:18
wgrantAhh03:24
wgrant2/3 of the getByEmail time is flushing writes.03:24
wgrantBefore it does the find.03:24
wgrantIt would be more illuminating if we could turn off the write cache...03:25
LPCIBotProject windmill-devel build #64: STILL FAILING in 1 hr 8 min: https://lpci.wedontsleep.org/job/windmill-devel/64/03:37
LPCIBotProject windmill-db-devel build #262: STILL FAILING in 1 hr 7 min: https://lpci.wedontsleep.org/job/windmill-db-devel/262/03:42
lifelesswgrant: which write cache03:54
wgrantlifeless: Storm's.03:54
lifelessthe same one that broke commits on the archive thingy the other week ?03:54
wgrantHm?03:55
wgrantAnyway, I emulated disabling it by flushing after adding each new object.03:56
lifelesswhen I eager loaded source packages03:56
lifelesscommits crawled to a halt because of O(cache size) behaviour in commit03:57
wgrantAh.03:57
wgrantNo, this is the dirty object cache.03:57
lifelessI'm trying to decide between04:09
lifelessfix a timeout04:09
lifelesswrite a rabbit layer04:09
lifeless$other04:09
wgrantRabbit.04:09
wgrantRabbit will fix lots of timeouts.04:10
wgrantlifeless: staging would like to have http://paste.ubuntu.com/605983/ run on it with an EXPLAIN ANALYZE.04:17
lifeless[qa]?04:18
wgrantEither.04:18
lifelesshttp://paste.ubuntu.com/605985/04:18
wgrantlifeless: And hot?04:20
lifeless340.21604:20
wgrantSlower than DF :(04:20
wgrant205ms hot.04:20
lifeless               ->  Hash  (cost=13594.89..13594.89 rows=5168 width=8) (actual time=112.326..112.326 rows=5189 loops=1)04:20
wgrantBut more like what I was expecting.04:20
lifeless               ->  Index Scan using securesourcepackagepublishinghistory__distroseries__idx on sourcepackagepublishinghistory  (cost=0.00..19355.35 rows=16746 width=24) (actual time=0.259..214.622 rows=17420 loops=1)04:21
StevenKHold on, my world is crashing down.04:21
jtvWe'll have to revise the term "dog [food] slow"04:22
lifelesswgrant: you just restored; less bloat04:22
StevenKstaging should have just done that, too?04:23
lifelesshahahahaahhahahahahaha04:24
lifelessno, restore failed04:24
StevenK:-(04:24
lifelessalso this is qastaging04:24
StevenKAh04:24
lifelesswhich is better to test on for things that aren't coupled to schema changes04:25
StevenKBut still only restores on demand :-(04:25
lifeless(same hardware, longer lifetime - it gets its own bloat going, and its where we qa upcoming deploys)04:25
jtvwgrant: did you eliminate that silliness in packagecopier where a permissions error was suppressed if the user had Append privileges?04:26
jtv"if reason is not None: raise CannotCopy(reason)" instead of a nested "if" to give it another chance?04:27
=== jtv changed the topic of #launchpad-dev to: https://dev.launchpad.net/ | On call reviewer: jtv | https://code.launchpad.net/launchpad-project/+activereviews
jtvOr maybe it was Gavin.04:28
jtvAnd by the way wgrant, would you care to review my "copy asynchronously if there's more than 100 packages to copy" branch?  https://code.launchpad.net/~jtv/launchpad/bug-780319/+merge/6057104:29
lifelessjtv: 100?!04:29
lifelessjtv: we struggle to copy 2 in the webapp04:29
jtvThat's what's been specced.04:29
lifelesswell, reality is going to intervene04:30
jtvThen feel free to lower the threshold to 1.  :)04:30
StevenKEr, doesn't it make use of PackageCopyJob?04:31
jtvYes.04:31
StevenKThen that's completly different.04:31
StevenKlifeless: ^04:31
lifelessso if its using a job04:31
lifelessits already asynchronous04:32
lifelessisn't it?04:32
lifelessjtv: the time budget for backend tasks that hold transactions is effectively 7-8 seconds (allowing time for webapp changes after they start actually doing writes04:33
jtvThis implements a choice between synchronous and asynchronous.04:33
lifelessdoes synchronous mean in-webapp04:34
jtvYes.04:34
lifelessif that is set to 1, it might work sometimes.04:34
jtvIs someone planning to speed that up massively, perhaps?04:35
lifelessyes, by making it async04:35
lifeless964  OOPS-1955CE140  Archive:+copy-packages04:35
jtvI mean the actual copying.04:35
lifeless11 /    8  Archive:+copy-packages04:35
wgrantCopying is very fast.04:36
wgrantCopy checking is still slow sometimes.04:36
lifelessand when its slow its glacial04:36
lifeless11 failures on 416 copies yesterday04:36
lifeless2.5% failure rate04:36
wgrantLots of those were probably delayed copies.04:36
lifeless99th percentile is 8.3 seonds04:37
lifelessmean is 3 seconds04:37
wgrantNon-sql time: 4333 ms04:37
lifelesswhen you say 'fast'04:37
wgrantlifeless: +copy-packages or syncSource?04:37
lifelessArchive:+copy-packages04:37
wgrantThat's got UI crap.04:37
wgrantWhich is unoptimised and constant.04:37
lifelessArchive:EntryResource:sync has its 99th percentile 11 seconds04:37
lifelessmean 2.15 seconds04:38
wgrantRight, because it's used a lot for delayed copies, or copies from -proposed to -updates.04:38
wgrantWhich close bugs.04:38
wgrantNone of which is optimised.04:38
lifeless99th percentil of db time is 6.5 seconds04:38
wgrantActual copying is fast. Delayed copies are not. Bug closing is not.04:38
wgrantChecking when the source already exists in the target archive is not.04:38
lifelesssure, but does 'do a copy' trigger these other htings?04:38
wgrantYes. They can and should be optimised.04:38
lifelessif it does, then a discussion about copying has to assume that copying is slow [and optimisable perhaps]04:39
jtvIn any case, my branch isolates a policy choice for when to do which.04:39
lifelesswhich is great04:39
lifelessI guess I'm saying that right now, I would put the policy at 004:39
jtvI figure improving and tuning that choice is a separate step.04:39
lifelessjtv: in fact, there is a good request: please make sure its possible to disable synchronous copying entirely.04:40
wgrantAs long as these both use pretty much the same code.04:40
wgrantAnd it isn't like delayed copies.04:40
wgrantIf it is anything like delayed copies I will rs it out now.04:40
jtvrs?04:40
wgrantDelete without review, because delayed copies are just that hideous.04:41
jtvWhere do delayed copies come into the picture?04:42
wgrantThey are the old asynchronous copy mechanism.04:42
jtvI think I saw bits of that, deeper down in the call tree.04:43
wgrantWhich is not even slightly like the synchronous copy mechanism.04:43
wgrantIf both of these use the direct copy function, I am happy.04:43
jtvWhen do we use which?04:43
jtvThey use do_copy.04:43
wgrantDelayed copies are used for copies from private to public archives.04:43
jtvSo that's a policy decision, not some kind of time management?04:43
wgrantHalf and half and half of some more hacks.04:44
StevenKDelayed copies are *hideous*, and I'm going to remove them04:44
wgrantIt was initially because those copies needed to reupload files to the public librarian.04:44
wgrantWhich was slow.04:44
wgrantThen more hacks were layered on top that were unrelated.04:44
wgrantAnd then it became clear that the initial rationale was wrong: you can just toggle the restricted flag in the DB.04:44
wgrantBut it all remains.04:44
jtvSo... it might make sense for the sync/async choice to check whether any of the source archives are private and the dest archive is public?04:45
wgrantThis UI cannot go anywhere near production until delayed copies are dead and buried.04:45
wgrantOr we'll have doubly async copies.04:45
wgrantAnd badness.04:45
jtvIf you're worried about doubly async copies, then I guess that would be a blocker for using PackageCopyJobs.04:47
wgrantDoubly async is stupid, and the behaviour is inconsistent. a PackageCopyJob should never use a delayed copy.04:47
jtvWell, both it and the view code call do_copy.04:47
wgrantAnd do_copy will create a delayed copy if the stars are aligned and it deems the witchcraft justfieid.04:48
jtvIf do_copy may then defer yet again to another async kind of job, then that needs fixing but it's independent of my branch.04:48
jtvAnyway, I need to go out and find food and coffee.  In that order: I'm that desperate.04:48
wgrantAs long as this is all heavily flagged.04:49
jtvWith wgrant telling me the safe choice is to go synchronous and lifeless telling me I should probably always go asynchronous.  Whee!04:50
wgrantI didn't say to go synchronous.04:50
wgrantI said that synchronous can be fairly fast, and that you are to under no circumstances go *doubly* asynchronous by bringing delayed copies into the mix.04:50
jtvIn other words, that "the safe choice is to go synchronous"04:51
wgrantSynchronous will do delayed copies in the same cases as asynchronous will.04:51
jtvAnd so delayed copies can't be handled synchronously as per robert and can't be handled asynchronously as per william?04:52
wgrantDelayed copies must not be handled at all.04:52
wgrantIf you are creating them in this new workflow you are doing it wrong.04:52
wgrantBut you may be doing it accidentally.04:52
jtvHow would I know whether I'm creating them?04:52
jtvThis still seems orthogonal to me.04:52
wgrantIf you're not aware of them then it's not orthogonal.04:53
wgrantYou need to be aware of the horrors that lurk within packagecopier.04:53
wgrantSo, the reason I like synchronous copies for now is that our async UI story is completely hopeless.04:54
wgrantYou don't get a response in a reasonable amount of time.04:54
wgrantBecause a) the job probably won't run for more than a minute, and b) the client has to poll.04:54
wgrantSo you end up with crap like the apport refreshing-every-10-seconds-don't-mind-me thing.04:54
jtvWhich I want no part of.04:54
wgrantI think until we can fix both we should try to keep things synchronous.04:55
spivwgrant: skimming this conversation, it strikes me you are warning loudly about the lurking horrors, without explaining how to actually find out about them.04:56
wgrantspiv: Because there's no way to solve this yet :)04:56
spiv(But I'm only skimming, so apologies if I've missed an important bit)04:56
jtvWelcome to R'lyeh.04:56
lifelessjtv: hi, I didn't mean to cause confusion04:57
lifelessjtv: have you ate?04:57
jtvNo.04:57
jtvIt's getting urgent.04:57
lifelessjtv: so go do that04:57
lifelessjtv: This is a years old mess04:57
jtvBut wgrant keeps talking about the horrors that haunt his nightmares.04:57
spivUm, I'm not talking about a solution.  I'm just saying you're saying "must not handle delayed copies" without giving jtv any pointers on how to ensure that's the case.04:57
lifelessjtv: one meal won't make any difference.04:57
wgrantYou hadn't skipped any solution :( CopyChecker takes an allow_delayed_copies argument. If it's True it might create delayed copies, which is the wrong thing. If it's False it won't create delayed copies, so they will be copied directly which then misses the extra delayed copy functionality so is also the wrong thing.04:57
=== jtv is now known as jtv-eat
wgrantspiv: There is no solution to ensure that's the cae.04:57
wgrant+s04:57
spiv(Other than by not implementing things at all)04:57
wgrantRight.04:58
wgrantMy advice would be to not try to extend the copy mechanism until the copy mechanism is not a nightmare.04:58
wgrantIn more general terms, plan!04:58
lifelessmmm05:02
lifelessI agree that nuking tech debt makes things easier to do.05:03
lifelessThis new functionality will be doing maaasive copies we don't do at all05:03
lifelessIt may need to fix things up to move forward.05:03
lifelessnow, all that said doing double-async is gross but would work.05:04
wgrantSure. But it's currently *not possible* to implement this correctly.05:04
wgrantUnless delayed copies are nuked.05:04
lifelesswgrant: other than grossness, where am I wrong?05:04
wgrantYou would have to use delayed copies for all copies.05:04
wgrantWhich means making everything doubly-async and inconsistent.05:04
lifelesswhy?05:04
wgrantBecause only delayed copies respect overrides and announce.05:05
lifelessok, and this patch needs that ?05:05
wgrantThat's why delayed copy elimination is part of this work.05:05
wgrantBecause DDs cannot operate without overrides and announcements.05:05
lifelesshang on05:05
lifelesswe have a narrow patch up05:05
lifelessto do async if > some N05:06
lifelesshow will that *break*05:06
wgrantIt won't break, it's just the first time I've looked at this additional mess in depth.05:06
lifelessok05:06
lifelessso, if it won't break, we don't need to block jtv on this, as long as the overall arc will fix shit up.05:07
wgrantThis is Launchpad.05:07
wgrantThe overall arc will not.05:07
lifelesswell, we can talk to julian about that05:07
wgrantJulian is under the impression that the feature squad is over in just a few weeks.05:07
wgrantI don't know how accurate that is.05:07
wgrantBut it does not bode well.05:07
lifelessjulian and flacoste :)05:07
lifelesswe may need to tweak our size estimation process05:08
lifelesswe definitely need to get faster05:08
wgrantWe do.05:08
lifelessso, *personally* I would:05:08
lifeless - make it always async05:08
wgrantThat would be no problem if the UI didn't suck.05:08
wgrantBut the UI will suck.05:08
wgrantSo we should avoid it.05:08
lifelessI think you need to consider more variables in assessing this05:09
lifelessdo you agree that not all copies can be done in <1 second, and that in fact most will need > 1 second ?05:09
wgrant Sure.05:09
lifelesswell, s/most/more than 1%/05:09
lifelessok05:10
lifelessso we need the async case to exist; we need it to have a reasonable UI.05:10
wgrantLaunchpad has no facilities for reasonable async UI.05:10
wgrantWe are not ready.05:10
lifelesswe have sufficient facilities to get a tolerable UI that will be robust and amenable to optimisation.05:11
wgrantlol05:11
lifelessand we will save /significant/ complexity having one code path.05:11
wgrantBut perhaps you consider "This page will refresh every 10 seconds." to be tolerable UI.05:11
wgrantIt may be,.05:11
wgrantBut it seems pretty crap to put that on a new feature.05:11
lifelesswgrant: vs a timeout, I think its a marvelous improvement.05:12
wgrantNo, it's vs immediate feedback for small copies and frequent refreshes for large copies. And people probably don't care much about immediate feedback for large copies,.05:12
lifelesswgrant: we should refresh more often than that anyway, for a polled approach.05:12
wgrantlifeless: I was quoting from our existing async page refresher.05:12
lifelesswgrant: s/refresh/ajax-check/05:12
lifelesswgrant: so thats an argument for having two UI's.05:13
lifelesswgrant: on a purely technical basis i think that that is suboptimal and harder for us to do (I don't mean tougher, I mean 'more total effort')05:14
lifelesswgrant: you have expressed a desire for us to finish things more completely; part of that is making things cheaper to do. That means less effort output to achieve stated goals.05:14
wgrantlifeless: Once we can quickly switch to a page probably with rows for each copy and a progress indicator, sure.05:14
lifelesswgrant: all the bits are in place to do that.05:14
wgrantBut if it's a tradeoff between a little additional complexity and a completely terrible UI, we should go for that minimal extra complexity.05:15
lifelessthats not the tradeoff though05:15
wgrantWe may well be able to quickly whip up an AJAX UI for this. If so, great! We can make everything async and it will be excellent.05:16
lifelessits between having 4 code paths and 2 (sync, delayed, job-sync, job-delayed) vs (job-sync, job-delayed)05:16
wgrantBut I don't think there's time, given the huge amount of unscheduled trainwreck that's still to come.05:16
wgrantlifeless: Well, delayed copies probably don't have much life left (hi StevenK)05:17
StevenKlifeless: delayed copies are still a pox and need to die05:17
lifelessright, I agree, which is why we shold be making this as *simple* as possible to let work proceed on the bits that matter!05:17
wgrantOh, it turns out that you get more meaningful results from the PPR if you're looking at the recent one in ~lpqateam, not the ancient one in ~stub.05:22
wgrantOops.05:22
wgrantStevenK: With a new index I have the source query down to 80ms.05:28
wgrant70ms...05:29
StevenKWhoa05:31
StevenKWhat index?05:31
wgrantsourcepackagepublishinghistory(archive, distroseries, pocket, status);05:31
wgrantThat's 70ms.05:31
wgrantWithout pocket is 80ms.05:31
wgrantNeed to check how that works with a pocketless query, though.05:31
wgrantBecause i need that fast for permission checks.05:31
wgrant(it's currently >300ms per source)05:32
StevenKWe don't need a DB patch for the index?05:38
wgrantWe'll do a live one. Just working out what's best.05:39
wgrant(archive, distroseries, status, pocket) is quick for both pocketful and pocketless queries.05:39
wgrantBut I hope I can get even better.05:39
lifelessjtv: back?05:40
lifelessjtv: ah, just your irc client autoconnecting after network -fail-05:41
wgrantStevenK: Do you have a binary version of that query>?05:42
wgrantStevenK: Preferably with some common binaries.05:42
StevenKI do, but only for 'dpkg'05:46
StevenKPasted in PM05:46
wgrantThat is a bit slow cold :(05:50
StevenKTis, yes :-(05:52
StevenKIt also isn't as simple as the source query05:52
wgrantHot it's 100ms for a few common binaries.05:55
wgrantIn a single query.05:55
wgrantThe plan is the opposite of the source one, though.05:56
StevenKStrange05:57
lifelessmany more binaries than sources05:57
StevenKSure, but sometimes the query planner gets strange ideas05:58
wgrantIt always finds the BPRs first.05:58
wgrantWhereas it tries the SPPHs first.05:58
StevenKwgrant: What does the query look like for multiple binaries?05:59
wgrantStevenK: Well, I just did a binarypackagename IN (blah), so I'm not doing multiple DASes yet.06:00
StevenKAh06:00
StevenKSo, you're cheating06:00
wgrantThat doesn't change the plan, though.06:00
wgrantBecause it finds all BPRs with the right name, then indexes into BPPH on those IDs, then filters for DAS.06:01
wgrantOnly thing it will change is the volume of input to the sort.06:01
StevenKwgrant: As you say, it's interesting it picks BPR first, whereas the source query starts with SPPH.06:02
wgrantWell, the source query actually grabs both and does a hash join.06:03
wgrantIt's hard to say which is more efficient, because of the differing row counts.06:04
wgrantStevenK: Heh, I just did the ultimate source test.06:21
wgrantFinding overrides in maverick for every sourcepackagename in Ubuntu.06:21
wgrant480ms.06:21
wgrantNot too bad.06:21
wgrantBetter than the publisher's attempt at that, at least.06:21
StevenKHaha06:22
StevenK\o/06:22
StevenKwgrant: And how evil was that query?06:22
wgrantOh, I just selected all the SPNs into a temp table and used that.06:22
StevenKIf we could get the publisher to use this, it would be awesome06:22
StevenKI'm not sure it fits06:23
wgrantIt fits.06:23
wgrantMmm, but it's already only a couple of seconds.06:24
wgrantExcept for binaries.06:24
wgrantWhich are like 20s.06:24
wgrantNeed to work out why the planner does that.06:24
StevenKDoesn't it drop a bit of code duplication?06:25
StevenK(And so is a win from that perspective)06:25
wgrantYes.06:25
wgrantBut once we have the generic overrides stuff a lot gets simpler.06:25
wgrantNot just that :)06:25
wgrantIncluding two things I was going to work on this week, but have deferred until this work is complete.06:26
StevenK\o/06:26
StevenKI think I need to format the query better and write docstrings and I'm down with Existing06:27
StevenKHow to split the DISTINCT over mutiple lines, for instance06:27
jtvlifeless: back now... thanks for stepping in earlier btw06:37
wgrantlifeless: What do you think of http://bazaar.launchpad.net/~wgrant/storm/distinct-on/revision/391?06:40
lifelesshash joins are generally poor :(06:42
lifelessat least in our scale06:42
wgrantIt's fast enough here.06:42
wgrantBut yes, I would normally expect them to be bad.06:42
wgrantNot sure why it picks it, but it works.06:42
lifelesswgrant: thats lovely and minimal06:43
wgrantBut...06:43
lifelessI don't know what raw=True implies06:43
lifelessno buts06:44
wgrantOh.06:44
wgrantIt lets you pass in strings directly. Not sure if it's desirable, but it's what's used for group_by and similar things.06:44
wgrantThat was what I was going to check after you didn't reject this idea.06:44
lifelessthank you for having a low activation energy threshold06:45
wgrantGiven it's so simple it seems better than perpetuating the string hack everywhere.06:45
lifelessgod yes06:46
lifelessif I was a theist.06:46
wgrantHaha06:46
StevenKOoh, when can I use it, then?06:46
wgrantWith a bit of luck once I merge it into the LP branch in a few minutes.06:47
wgrantThen I'll write an LP branch to use it everywhere, and you can possibly merge that before it lands.06:47
StevenK\o/06:47
wgrantI guess I should file a storm bug.06:47
wgrantOh look, there's a storm bug already.06:48
lifelessthere is one06:48
wgrantBug #37477706:48
_mup_Bug #374777: DISTINCT ON queries <Storm:New> < https://launchpad.net/bugs/374777 >06:48
wgrantThat's almost half a Launchpad ago.06:48
wgrantMore than half a Launchpad ago.06:48
wgrantlifeless: If raw=True, .config(distinct=['something']) will work like .config(distinct=[SQL('something')])06:52
wgrantLike order_by/group_by do: a string is automatically treated as an SQLRaw.06:53
jtvlifeless, wgrant: was there a conclusion to the question of synchronous/asynchronous immediate/delayed package copies?06:53
wgrantjtv: Do it all async and get at least a minimally unawful UI on it later.06:53
wgrantI think that was the result.06:53
jtvWhat happened to "on no account should you..."?06:54
lifelessjtv: there were a few specific things06:54
wgrantAs long as you are aware of delayed copies and do not run this code in production before they are removed, it's OK.06:54
lifeless - what you have doesn't imply blowing up awfully; its fugly if you do delayed copied in an alyread async job, but fugly != broken.06:55
lifeless - you /will/ need async for probably a majority of your copies, even with the logic fixed, copying as a whole has a lot of work to do.06:55
wgrantlifeless: It will give inconsistent results. And inconsistency is brokenness when dealing with a primary archive.06:55
lifelesswgrant: what form of inconsistency06:56
lifelesswgrant: vs triggering the same delayed copy in the webapp06:56
wgrantlifeless: Delayed copies and direct copies perform difference overrides, copy different set of binaries, announce differently.'06:56
wgrants/difference/different/06:56
lifelesswgrant: I want to separate the issues in *this patch* vs those in the existing code06:56
wgrantOK.06:57
wgrantSure.06:57
lifelesswgrant: the issues in the existing code are a topic for julian and work scheduling; the issues in or introduced by this patch are a topic for jtv & code review07:00
jtvExactly.07:00
lifelesswgrant: so, are there any actual correctness, (vs fugliness) issues in this patch ?07:00
lifelesswgrant: my understanding is that there are not07:00
jtvlifeless: thank you07:00
wgrantApart from building further on a shaky foundation without stabilisation scheduled, no, it's fine.07:01
lifelesswgrant: (pending a detailed code review for thinkos etc)07:01
lifelessok07:01
lifelessso back to the things I think we concluded07:01
lifeless - because async will be needed for most copy operations, the async UI will need a bunch of work07:01
lifelessNow, *I* have a recommendation that you (jtv) just do async and put time into making the experience nice07:02
lifelessbecause that benefits all cases.07:02
lifelessIts only a recommendation07:02
jtvBy the way, what exactly does "the async UI" mean?  AIUI there don't need to be separate UIs for sync and async _requests_, but it'd be nice to have some _visibility_ into pending async requests.07:02
lifelessbut I think it would save a bunch of duplicate code.07:02
lifelessjtv: minimally a spinner while the copy happens.07:03
lifelessPerhaps a progress bar showing x/Y completed.07:03
lifelessthe details are a topic for you/julian/jml/sinzui/huwshimi :)07:03
jtvSome interesting design questions in those details; generally you'll probably have just one or two jobs for the whole thing.07:04
jtvAlso makes it hard to see which requests are underway.07:04
wgrantHmm, so there's a single job for all 10000 copies?07:04
lifelessFinally, the underlying mechanics of copies badly badly need rectification to be more robust and sane, given the level of current pitfalls07:04
jtvCould be, yes.  That's the way those jobs work.07:04
wgrantOK.07:04
jtvI fully buy into the notion that soyuz needs a firm broom.07:05
lifelessnow, where to go from here. I think you should discuss with julian - and I'm delighted to participate - about whether its worth having a sync+async api.07:05
lifelesss/api/ui/07:05
jtvIn fact just a very simple change with basically no UI implications almost hit the 800-line point because of the simple cleanups needed.07:05
lifelessbut I'm totally serious when I say that the threshold to avoid timeouts is about 0.07:05
jtvThat brings me to something that came up earlier.07:06
jtvSomebody mentioned that _checking_ the copies took up most of the time..?07:06
jtvBecause the permissions check at least (part of the checking work) happens synchronously either way.07:06
wgrantApart from one case (closing bugs when copying to -updates or -security), the actual copy is very fast.07:06
lifelessthe soyuz datamodel is not enforced (nor can it be -today-) by DRI07:06
lifelessthe mechanics of adding the new rows is fast07:07
wgrantjtv: Permission checking we can do in a few hundred milliseconds for the whole archive.07:07
wgrantjtv: Does it do the full check?07:07
jtvJust the permissions check.07:07
lifelessjtv: also async ui - error reporting is a component too07:07
wgrantjtv: (at the moment it will be ~400ms per source, but with StevenK's work and some refactoring I have planned for after that, it becomes 600ms for the whole archive)07:07
jtvwgrant: that's for the full copy including checks?07:08
wgrantjtv: Just permission checking, sorry.07:08
wgrantAt the moment doing permission checks for more than a few packages at a time is infeasible.07:08
jtvAh, so that's relatively costly and I can't even avoid it in the async case.07:08
lifelessper package you're doing ?07:08
jtvYes.07:09
lifelesssorry, that was to wgrant07:09
lifelessis that 600/400ms 'for all the packages in a copy' or 'per'07:09
wgrantjtv: I thought we were just checking for any permission on the relevant archive, and leaving the details to syncpackagejob.07:09
jtvlifeless: AIUI 400ms is per package.07:09
wgrantlifeless: 400ms is per source. 600ms is for every source in one query.07:09
wgrantFor a reasonable selection of sources is more like 100ms.07:10
lifelesswgrant: so 600ms is 'copy all sources from archive a to b and make sure you have perms to do that' ?07:10
wgrantlifeless: Just permission checking.07:10
jtvwgrant: from what I can see, the PackageCopyJob (or CopyPackageJob, I forget) does do_copy without a permissions check.  Which makes sense semantically: why let people create jobs to sync packages they're not allowed to?07:10
lifelesswgrant: yes, I phrased it badly07:10
wgrantjtv: Well, do_copy only gained permission checking yesterday.07:10
wgrantjtv: So it's unsurprising that CopyPackageCopyJobCopyPackage doesn't use it. But it could.07:10
jtvwgrant: and when you say the 600ms is for "the" archive, you mean the destination archive, right?  I'm asking since AIUI there can be multiple source archives in the same request and they may also be involved.07:11
wgrantjtv: But I saw an "any permission on the archive at all" check in the view07:11
jtvwgrant: did you get my question about that weird check earlier?07:11
wgrantWhich weird check?07:11
lifelessgrah, my graphs, my pretty pretty graphs are bust in daily chrom07:11
lifelessbut I need daily chromium for speedtool thingy07:12
wgrantjtv: The expensive bit of permission checking is determining the destination component of each package.07:12
lifeless*fuckers*07:12
wgrantlifeless: :(07:12
jtvwgrant: the check for "if there is a reason to reject this, check again for Append permission and if the user has it, don't raise an error"07:12
wgrantjtv: You mean the thing I reverted last night?07:12
jtvwgrant: I guess--but that is exactly what I've been asking for the past hours.  :)07:12
jtvI guess my damn connection trouble has been stopping that from getting through.  :( :( :(07:13
wgrantI don't see how it's related.07:13
wgrantThe launchpad.Append special case is now restricted to the Archive.syncSource(s) API methods.07:13
wgrantNowhere near do_copy any more.07:13
jtvI was going to explain how it was related, but I needed to start somewhere.07:13
jtv(I wonder if my power problems are affecting my connections--UPS is beeping many times a minute)07:14
wgrantHmm, that's not ideal.07:14
jtvAnyway:07:14
jtvI extracted the permissions check, because I needed to but also because it made the code a bit easier to work with.07:14
wgrantYou extracted it from CopyChecker?07:15
jtvYes.07:15
wgrantTo where?07:15
jtvTo a function right above it.07:15
wgrantie. not a method?07:16
jtvNo, but it can be if you want it to.07:16
jtvAh no it can't07:16
wgrantNo, no, just getting a better picture.07:16
wgrantDon't worry, my background is not Java :)07:16
jtvThe problem was that the async case shouldn't be doing the full checks (right?) because it sort of defeats the purpose.07:16
wgrantRight.07:16
jtvPhew.  :)07:16
jtvBut I needed the permissions check because of how the jobs worked (and how the jobs worked seemed reasonable to me, apart from potential performance concerns)07:17
jtvSo I needed it out of the CopyChecker, into a reusable function.07:17
jtv(Which by the way would also be unit-testable, hint hint :)07:17
wgrantCopyChecker isn't tooooo badly tested.07:18
jtvIt's not that07:18
wgrantI think we may want to keep it on CopyChecker, in a partial check mode, but I guess either works.07:18
wgrantDepends on if we might want other pre-creation checks.07:18
jtvIt's that it's better to have a "check permissions" method with its own unit tests, than to have unit tests on the surrounding method that exercises the crooks and nannies of the permissions-checking part.07:19
jtvNooks and crannies, I mean.07:19
StevenKCriminals and grandmothers?07:19
StevenK:-)07:19
jtvThank you.07:19
lifelessbankers and politicians?07:19
wgrantjtv: Sure.07:19
jtvGo wash your mouth.07:19
wgrantjtv: So that takes a list of sources?07:19
jtvwgrant: I believe it's currently one per SPN, but not sure.07:20
* jtv checks07:20
jtvYes, currently one call per.07:21
wgrantIt makes no difference at the moment, but we'll need it to take a set of SPNs/SPPHs if we want it to not take forever eventually.07:21
jtvBut that's easily fixed.07:21
wgrantOK.07:21
wgrantWhat are the arguments it takes?07:21
jtvYes, sounds like a solid plan.  It's a small loop anyway, shouldn't be hard.07:21
lifelessjtv: oh btw07:21
lifelesshave you seen load_related?07:21
lifelessjtv: it would make one of your helper functions smaller07:22
jtvwgrant: person, destination archive/pocket/..., and spn.  But again, it's not set in stone.07:22
jtvlifeless: yes, I've seen it thanks.07:22
jtvI'm looking forward to applying it.07:22
wgrantjtv: The emerging pattern is that all underlying functions/methods like this will take something like (archive, distroseries, pocket, (spns))07:23
wgrantjtv: So it deals with SPNs directly, not SPRs or SPPHs?07:23
jtvwgrant: then that's a very nice fit indeed.07:23
lifelesshttp://www.zdnet.com.au/telstra-scores-patent-win-over-amazon-339314845.htm07:23
jtvwgrant: right, it seemed cleaner to do it that way.07:23
jtvEliminated some unneeded stuff.07:23
jtv(spph, spr)07:24
wgrantjtv: Great, because that's also the emerging pattern, although it goes against everything we've done for years.07:24
jtvIt does?07:24
wgrantSets of names works well for most stuff.07:24
wgrantBut traditional we've passed around single SPRs or SPPHs instead.07:24
wgrant+ly07:24
wgrantjtv: The idea is that the copier and uploader will both share most of these functions, which will be set-of-name based and very fast.07:25
wgrantSo we can delete tonnes of code and it will all be much faster too.07:25
jtvGreat, great.07:25
jtvThat shouldn't differ between the sync & async cases anyway.07:25
wgrantYeah.07:25
wgrantjtv: For now I guess your function will just loop over the SPNs.07:26
jtv(I don't usually get upset about this distinction: easier to see where it's a problem and fix it without social upheaval :)07:26
wgrantUntil we have a verifyUpload that takes a set of names.07:26
wgrantRight?07:26
jtvSure, I could make it take a list-of-SPN right away.07:26
jtv(set-of-names would be particularly nice for easy testing... I had to write some fakes to get acceptable speed on my tests)07:27
wgrantYeah.07:27
wgrantIt also works well with lifeless grand plan.07:27
wgrant'07:27
jtvGiven all this, will there still ever be a case where we want to work synchronously in the web request?07:28
wgrantIf we can get a basic UI scheduled soonish, I don't see why it would ever be required.07:29
wgrantThat will fix +copy-packages, too.07:29
jtvThen maybe the sanest thing for me to do right now would be to get to work on that UI, and later we can rip the synchronous code out of my current branch.07:29
jtv(And by "get to work" I mean "start worrying about what the UI should actually do")07:30
wgrantI think get your branch fairly sensible now, and discuss the UI and delayed copy murder implementation and scheduling with Julian tonight?07:30
wgrantNot much consideration has been given to any of this, but it's not *that* much work.07:30
StevenKwgrant: The delayed copy murder implementation is already known.07:31
wgrantStevenK: I know you know it.07:31
wgrantI don't know that Julian knows all about it.07:31
wgrantDoes he?07:31
StevenKIndeed he does07:31
wgrantExcellent.07:31
jtvAnd for me, who is struggling to understand the directly relevant parts, it's an undesirable side track.07:31
StevenKWe spoke about it at length and he agrees07:31
StevenKwgrant: And you know the plan, so I don't need to re-iterate.07:31
wgrantYup.07:32
jtvSo... what's needed to get my branch fairly sensible now?07:32
wgrantIt taking a bit of an unfortunate side-track with the overrides generalisation, but that should be better in the long run.07:32
wgrantjtv: Well, given that we can't use this in production yet anyway, just make it always async if that's quick?07:32
jtvQuickest & most flexible way to do that is to tweak the policy choice.07:33
NCommanderwgrant: on writing soyuz tests, should I have it use breezy-autotest as the series? (if so, how do I add a new architecture?)07:33
StevenKNCommander: Do not use sampledata if you can at all help it07:33
wgrantNCommander: You would ideally create a new series using LaunchpadObjectFactory... but if you're using SoyuzTestPublisher then breezy-autotest is a good option.07:33
StevenKSTP can be taught to respect a new series07:33
StevenKIt just involves 20 lines of vomit07:34
NCommanderwgrant: I was planning on recycling STP instead of writing an entire new test_.py file07:34
wgrantNCommander: Ideally try to use LaunchpadObjectFactory for everything, though. Can you outline the specifics of the test?07:34
StevenKNCommander: Don't recycle STP, either07:34
NCommanderwgrant: I need a series with two architectures. Upload source package that has an arch all and an arch any bit which has a ${binary:Version} relationship on the Depends. Upload binaries for both architectures. Upload a 1.0-2, only upload arch all, and i386 bits. Test should attempt to see if the arch all packages from 1.0-1 are still published07:35
StevenKNCommander: distroseries = self.factory.makeDistroSeries()07:35
StevenKdas1 = self.factory.makeDistroArchSeries(distroseries=distroseries)07:36
StevenKdas2 = self.factory.makeDistroArchSeries(distroseries=distroseries)07:36
StevenKdistroseries.nominatedarchindep = das107:36
wgrantIndeed, I suspect the factory will be better for this.07:36
jtvwgrant: of course one misgiving about async is we have no reporting mechanism (definitely not in the UI; don't know what support there is in the data model)07:36
wgrantNCommander: You can then use makeBinaryPackageBuild() to create a build, and makeBinaryPackageRelease(build=yourbuild) to create the binaries. Then publish them with makeBinaryPackagePublishingHistory.07:37
NCommanderwgrant: the existing test_publishing.py uses SoyuzTestFactory, do I need to write a new test py?07:37
wgrantjtv: Right, that's my sole misgiving, and the reason I like synchronous for now.07:37
StevenKNCommander: Have a look at lib/lp/soyuz/tests/test_initialisedistroseriesjob.py, sub _create_child07:38
wgrantNCommander: It probably doesn't belong in test_publishing. But the location doesn't really matter for now.07:38
StevenKNCommander: That creates a new series and sets STP up to use it07:38
wgrantNCommander: Just write a new test class with a single test case.07:38
wgrantThen we can move that to wherever.07:38
NCommanderStevenK: holy crap, my eyes, they bleed!07:38
jtvwgrant: so I was thinking the numeric threshold ain't so bad: we can tweak it to be ridiculously high (always synchronous) or ridiculously low (always asynchronous) and maintain our freedom of choice while we may possibly still want it.07:39
NCommander(thanks)07:39
StevenKNCommander: Frankly, that test is one of the better ones07:39
wgrantjtv: I guess. But once we have at least a basic async status reporting UI (hopefully very soon!) we can destroy sync.07:39
NCommanderStevenK: no, just Soyuz's API in general07:39
StevenKNCommander: Most of that test is using LaunchpadObjectFactory07:40
StevenKSo, uh, no.07:40
* NCommander eats shoe07:40
NCommanderk07:40
StevenKs/test/function/07:40
jtvwgrant: absolutely.  Given though that it's the -- what comes below known-good?07:40
jtvwgrant: Given though that it's the devil we know, and that we have code that accommodates it, keeping that as an option seems an easy choice.07:41
jtvFor now.07:41
StevenKNCommander: Hold on, I found a better example.07:42
jtvwgrant: I guess the ideal migration path would be: go async only for cases that currently don't work at all, then implement async UI, then drop sync.07:42
StevenKNCommander: It sets up two DASes and then the STP. lib/lp/soyuz/tests/test_build_set.py , function setUp()07:42
wgrantjtv: That's the path that I originally intended. But lifeless says to drop sync then implement async UI.07:43
wgrantWhich is the best solution, if the UI is coming before the feature finishes.07:43
jtvwgrant: Also sensible, but at the moment, "drop sync" is work and would merely delay the UI work.  So I'd say: let's get this branch reviewed, and start defining the UI.07:44
wgrant+107:44
NCommanderStevenK: looks straightforward enough07:44
StevenKNCommander: Yes, it's an awesome amount of boilerplate07:44
jtvThanks wgrant!  Maybe lifeless can help me figure out the UI reqs.07:45
jtvUh-oh.07:47
jtvwgrant: I don't suppose a do_copy that fails for whatever reason _beyond_ CannotCopy leaves any kind of paper trail?07:48
wgrantjtv: In the DB?07:48
wgrantNo.07:48
jtvThat is sad news, because neither does the job type.07:48
wgrantHmm, that sounds suboptimal.07:49
wgrantWe may need to fix that.07:49
lifeless'may' :>07:49
jtvSo the only way I see to report failure or indeed progress is to look for jobs that would apply to a given package (there may be several, and finding them is nontrivial) and inspect their status.07:49
wgrantjtv: So, I'd imagined that there would be a job for each package, so they'd be somewhat queryable.07:50
wgrantFor the UI case, it can remember the job ID, perhaps?07:50
jtvEh eh eh such dreams07:50
jtvI suppose Ajax-y UI could remember job IDs, yes.07:50
jtv(AIUI there may be multiple jobs, for copies from different source archives)07:50
wgrantAh, those are separate jobs?07:51
jtvYes.07:52
wgrantI thought the UI would just get a job ID back for each source, and then request the status for all those IDs regularly.07:52
wgrantHard to do progress or failure counts if it's all one or two jobs :(07:52
wgrantHard to do failure info, too.07:52
jtvProgress is in some ways the easier one.07:53
jtvThe jobs should benefit, speed-wise, from doing multiple packages in one go I guess.  Progress we can measure by how many jobs there are ahead of us in the queue.07:53
wgrantThey will benefit significantly, yes.07:56
wgrantBut it seems like that's more of something for the job runner to do.07:57
wgrantGrab jobs that can be done together, and do them together.07:57
NCommandersetUp(self) is called by the test harnass automatically, correct?07:58
jtvwgrant: tempting discussion, but rabbit hole.  :)07:59
StevenKNCommander: Yes07:59
jtvwgrant: Fairness, starvation, pathological cases, db cost vs. actual job work...  what we have now ain't so bad I guess.  :)08:00
jmllifeless: hi08:01
jmllifeless: want to /join #ubuntu -uds-mikszath?08:01
wgrantjtv: Yeah, but UI will be interesting, and just returning failure info at all :/08:02
lifelessjml: coming08:04
jmllifeless: thanks.08:04
jelmerwallyworld: hi :)08:05
jelmerwallyworld: I think you still have my badge :)08:06
wallyworldjelmer: hello08:06
wallyworldjelmer: oh yeah. where are you now?08:06
wgrantDown to exactly three pages of criticals!08:08
jtvStevenK: maybe you would like to review, or at least comment on, my sync/async branch?  Yes, it needs more.  But I believe it's a step forward.08:08
jtvwgrant: ctrl-+08:08
StevenKjtv: Do I have to? I'd like to finish this policy before EOD08:08
jtvStevenK: no, just asking if you'd like to.08:08
StevenKjtv: Then I'll respectly decline08:09
jtvNo worries.08:09
jelmer_wallyworld, I'm in the bug triaging session, mikszath08:09
jelmer_wallyworld, there's no hurry, I can find you afterwards. I was just worried you would fly back to Brisbane with it. :)08:09
wallyworldjelmer: np. i'll find you08:09
=== jelmer_ is now known as jelmer
wgrantlifeless: http://webnumbr.com/launchpad-critical-bugs and http://webnumbr.com/launchpad-oops-bugs need restarting. Looks like they failed like a month ago.08:14
wgrantlifeless: https://lp-oops.canonical.com/oops.py/?oopsid=OOPS-1956CH11208:22
wgrantCopy checked and source copied in 300ms, then it goes and spends the next 9 seconds dealing with strucsubs :(08:23
StevenKOh, bleh08:23
wgrantStevenK: ?08:26
StevenKwgrant: Your last comment08:27
wgrantOh, right.08:27
wgrantOnly eight bugs. Hm.08:30
wgrantSix, in fact. One is referenced three times...08:30
adeuringgood morning08:37
jtvhi adeuring08:40
adeuringhi jtv!08:40
wgrantlifeless: BugMessageSet.createMessage currently calculates the index by counting the number of messages... any reason we can't take the max index and add one?08:43
lifeless+108:43
wgrantIt's much faster.08:43
wgrantThe existing one can take tens of ms :/08:43
lifelesssorry, in 'redo lp bugs entirely for ubuntu'08:43
wgrantOh *awesome*.08:44
wgrantInterestingly it's actually slightly faster still to ORDER BY index DESC and take the index of the first row.08:48
wgrantChromium, why are you using 4GiB of RAM?08:55
StevenKHah08:56
lifelesswgrant: also bug 42467108:58
_mup_Bug #424671: attachments: accessing attachment's message is very slow <api> <lp-foundations> <performance> <Launchpad itself:Triaged by leonardr> < https://launchpad.net/bugs/424671 >08:58
lifelesswgrant: the numbrs are broken09:00
lifelessspiv: do you have working webnumbr voodoo for lp bug searches?09:00
spivlifeless: http://webnumbr.com/profile?name=https%3A%2F%2Flaunchpad.net%2F~spiv is what I've got09:00
lifelesswgrant: its xpat - substring-after(//div[@id='maincontent']/div/div[2]/div/div/div/div[1]/table//tr/td[1], 'of')09:00
lifelesssubstring-after(//div[@id='maincontent']/div/div[3]/div/div[1]/div/div[1]/table//tr/td[1], 'of')09:01
lifelessso, 2->309:01
lifelessno, deeper09:01
lifelesscopying09:01
bigjoolsmorning09:04
jtvmoaning bigjools!09:04
lifelesswgrant: http://webnumbr.com/.join(launchpad-oops-bugs.all,launchpad-timeout-bugs.all,launchpad-critical-bugs.all)09:05
lifelessok, I fail at search09:06
lifelessI'm trying to find the (long) analysis I wrote about our bug task UI/model09:06
lifelesscake credits to anyone that finds it09:06
mrevellHello!09:08
bigjoolswassup jtv09:09
jtvbigjools: where do I start :)09:09
jtvHi mrevell09:09
jtvbigjools: currently trying to figure out what UI is needed (and reasonably implementable) for async package copying.09:10
LPCIBotProject devel build #709: FAILURE in 5 hr 33 min: https://lpci.wedontsleep.org/job/devel/709/09:10
StevenKHmph09:11
bigjoolsjtv: ah yes we need to talk about that09:11
lifelesswgrant: it used the count because the indices hadn't been populated09:11
StevenKlifeless: ^ Rabbit fail09:11
bigjoolsjtv: I previously chatted to allenap about the relevant page polling for copy jobs09:11
jtvAh, that ties right in09:11
bigjoolsjtv: then the notifications can work mostly as they do now, just asynchronously09:12
bigjoolsbut we need the addition of a "job in progress" one09:12
lifelessStevenK: win ip-172-56-124-252: nxdomain09:13
jtvbigjools: my mental image of this atm involves JS on the page knowing what job ids it has in progress, and seeing where the last of those is in the queue.09:13
bigjoolsjtv: well it can poll for all copy jobs for that series, there may be more than one09:14
bigjoolsbut yes09:14
jtvYes, but probably not many.09:14
jtvOne per source archive, basically.09:14
StevenKlifeless: If rabbit is attempting to look up it's local hostname, then that's just stupid09:14
bigjoolsjtv: well it depends how many archive admins are using it at once09:14
lifelessStevenK: rabbit attempts to look up its local hostname09:14
jtvStevenK: I believe that's what broke shutdown on maverick.09:14
lifelessStevenK: thats what made maverick fail to shutdown, because not-manager went away too fast09:14
jtvlifeless, StevenK: fwiw my filesystem hasn't corrupted itself once since I upgraded to natty!09:15
lifelessjtv: congrats09:15
lifeless!09:15
=== almaisan-away is now known as al-maisan
jtvbigjools: there's another thing... it's hard to find other jobs that may be pending for the same copies.  I'm hoping repeated copies will be no-ops.09:15
bigjoolsjtv: yes, the copy checker will fail the second one09:16
StevenKlifeless: So that's why it fails to start? Er, can we not have it do that.09:16
bigjoolsso not a no-op09:16
jtvbigjools: fail it?  That seems a bit harsh, esp. if it's perfectly reasonable for multiple admins to request the same copy concurrently.09:16
wgrantlifeless: That's remarkably constant progress we've made over the last month!09:16
lifelesswgrant: it is!09:17
lifelessStevenK: I don't know. patches appreciated, or perhaps put localhost first in the hosts file?09:17
bigjoolsjtv: well possibly in the future, but right now it'll fail09:17
jtvWhich won't do much except generate an oops, I guess, after which a maintenance squad will pick it up very quickly.09:17
StevenKubuntu@ip-172-56-124-250:~$ cat /etc/hosts09:18
StevenK127.0.0.1 localhost09:18
StevenKlifeless: ^09:18
jtvbigjools: right now my main concern is that it be fast, regardless of whether it ends in front of the restaurant or partway through its outside wall.  :)09:18
jtvCar analogy ^09:18
bigjoolsjtv: it'll be fast!09:18
StevenKlifeless: (There's more, but ... :-)09:18
jtvbigjools: then sod the brakes :)09:19
bigjoolsjtv: no oops, just a failed job, which we need to show on the page09:19
lifelessStevenK: ><09:19
StevenKlifeless: Hm?09:21
lifelessStevenK: I'm unhappy that this -long- overdue patch has broken jenkins09:21
StevenKlifeless: I can run hostname localhost on builder bring-up, but ew09:22
=== danilos changed the topic of #launchpad-dev to: https://dev.launchpad.net/ | On call reviewer: jtv, danilos | https://code.launchpad.net/launchpad-project/+activereviews
jtvhi danilos09:25
danilosjtv, hi :)09:25
danilosjtv, and the answer is "no"09:25
jtvdamn, beat me to it!09:25
jtvThe other OCR sure ain't gonna do it09:25
danilosjtv, sure thing, send it my way09:25
jtv:)09:26
danilos780319?09:26
jtvdanilos: thanks... it's largish: https://code.launchpad.net/~jtv/launchpad/bug-780319/+merge/6057109:26
jtvYup09:26
wgrantbigjools: Is DF's appserver meant to be not running?09:26
jtvAgain!?09:26
bigjoolswgrant: last I checked it was ok09:27
* bigjools looks at log09:27
* bigjools fixes09:27
bigjoolsnohup: cannot run command `bin/run': No such file or directory09:28
bigjoolsawsum :)09:28
wgrantHandy.09:28
bigjoolsgrar, how do I stop this PoS mumble from starting the config wizard every time I start it09:28
stubjtv: Is the only usage of multitablecopy copying translations into a newly opened distro?09:29
jtvstub: afaics yes09:29
jtv(did a quick grep)09:29
stubjtv: I guess we can always recover from that job if things explode - we have done it a few times already.09:30
jtvAnd actually it's no longer even copying the translations themselves.09:30
jtvAt the time it was a huge enough problem that the overhead of making this big a generic module wasn't a big deal.  But I guess it hasn't been a smash success.09:31
jtvotp09:31
StevenKlifeless: So starting rabbit gives: Crash dump was written to: erl_crash.dump09:32
NCommanderGrumble, I'm getting a ComponentLookupError when I try to do         self.admin = getUtility(IPersonSet).getByEmail(ADMIN_EMAIL)09:36
wgrantNCommander: Does your test class have a layer set?09:40
wgrantNCommander: Try LaunchpadFunctionalLayer.09:40
danilosjtv, fwiw, you do already have conflicts :)09:47
jtvagain!?09:47
jtvdanilos: otp now, will fix soonest09:47
danilosjtv, oh, perhaps they are just in the email09:47
daniloscan't see them on the MP, all good then09:47
jtvPhew!09:47
StevenKlifeless: So help to fix rabbit would be awesome, but I personally am *utterly* unimpressed with it.09:54
NCommanderwgrant: ah, didn't know that was used by anything09:55
NCommanderwgrant: now I've gotten librarian traceback errors. Obviously something is unhappy with my testing setup09:58
adeuringstub, lifeless: could you please have a look at my mp: https://code.launchpad.net/~adeuring/launchpad/bug-739075/+merge/60516 ?09:58
wgrantNCommander: Which layer did you use?09:59
wgrantAnd what's the traceback?09:59
lifelessjml: https://bugs.launchpad.net/launchpad/+bug/655385/comments/1410:07
_mup_Bug #655385: Allow bug status change from Triaged only for bug supervisor <accesscontrol> <acl> <bugs> <lp-bugs> <Launchpad itself:Opinion> < https://launchpad.net/bugs/655385 >10:07
lifelessjml: is the analysis I was looking for10:08
lifelessjml: I segue from the bug itself quite sharply10:08
jmllifeless: right, thanks.10:09
lifelessjml: I've mailed you and skaet10:12
lifelessshould I have cc'd ali/10:12
lifeless?10:12
jmllifeless: probably ok for just skaet & I atm. Have linked it from IssueTracker as well.10:13
lifelesscool10:13
lifelessjml: do you need me for anything? I might go remind my self what my wife looks like...10:13
jmllifeless: no, I think we're good.10:13
jmllifeless: thanks for staying around10:13
lifelesskk, my pleasure10:14
danilosjtv, r=me with some minor comments; general impression is that it's mostly refactorings, and that's even easier to review as two separate branches :)10:16
danilosoh well10:17
LPCIBotProject windmill-db-devel build #263: STILL FAILING in 1 hr 7 min: https://lpci.wedontsleep.org/job/windmill-db-devel/263/10:18
danilos<-- jtv has quit (Read error: Connection reset by peer)10:20
danilos<danilos> jtv, r=me with some minor comments; general impression is that it's mostly refactorings, and that's even easier to review as two separate branches :)10:20
stubadeuring: reviewed10:43
adeuringstub: thanks!10:43
stubwas on phone10:43
stubjtv: https://code.launchpad.net/~stub/launchpad/bug-179821-lowercase-tablenames/+merge/60511 should be easy. https://code.launchpad.net/~stub/launchpad/bug-778338-transient-schema/+merge/60512 is a further uglification of your code.10:52
jtvstub: are you asking for reviews?10:52
stubjtv: If you want to. Otherwise I can grab an ocr.10:52
jtvstub: check again.10:53
stuboic. Yes, you can review it then :)10:53
stubI was just giving you first right of refusal since this was originally your work.10:53
stubThe second one went ugly, as "foo.bar" is a table in the public schema, unlike "foo"."bar"10:54
stubEither that, or refactor most of canonical.database.postgresql10:56
jtvstub: as far as the first one is concerned, there's a quandary: we're probably supposed to quote variable table names, which is exactly what leads to the case sensitivity.  If only there were a way to escape, but not quote them!10:56
stubIndeed. I think at one stage I had an assert to ensure the name didn't need to be quoted. Think I lost that somewhere.10:57
jtvstub: I'm not sure it's worth migrating existing tables...  with single-master and just a few production-like environments, wouldn't it be easier to check for any existing copying tables?10:57
stubOh... we are still quoting table names. I'm just forcing them to lowercase.10:57
jtvYes.10:58
jtvWhich should work fine, as long as you don't run anything in a Turkish locale.10:58
stubjtv: I don't want the rollout aborted because there was a job running at the time.10:58
jtvIt's a manual job, and the one for Oneiric has already been run.10:58
stubok. so if we promise not to run another one in the near future, I can land this on launchpad/devel then.10:59
stubAlthough there is little point landing this code until before the next time one of these jobs is run... so... whatever :)10:59
wgrantstub: The less we have in db-devel the better.11:01
stubjtv: I think lower() is fine and we can assume nobody is going to stick Turkish or worse in here. I think it is either lower(), or generate the tablename using punycode or sha1 hash.11:04
jtvstub: sure, I was just being flippant.11:05
stubIts a valid concern. At the moment, no callsites of this code will get non-ascii user input.11:05
jtv(And since I'm still feeling a _little bit_ flippant, let me point out that "I".lower() != "i" in Turkish.  :)11:05
stubI think myself and all the losas are all native english speakers so that is fine :)11:06
jtvI think it's fine to have strong requirements for this.  I've forgotten most of the details but maybe you could simply require lower-case strings and fail if that requirement is not met?11:06
stubsure. I'll have callsites to modify then though? Many?11:07
NCommanderwg  /win 2411:07
NCommanderbah11:07
NCommanderwgrant: http://paste.ubuntu.com/606078/11:07
stubThe multitable tests are all lowercase11:08
wgrantNCommander: You're not using LP_PERSISTENT_TEST_SERVICES?11:08
wgrant(that's an environment variable... it should be unset these days)11:09
NCommanderwgrant: its not set11:10
wgrant:(11:11
wgrantNo pids floating around in /var/tmp?11:11
NCommanderwgrant: no love11:12
jtvstub: sorry, food arrived...  no, I don't think there'll be many callsites.11:13
wgrantNCommander: Can you start a dev instance OK?11:14
NCommanderwgrant: works fine.11:14
NCommandercorrection11:15
NCommanderI'm OOPSIng11:15
stubI suspect the Librarian won't be starting.11:15
NCommandernow the question is why isn't it11:15
=== jtv changed the topic of #launchpad-dev to: https://dev.launchpad.net/ | On call reviewer: danilos | https://code.launchpad.net/launchpad-project/+activereviews
stubNCommander: Got a librarian log file in logs directory?11:16
NCommanderyeah, looks like librarian doesn't want to start, but I can't figure out why11:16
stubMight have a juicy traceback for you11:16
NCommanderwhere do I find that?11:16
stubI think logs directory, top of the lp tree.11:17
wgrantOtherwise there could be something interesting in /var/tmp11:17
NCommanderdon't have any librarian logs11:17
stubTry bin/start_librarian11:18
NCommanderbah, I'm going to reboot11:21
wgrantbigjools: You (or you squad) have a lucid_db_lp failure11:25
wgrant(<DistroSeries u'distroseries344950'>, 'getDifferencesTo', 'launchpad.Edit')11:25
NCommanderOk, I rebooted11:26
NCommanderlaunchpad.dev works, my test still breaks (Connection refused is the error now)11:26
wgrantThat's more encouraging.11:27
NCommanderwgrant: http://paste.ubuntu.com/606086/11:27
wgrantCan you try attaching adding a bug attachment on launchpad.dev, just to test that it's really working?11:27
NCommandercan't login11:28
NCommandergrumble11:28
wgrantYour /etc/hosts might be old.11:29
wgrantDoes testopenid.dev resolve?11:29
NCommander2011-05-11 03:25:07-0700 [-] twisted.web.server.Site starting on 5808511:29
NCommander2011-05-11 03:25:07-0700 [-] Starting factory <twisted.web.server.Site instance at 0x383c3b0>11:29
NCommander2011-05-11 03:25:07-0700 [-] Not using upstream librarian11:30
NCommander2011-05-11 03:25:07-0700 [-] daemon ready!11:30
NCommanderwgrant: yes, it sresolves11:30
NCommanderI can' tlogin cause it oops'ed11:30
NCommander 3745 pts/1    Sl+    0:09 /usr/bin/python2.6 -S /home/mcasadevall/launchpad/lp-branches/arch-indep-skew-fix/bin/twistd --no_save --nodaemon --python /home/mcasadevall/launchpad/lp-branches/arch-indep-skew-fix/daemons/librarian.tac --pidfile /var/tmp/development-librarian.pid --prefix Librarian --logfile librarian.log11:30
NCommanderI've got librarian running, nothing interesting in the log11:30
wgrantWhat was the OOPS?11:30
NCommanderOOPS-1957X711:31
wgrantThat refers to /var/tmp/lperr/2011-05-11/*X7, so it's not very helpful for me :(11:31
NCommanderhttp://paste.ubuntu.com/606088/11:32
NCommanderwgrant: ^11:34
wgrantWhat.11:34
NCommanderwgrant: that's what that file has11:34
wgrantDo you have a broken proxy set or something?11:34
NCommanderdon't think so, this was workign fine ...11:34
wgrantOr a broken apache or something.11:34
NCommandergrumble11:34
=== al-maisan is now known as almaisan-away
wgrantNCommander: AFAICT that should be grabbing a page from blog.launchpad.net.11:35
* NCommander make stop/make clean/make run's11:35
jtvlifeless: it seems great minds think alike.11:41
=== henninge is now known as henninge-lunch
NCommanderthis is really irritating me :-/11:43
* NCommander probably should throw LP into a VM and save myself some frustation11:43
=== mrevell is now known as mrevell-lunch
LPCIBotProject windmill-db-devel build #264: STILL FAILING in 1 hr 8 min: https://lpci.wedontsleep.org/job/windmill-db-devel/264/12:49
=== henninge-lunch is now known as henninge
gary_posterhi jml.  When you get a chance (no rush), I'd like your review of my non-high triaging of bug 780568.  All the other new high/critical bugs I agree need to be addressed before we move on.13:19
_mup_Bug #780568: bug structural subscription auto tag complete <story-better-bug-notification> <Launchpad itself:Triaged> < https://launchpad.net/bugs/780568 >13:19
jmlgary_poster: yeah. that's fair enough.13:20
gary_postercoolcool thanks13:20
=== mrevell-lunch is now known as mrevell
jmlhow do I demo the unsubscribe-in-anger feature?13:40
jmlall I need is a screenshot, actually13:40
deryckMorning, all.13:50
danilosjml, click on "Edit bug mail" link on any bug page13:54
bigjoolswgrant:  can you remember if someone fixed a conflict on db-devel just before buildbot whinged?13:54
danilosjml, (that page is going to be linked from all emails, but it was a mess to make the link conditional in the email template so we left it for when we go fully public)13:54
wgrantbigjools: There was no conflict.13:54
bigjoolshmm13:55
bigjoolswgrant: it's rvb's API change, not quite sure why it put it in EditRestricted.... and how it passed ec213:57
wgrantbigjools: It's not related to the deriveDistroSeries permission change?13:58
wgrantIn devel?13:58
wgrantThe API changes landed days ago.13:59
bigjoolsdb-devel13:59
wgrantIn db-devel, yes.13:59
wgrantThen deriveDistroSeries permission changes landed yesterday in devel.13:59
bigjoolswhy would my change affect that?  I only moved deriveDistroSeries13:59
wgrantAnd would have been merged into db-devel today...13:59
wgrantHmm.13:59
wgrantHave you bisected?13:59
* bigjools looks at self13:59
* bigjools is still in once piece13:59
wgrantSounds painful.13:59
wgrantIt is 11pm, so it's your problem :)14:00
bigjoolsgee thanks14:00
bigjools:)14:00
danilosbigjools, I can help bisect you ;)14:00
bigjoolsdanilos: no I am not rooming with you again14:00
danilosbigjools, a shame, a shame :)14:00
bigjools:)14:00
deryckhenninge, ping for standup14:01
=== almaisan-away is now known as al-maisan
wgrantbigjools: Any luck with the conflict?14:22
bigjoolswhat conflict?14:22
wgrantTest failure, whatever it is these days.14:23
bigjoolsjust sent a fix in14:23
wgrantGreat.14:23
bigjoolsI have *no* idea how that *ever* passed *any* buildbot/ec2 run14:23
=== danilos changed the topic of #launchpad-dev to: https://dev.launchpad.net/ | On call reviewer: - | https://code.launchpad.net/launchpad-project/+activereviews
jmlgmb: I'm doing a lightning talk tomorrow on the bug subscription stuff. I'm trying to get a screenshot of the unsubscribe-in-anger stuff14:34
danilosjml, did you see my suggestions above?14:35
jmldanilos: no, I didn't.14:35
jmlsorry14:35
jmlmy IRC backlog spew is not working: (14:35
gmbjml: $bug/+subscriptions will give you the UIA page for any bug.14:35
danilos<danilos> jml, click on "Edit bug mail" link on any bug page14:35
danilos<danilos> jml, (that page is going to be linked from all emails, but it was a mess to make the link conditional in the email template so we left it for when we go fully public)14:35
gmb(Or that)14:35
jmlThanks :)14:36
jmlalso, how do I remove the product team from the yellow team14:36
danilosjml, you may want to have a suitable set of subscriptions through teams, to duplicates and structural subscriptions14:36
jmlthis Launchpad thing can be very confusing at times14:36
danilosjml, yeah, you should talk to our strategist about that :)14:36
jmldanilos: he says they know about it and would love to work on it but don't have the capacity right now.14:37
danilosjml, anyway, deactivated the product team in ~yellow14:37
jmldanilos: thanks.14:37
danilos:)14:37
jmlhttps://launchpad.net/~yellow/+mugshots still shows my mug :(14:38
danilosjml, sounds like a different bug :(14:39
wgrantjml: That page is memcached. We can turn that off with an FF.14:39
gmbJeez, I still have that potato photo up.14:39
gmbMind you, could be worse14:39
mwhudsonit also says, results 1-5 of 5 and then shows 11 photos14:40
gmbHeh. Nice.14:40
danilosgmb, heh, I had photo set by kiko originally to something weird... forcing me to change it something like 18 months later14:40
gmb"There are probably at least five people in this team"14:40
danilosmwhudson, so obviously, a portlet is memcached only14:40
danilosor a page snippet, making it all the more fun14:41
mwhudsondanilos: yeah14:41
henningeabentley: two gestions about API use:14:41
wgranthttps://launchpad.net/~yellow/+mugshots?nocachethanks is a bit more sensible :)14:41
henningeabentley: how do I switch launchpadlib to use 'devel' instead of 1.0?14:42
jmlwgrant: thanks. I didn't know about that trick.14:42
henningeabentley: how do I get to the HTML representation of an object, as mentioned in the bug description?14:42
abentleyhenninge: You specify the root URL to your initial client call.14:42
wgrantOf course now *that*'s cached.14:42
jmlalso, anyone got spare time for gravatar integration?14:42
gmbHeh. The three big problems, eh.14:42
wgranthenninge, abentley: Give Launchpad.login_with the kwarg version='devel'.14:42
gmbjml: +many14:42
abentleyhenninge: my bad.14:42
henningeabentley: no worries14:43
henningewgrant: thanks14:43
wgrantHacking the URL was right until Lucid.14:43
abentleyhenninge: The HTML representation is just the web service representation, as a list of javascript variables.14:44
wgrantObjects can define custom HTML representations.14:44
henningeabentley: what I get when I call the URL in a browser, right?14:44
abentleywgrant: you mean, the JSON representation provided by the LP.cache can be overridden?14:45
abentleyhenninge: No, I don't know what you mean.14:46
wgrantabentley: The JSON representation is distinct from the HTML representation.14:46
abentleywgrant: So this is an additional representation provided by the web service on top of JSON and XML representations?14:47
wgrantabentley: There are two types of representation that lazr.restful can give you: JSON and XHTML. You can also ask it to give you the XHTML inside the rest of the JSON.14:48
wgrantabentley: The default XHTML representation is just a list of attributes and their values, but interfaces can declare adapters to give custom representations.14:48
wgranthttps://api.launchpad.net/devel/launchpad is the default.14:49
wgranthttps://api.launchpad.net/devel/~wgrant is a custom one.14:49
abentleywgrant: Okay.  So I guess henninge needs to know how you request that representation using launchpadlib.14:49
wgrantNFI14:49
wgrantYou can override it with ws.accept14:49
wgrantBut not sure how to tell launchpadlib about that.14:49
henningeabentley, wgrant: that's fine for now. Thanks14:50
wgranteg. https://api.launchpad.net/devel/~wgrant?ws.accept=application/json14:50
abentleyhenninge: The JSON representation ends up in the LP.cache through lib/lp/app/templates/base-layout-macros.pt:17414:51
henningeabentley: thanks14:52
wgrantYou add stuff to that using IJSONRequestCache.14:53
wgrantDo not attempt to serialise JSON manually.14:53
wgrantOr I will come and get you :)14:53
abentleywgrant: he's fixing bug 74020814:53
wgrantAh.14:54
wgrantThat's a fairly difficult one.14:54
henningeI always pick those it seems ...14:54
wgrantI have very little idea of how to fix it sanely.14:54
wgrantApart from slapping people who think it's necessary.14:54
wgrantBut that's less than productive :(14:54
bigjoolswgrant, the voice of reason15:01
mwhudsoni like wgrant's proposed solution15:05
aalex-sathello15:09
aalex-sateh I could work for Canonical, since I know Twisted. :) I didn't know that you guys were using it a lot.15:10
aalex-satI'm currently working on something much similar to Ubuntu One. Maybe I shouldn't reinvent the wheel.15:11
=== abentley changed the topic of #launchpad-dev to: https://dev.launchpad.net/ | On call reviewer: abentley | https://code.launchpad.net/launchpad-project/+activereviews
abentleyderyck: I'm OCR, so could you please review https://code.launchpad.net/~abentley/launchpad/safe-branch-upgrade/+merge/60634 ?15:34
deryckabentley, definitely.15:34
abentleyderyck: thanks.'15:34
sinzuijcsackett: any commercial admin can increase an archive size. I am one15:45
* sinzui looks at question15:45
bigjoolssinzui: we need to fix that.  commercial admins have far too many powers over PPAs15:48
wgrantbigjools: I guess we probably want to grant the OEM namespace an entitlement for unlimited private PPAs and quotas.15:51
wgrantThen we can remove commercial admins.15:51
wgrantI suppose.15:51
bigjoolsnot quite15:52
sinzuibigjools: I think ~registry needs to change the archive size. That is all I want to support for the whole team15:52
bigjoolswe need a PPA admin celeb15:52
wgrantWhy?15:52
bigjoolsthe celeb will be able to do what commercial can currently do to PPAs and we restrict it better.  We then need to come up with a way for certain people to self-service within some boundary15:53
deryckabentley, looks great.  r=me.16:05
abentleyderyck: thanks.16:06
deryckabentley, np!16:06
deryckbenji, I'm trying to qa my fix from yesterday that you reviewed... the click unsubscribe link doesn't remove name issue....16:43
deryckbenji, but I wrote this, not being mindful of the feature flag, and can't qa against the unsubscribe link myself...16:43
deryckbenji, but I notice the "Edit subscription" goes to loading when you're subscribed via a dupe and never completes.16:44
deryckbenji, wondering if this is known or something I introduced?16:45
=== al-maisan is now known as almaisan-away
benjideryck: that doesn't ring a bell, let me look at the full bug list real quick16:45
=== mpt_ is now known as mpt
benjideryck: I don't see anything on https://bugs.edge.launchpad.net/launchpad-project/+bugs?field.tag=story-better-bug-notification that sounds like that, so either we haven't noticed or you did it ;)16:47
deryckbenji, ok, thanks16:48
benjisinzui: since you've been on this click-to-close message box journey with me from the begining, would you like to look at the final (I hope) revision? https://code.launchpad.net/~benji/launchpad/bug-779538/+merge/6065016:49
deryckbenji, but is the expected behavior that I should be subscribed via a duplicate and click "edit subscription" and be able to drop my subscription via a dupe that way?16:49
benjideryck: that I don't know16:50
deryckbenji, ok, thanks again16:50
=== matsubara is now known as matsubara-lunch
deryckbenji, I filed bug 781245 about what we talked about.  I'll poke a bit more to see if its from me or not.17:27
_mup_Bug #781245: Clicking "Edit subscription" when subscribed via a duplicate gets stuck at "Loading..." <story-better-bug-notification> <Launchpad itself:Triaged> < https://launchpad.net/bugs/781245 >17:27
=== deryck is now known as deryck[lunch]
LPCIBotProject db-devel build #538: FAILURE in 5 hr 11 min: https://lpci.wedontsleep.org/job/db-devel/538/18:00
benjiabentley: do you have a minute to review https://code.launchpad.net/~benji/launchpad/bug-779538/+merge/60650 for me?18:09
benjiI think the MP has all the background you need, but feel free to ask if you have any questions.18:09
abentleybenji: okay.18:09
abentleybenji: Why not just tweak the delegate callback to only affect the correct link?18:16
=== matsubara-lunch is now known as matsubara
benjiabentley: in the former approach there wasn't a link, the "Hide X" "link" was just CSS style, the on-click actually happened on the message box itself, that meant that clicking on a link, or selecting text, or control-/shift-clicking on a link would trigger the on-click18:18
benjithis way there's a real DOM element to hook an on-click up to so we don't react to all those stray events18:18
abentleybenji: So normally, we'd just hook this up when the DOM is ready.  I assume the notifications are created after DOMReady?18:21
benjiabentley: they can be; for example the new structural subscription bits create message boxes after doing AJAX requests18:22
abentleybenji: So could the javascript that creates the notification also attach the handler?18:23
benjiabentley: it could, but that would mean we have to remember every time; sounds easy to forget18:25
abentleybenji: Really?  There's no common code to create a notification?18:25
benjinot that I'm aware of; all the ones I know of are done server-side; if there is, then the fact that we created ours directly (Y.Node.create) suggests to me that others will do the same18:26
abentleybenji: Having everyone create their notifications using Y.Node.create sounds like something we should discourage.18:30
=== deryck[lunch] is now known as deryck
abentleybenji: instead of polling, what about a "contentready" event handler?18:30
benjiabentley: I wasn't aware that contentready would fire when new elements were added to the DOM18:34
abentleybenji: I don't know for sure, but it seems likely there's a way to detect new elements being added to the DOM.18:34
benjire. Y.Node.create: <shrug> It seems like embracing our medium to me.18:35
abentleybenji: It seems like it would lead to discrepancies and confusion to me.18:36
abentleybenji: Notifications have a higher-level meaning to us.  They're not just HTML.18:36
benjithrere's the DOMNodeInserted event, but it's still in draft and slightly older Firefoxes don't support it, and I'd be afraid of an event storm on our larger pages18:38
benjiwell, at this point I've exhausted my timebox, so I'll instead remove the current, broken click-to-close behavior18:39
sinzuibenji: I agree they are not HTML, but we have several bug open that indicate that developers think they are HTML. Many pages show object state as a notification: bug-converted-to-question, product-deactivated, package-not-published.18:39
sinzuibenji: I think reverting is a fair decision. The only case I want to close a notification is the broken cases above. I know the notification will be gone if I reload18:41
LPCIBotProject windmill-db-devel build #265: STILL FAILING in 44 min: https://lpci.wedontsleep.org/job/windmill-db-devel/265/18:45
benjiabentley: here's the remove-click-to-close MP: https://code.launchpad.net/~benji/launchpad/remove-click-to-close/+merge/6067319:16
abentleybenji: It's not true that it was deemed unsuitable in review.  You terminated review before I reached a conclusion.19:17
benjiabentley: I was thinking more of my conversation with sinzui.19:19
benjiI didn't intend to cut the review short, but I don't see how we would have ended up landing the branch (more or less) as-is.19:20
abentleybenji: r=me.19:21
benjithanks19:21
abentleybenji: It's important to avoid polling unless there is no reasonable alternative.  I was trying to find out whether the alternatives had been exhausted.19:22
benjiyep, absolutely understandable19:24
abentleyIf I believed that there was no reasonable alternative, I would have been willing to approve a polling-based solution.19:25
=== Ursinha is now known as Ursinha-afk
deryckabentley, hi.  I have an easy one for review, if you're available.20:41
abentleyderyck: sure.20:42
deryckabentley, thanks!  https://code.launchpad.net/~deryck/launchpad/edit-subscription-always-loading-781245/+merge/6068320:42
abentleyderyck: r=me20:44
deryckabentley, awesome, thanks!20:44
=== lifeless_ is now known as lifeless
lifelessgary_poster: hi20:50
gary_posterlifeless, hey21:06
abentleyderyck: chat?21:11
deryckabentley: sure.21:12
lifelessgary_poster: wondering if you wanted to chat about the services draft21:12
deryckabentley: mumble or here?21:12
abentleyderyck: mumble21:13
deryckok21:13
gary_posterlifeless, it looks like it has grown further since my last skim.  Lemme finish what I'm up to, then I'll read again and more carefully.  I'm out in 45 min (and trying to be strict about it because of the baby).  I'll touch base with you in 30 min and let you know if I have any immediate thoughts, and if I think I have anything worth talking about over a longer time.21:15
lifelessgary_poster: thats great21:17
lifelesssinzui: hi21:37
lifelesssinzui: I'm trying to do what bug 781326 asks for but21:37
_mup_Bug #781326: Please remove erroneous LibreOffice Launchpad project website https://launchpad.net/libreoffice <Launchpad itself:New> < https://launchpad.net/bugs/781326 >21:37
lifelessit had a series linked to sid (the df-libreoffice has its series linked to natty and oneiric21:37
lifelessso I unlinked and relinked21:37
lifelessthe https://launchpad.net/libreoffice/+admin form though is whinging that there is a series21:38
lifelesssorry, a package link21:38
lifelesswhich I just deleted :(21:38
lifelesssinzui: any thoughts on how to address ?21:38
=== abentley changed the topic of #launchpad-dev to: https://dev.launchpad.net/ | On call reviewer: - | https://code.launchpad.net/launchpad-project/+activereviews
lifelessgary_poster: hi21:56
lifelessgary_poster: you're about to run; thought i would ping a touch-base before then21:56
gary_posterlifeless: hi, I didn't forget/ :-) I'm reading and making notes as I go.  I think I do have some thoughts, though I don't know how helpful they are, since they are so casual21:57
lifelessgary_poster: cool! I had no doubts :)21:59
lifelessgary_poster: if you can email me what you have when you're done; I'll incorporate them, and then start wider distribution of this for discussion21:59
gary_posterlifeless, will do.  they are of this sort--questions, casual thoughts, and so on.  http://pastebin.ubuntu.com/606283/  Maybe they will be more substantial when done. :-)22:02
lifelessthats good stuff22:03
gary_posterok, I'll keep going tomorrow and send it your way then lifeless.22:03
gary_posterhave a great day22:03
NCommanderwgrant: so I've been starring at Soyuz, and I'm kinda lost on using the factory, I get that SoyuzTestPublisher does things like setup BreezyAutoTest, and it seems its got enough methods to at least get my initial uploads in, publish them, etc.23:12
NCommanderI'm very confused on where the Factory comes in, or why test_build_set has a lot of things that seem ignored by SoyuzTestPublisher ...23:12
=== cinerama_ is now known as cinerama

Generated by irclog2html.py 2.7 by Marius Gedminas - find it at mg.pov.lt!