[00:13] <menn0> thumper: the next fix for bug 1468994: http://reviews.vapour.ws/r/2042/
[00:13] <mup> Bug #1468994: leadership settings documents written out without env-uuid field <juju-core:In Progress by menno.smits> <juju-core 1.24:In Progress by menno.smits> <https://launchpad.net/bugs/1468994>
[00:14] <menn0> thumper: also, not sure if this relevant to what you're looking at: https://bugs.launchpad.net/juju-core/+bug/1457225/comments/9
[00:15] <thumper> don't think that is related to this current issue
[00:18] <menn0> thumper: k
[00:51] <thumper> davecheney: I don't suppose there is a way for a function in Go to annotate the call stack?
[00:51] <thumper> davecheney: that would be so handly when analysing panics
[01:30] <davecheney> thumper: no, sorry, there is not
[01:30] <davecheney> i did see one tool published
[01:30] <davecheney> but I cannot rememver it's name at the moment
[01:30] <davecheney> it didn't annotate stack traces
[01:30] <thumper> oh well
[01:31] <davecheney> but it did do some kind of analysis/grouping
[01:35] <thumper> davecheney: \o/
[01:35] <thumper> I have a panic with the workers showing restarting
[01:35]  * thumper digs
[01:36] <davecheney> thumper: paste ?
[01:36] <thumper> sure...
[01:37]  * thumper finds the start
[01:38] <thumper> davecheney: http://paste.ubuntu.com/11791044/
[01:38] <thumper> davecheney: it is even one of the tests known to cause issues
[01:39] <thumper> davecheney: line 301 is the a.Stop call from the test (pretty sure)
[01:40] <davecheney> oww, this  paste is hurting my machine
[01:41] <thumper> line 347 shows a worker has said it started after everyone had been killed
[01:41] <davecheney> is this the "did not reach expected state" ?
[01:42] <thumper> line 255 also looks weird
[01:42] <davecheney> the line ofhte output ?
[01:42] <thumper> davecheney: I think it is the case of the goroutine not fully starting before being told to stop
[01:42] <davecheney> or another line ?
[01:42] <thumper> 355 sorry
[01:44] <thumper> davecheney: pretty sure this is all due to timing around the workers that had been asked to start haven't fully started
[01:44] <thumper> davecheney: and then told to die
[01:44] <thumper> and they all get confused
[01:44]  * thumper digs into timing a bit more
[01:44] <davecheney> how are workers told to stop ?
[01:46]  * thumper rages
[01:46] <thumper> davecheney: remember when I said that this would be due to a worker finishing with a non-fatal error?
[01:46] <thumper> look at line 579
[01:47] <davecheney> uh h
[01:47] <davecheney> uh oh
[01:47] <davecheney> i htink i even logged an issue about that permission deined error
[01:47] <thumper> and another...
[01:47] <davecheney> asking, why does it do this
[01:48] <thumper> 616 - 619
[01:48] <thumper> NFI
[01:48] <thumper> test isolation failure
[01:48] <thumper> where it shouldn't be looking at /var/lib/juju
[01:49] <thumper> however, that isn't the only problem
[01:49] <davecheney> isFatal is passed into the runner
[01:49] <davecheney> so there is no knowing that it considers fatal
[01:49] <thumper> I'm prepared to bet money that this is another case of multiple unexpected issues causing problems with each other
[01:49]  * thumper digs more
[01:49] <davecheney> i'd back that
[01:50] <thumper> I'm so happy to get this logging...
[01:51] <davecheney> so, i see lots of start "worker"
[01:52] <davecheney> but no corresponding stopped "worker"
[01:55] <davecheney> thumper
[01:55] <davecheney> how does killWorker work ?
[01:56] <thumper> you should see killing and exited
[01:56] <thumper> killing is the request to kill it
[01:56] <davecheney> info.worker.Kill() isn't plumbed through to the worker
[01:56] <thumper> and exited when it is done
[01:56] <davecheney> it's not passed to start()
[01:56] <thumper> it is all a bit convoluted
[01:58] <davecheney> thumper: hangout call ?
[01:58] <thumper> gimmie a few minutes... in the middle of something
[02:01] <davecheney> i can see a case where the started worker's kill channel will not be hooked up correctly
[02:01] <davecheney> ie, the kill signal is delivered to the previous invocation of the worker
[02:02] <thumper> davecheney: 1:1
[02:09] <davecheney>                         workerInfo.worker = nil
[02:09] <davecheney>                         go runner.runWorker(workerInfo.restartDelay, info.id, workerInfo.start)
[02:09] <davecheney>                         workerInfo.restartDelay = RestartDelay
[02:14] <davecheney>                                 } else {
[02:14] <davecheney>                                         logger.Errorf("exited %q: %v", info.id, info.err)
[02:14] <davecheney>                                         workerInfo.worker = nil
[02:14] <davecheney>                                 }
[02:43] <davecheney> thumper, menn0 https://github.com/juju/juju/pull/2668
[02:44] <menn0> davecheney: thumper has lost power at home
[02:44] <menn0> davecheney: looking
[02:53] <davecheney> shtter
[02:57] <menn0> davecheney: I don't completely understand this change
[02:57] <davecheney> menn0: hangout ?
[02:57] <menn0> davecheney: AFAICS killAll is only called when the runner's tomb is dying
[02:57] <davecheney> correct
[02:57] <davecheney> it's hard to explain in irc
[02:58] <davecheney> it's taken thumper and I all morning
[02:58] <menn0> davecheney: ok standup hangout
[03:02] <thumper> power is back
[03:03] <thumper> menn0, davecheney: I found something very interesting
[03:03] <thumper> api worker starts: upgrader, upgrade-steps, and api-post-upgrade
[03:03] <thumper> however when the kill order is given
[03:04] <thumper> we see:
[03:04] <thumper> killing upgrader
[03:04] <thumper> killing api-post-upgrade
[03:04] <thumper> ugh
[03:04] <thumper> just worked out that the upgrade-steps have just finished
[03:04] <thumper> however
[03:04] <thumper> even though we say killing api-post-upgrade
[03:04] <thumper> it doesn't kill any of it's workers
[03:07] <thumper> menn0: standup hangout?
[05:12] <thumper> menn0, davecheney: logging for 1.24 http://reviews.vapour.ws/r/2045/
[05:12] <thumper> haven't been able to reproduce the panic yet with this logging in
[05:12] <thumper> but still running tests
[05:18] <menn0> thumper: reviewed, just some small suggestions
[05:18] <thumper> k
[05:25] <davecheney> thumper: looking
[05:25] <thumper> davecheney: sok, menn0 reviewed
[05:25] <thumper> davecheney: however with this logging, can't reproduce the error
[05:32] <davecheney> thumper: http://paste.ubuntu.com/11791616/
[05:32] <davecheney> run it under the stress
[05:33] <davecheney> copy that to ~/stress.bash
[05:33] <davecheney> cd $PATH
[05:33] <davecheney> bash ~/stress.bash
[05:34] <menn0> thumper: with that you might be to reproduce the bug more quickly by just running one of the tests that is known to trigger the issue instead of all the tests (maybe?)
[05:34] <thumper> ok
[05:53]  * thumper stresses the tst
[06:00] <thumper> davecheney: even with the stress script running just the upgrade suite, it isn't failing
[06:02] <davecheney> shitter
[06:06] <thumper> 25 times in a row it is good now
[06:08]  * thumper tries the entire package
[06:17] <thumper> I think I have it again
[06:17] <thumper> but we are no further than we were before...
[06:19] <thumper> can't tell... waiting for CI to throw it up
[06:19]  * thumper is done
[07:05] <dimitern> jam, are you around for our 1:1?
[07:05] <jam> dimitern: just trying to connect now
[07:06] <jam> dimitern: I think google's creds need me to login again, but it isn't giving me the window
[07:06] <dimitern> jam, ok
[08:21] <mup> Bug #1453096 opened: Machine agent state changes not included in the mega-watcher <cloud-installer> <landscape> <juju-core:New> <juju-gui:Triaged> <https://launchpad.net/bugs/1453096>
[08:56] <dimitern> dooferlad, TheMue, PTAL http://reviews.vapour.ws/r/2049/
[14:04] <katco> ericsnow: standup
[14:16] <mup> Bug #1469731 opened: Leader should probably change when removing unit <juju-core:New> <https://launchpad.net/bugs/1469731>
[15:03] <wwitzel3> katco: you enjoyed canceling those, I can tell
[15:03] <katco> wwitzel3: haha
[15:04] <katco> wwitzel3: i always enjoy canceling meetings ;)
[16:23] <mup> Bug #1469777 opened: juju-local falsely claimed to be missing <ci> <local-provider> <juju-core:New> <https://launchpad.net/bugs/1469777>
[16:53] <mup> Bug #1469799 opened: Agent tests fail with no output <ci> <ppc64el> <test-failure> <juju-core:Incomplete> <juju-core 1.24:Triaged> <https://launchpad.net/bugs/1469799>
[16:59] <mup> Bug #1469799 changed: Agent tests fail with no output <ci> <ppc64el> <test-failure> <juju-core:Incomplete> <juju-core 1.24:Triaged> <https://launchpad.net/bugs/1469799>
[17:02] <mup> Bug #1469799 opened: Agent tests fail with no output <ci> <ppc64el> <test-failure> <juju-core:Incomplete> <juju-core 1.24:Triaged> <https://launchpad.net/bugs/1469799>
[17:02] <mup> Bug #1469807 opened: ListSuite.TestOutputFormats fails on Windows <ci> <test-failure> <windows> <juju-core:Incomplete> <https://launchpad.net/bugs/1469807>
[17:14] <mup> Bug #1469807 changed: ListSuite.TestOutputFormats fails on Windows <ci> <test-failure> <windows> <juju-core:Incomplete> <juju-core net-cli:Triaged> <https://launchpad.net/bugs/1469807>
[17:23] <mup> Bug #1469807 opened: ListSuite.TestOutputFormats fails on Windows <ci> <test-failure> <windows> <juju-core:Incomplete> <juju-core net-cli:Triaged> <https://launchpad.net/bugs/1469807>
[18:31] <katco> ericsnow: got time to chat about the api server abstractions? wwitzel3 natefinch welcome as well
[18:31] <ericsnow> katco: sure
[18:31] <katco> ericsnow: moonstone
[18:56] <mup> Bug #1469844 opened: Juju bootstrap fails with nonce mis-match error <bootstrap> <ci> <intermittent-failure> <maas-provider> <juju-core:New> <juju-core devices-api-maas:New> <juju-core feature-proc-mgmt:New> <https://launchpad.net/bugs/1469844>
[19:06] <katco> natefinch: hey do you have a branch i can look at for the server methods? i need to see how you're using the api server as an example for how to generalize my stuff
[19:07] <katco> jam: hey you around for a pretty simple question about registering facades?
[19:07] <natefinch> katco: yeah
[19:07] <jam> katco: what's up?
[19:08] <katco> jam: here: https://github.com/juju/juju/blob/master/apiserver/common/registry.go#L126
[19:08] <katco> jam: is there any reason newFunc couldn't be of type func(*state.State, *common.Resources, common.Authorizer) (interface{}, error)?
[19:09] <jam> katco: so this isn't the code as I wrote it, so I'll have to figure out why it isn't
[19:09] <jam> someone added the "ForFeature" versions, and changed something.
[19:09] <natefinch> katco: sorta rough still and in the middle of it, so it doesn't compile, but the code pretty much makes sense: https://github.com/natefinch/juju/blob/proc-server-api/process/api/server/server.go   and https://github.com/natefinch/juju/blob/proc-server-api/process/api/server-args.go
[19:10] <katco> jam: natefinch no worries at all. the stuff i'm looking for is hand-wavey anyway
[19:10] <jam> katco: I remember now
[19:10] <jam> concrete return types
[19:11] <jam> katco: specifically, our NewFoo() functions returns *Type objects, and we reflect on that Type to determine the API
[19:11] <katco> jam: can't we cast the interface to the concrete type using reflection?
[19:11] <jam> katco: you can't pass a function that returns a concete type to an interface that says it returns interface{}
[19:12] <katco> jam: sorry, i meant have the functions go ahead and return interface{}, but where the type of that interface is important, discover its true type via reflection
[19:12] <jam> katco: http://play.golang.org/p/XjucCOijN9
[19:13] <jam> katco: we can't do registration time lookup for the signature of the API, (we have to actually call it)
[19:13] <jam> katco: but more than that
[19:13] <jam> if you want to test NewFoo
[19:13] <jam> you really want a Foo there
[19:13] <jam> now we can rewrite all of the tests to use NewFoo().(Foo)
[19:13] <katco> jam: well the tests are hte easy problem, right? yeah what you just said
[19:15] <katco> jam: don't want to take too much of your time after-hours... we're just fiddling with that area of the code and thought it might make more sense to be concrete about the function type. if i can get the reflection to work out, are you opposed to that approach?
[19:15] <jam> katco: so there is RegisterFacade which takes the exact thing you were asking
[19:15] <jam> but it also requires you to pass in a reflect.Type
[19:15] <katco> jam: ah so there is
[19:16] <jam> katco: IMO its really nice to just be able to have a normal NewFoo() function
[19:16] <jam> and then be able to Register(NewFoo)
[19:16] <jam> and both NewFoo acts like other NewFoo functions (returning a Foo) and it has the type that you need to register, so you don't have to import reflect into all of your packages.
[19:16] <katco> jam: the only issue is that we've taken a (potential -- if the reflection bit works out) compile-time error and made it runtime
[19:17] <jam> katco: how do you mean a compile time error? because you're changing the signature into interface{}
[19:17] <jam> which means it has no signature
[19:17] <jam> so the thing you *actually* care about
[19:17] <jam> which is that you got the right type when you call it
[19:17] <jam> is only determined *when it is called*
[19:17] <jam> katco: with this way, you find out during Register()
[19:18] <jam> which happens during init()
[19:18] <jam> which means that every juju process finds out really fast
[19:18] <katco> jam: so, iirc, the rpc stuff expects a type of interface{} anyway, so it can reflect and find the methods, etc.
[19:19] <katco> jam: it's the registration that requires the specific signature, right?
[19:19] <jam> katco: its the registration that allows a Type which it will then use to expose the API and it confirms at actual call type that the object conforms to the concrete Type that was registered.
[19:20] <katco> jam: so the bit i'm thinking we can still do that, even if the factory methods returned an interface
[19:20] <katco> jam: oops s/the bit//
[19:20] <jam> so there is an 'interface{}' level under the covers, but it means that the infrastucture helps you DTRT (I think)
[19:21] <jam> katco: so you can certainly do it, and use RegisterFactory instead of RegisterStandardFactory
[19:21] <katco> jam: i'm wondering if you can do it w/o passing in the reflect.Type as well
[19:21] <jam> katco: how do you know what methods will be available in order to define the API?
[19:22] <katco> jam: i'd have to do some research, but my gut says yes. this code says someone else did the research and said no however ;)
[19:22] <jam> katco: so the original code was all static analysis
[19:22] <katco> jam: i'm thinking you can reflect on an interface{}, get its real type, and then do as we do now
[19:22] <jam> we had 1 top level type that exposed lots of GetFoo() Type methods
[19:23] <jam> katco: you could decide that you can call any method you like from the API and we'll call the function and then late tell you "the object we created doesn't support the method you wanted"
[19:24] <katco> jam: that's what we have no anyway isn't it? the api layer just uses strings to call methods?
[19:24] <jam> katco: it rejects the requests before calling the factory
[19:24] <katco> jam: ah i see, so the type isn't constructed before failing
[19:24] <jam> katco: *object* here
[19:25] <katco> jam: well, hows this: its not critical to what i'm working on. but if i find some time, i'll do some experiments, and if i think its headed in a beneficial direction given what points you've raised, i'll submit a pr and we can shoot holes in it
[19:26] <katco> s/its/it's/
[19:29] <wwitzel3> katco: I'm back if you still want to chat
[19:29] <katco> natefinch: ty... so how you're using state hasn't really been addressed yet?
[19:29] <katco> wwitzel3: ty, ericsnow and i talked. think i'm good for now
[19:35] <natefinch> katco: you mean like passing in an interface?  No, I hadn't written that yet, but you can probably figure it out by looking at the commented out functions that call state functions which ericsnow is writing.
[19:36] <katco> ericsnow: natefinch: can we hop in moonstone rq? i want to run an approach by you. wwitzel3 you are welcome too
[19:36] <natefinch> katco: seems like the RegisterStandardFacade function should be in charge of that... it's already passing in state. It could instead pass in an interface
[19:36] <ericsnow> katco: k
[19:37] <natefinch> katco: sure...  I have to go in 25 minutes, though, have a quick errand to run.
[20:28] <thumper> mramm2: weren't we going to have a chat about now?
[20:29] <wwitzel3> ericsnow: ping if you're around
[20:29] <ericsnow> wwitzel3: sure
[21:08] <mbruzek1> is the juju-dev@lists.ubuntu.com a private or public email list?
[21:08] <mbruzek1> nevermind it looks public to me
[21:09] <mbruzek1> https://lists.ubuntu.com/archives/juju-dev/2015-June/thread.html
[21:39] <mup> Bug #1437445 changed: worker/uniter: FAIL: util_test.go:665: "never reached desired status" <unit-tests> <juju-core:Triaged> <https://launchpad.net/bugs/1437445>
[22:02] <katco> anastasiamac: running just a little late. brt
[22:03] <anastasiamac> katco: nps
[22:05] <sinzui> thumper: ppc64el is retesting with a cap on procs
[22:05] <thumper> sinzui: I read that as "crap on procs"
[22:05] <sinzui> :)
[22:06] <sinzui> thumper: also, maybe we can get the mem increaed to 16 for this one instance
[23:07] <thumper> sinzui: is the power test running?
[23:07] <thumper> sinzui: how's it going?