/srv/irclogs.ubuntu.com/2013/08/29/#juju-dev.txt

davecheneythumper: more debug is neede here01:46
davecheney2013-08-29 01:42:25 DEBUG juju.worker.uniter.filter filter.go:289 got unit change01:46
davecheney2013-08-29 01:42:26 INFO juju.worker.upgrader upgrader.go:138 required tools: 1.13.2-precise-amd6401:46
davecheneyall the units are blocked on this line01:46
davecheneyno further output01:46
thumperhmm...01:46
thumperdoesn't seem too helpful01:47
davecheneythis is in ap-southeast-2 as well01:47
bigjoolswallyworld__: how's the coffee machine?01:47
davecheneyso it shouldn't take more than a few seconds to get the tools01:47
thumperI wonder where it is blocked01:49
davecheneyi'll hit it with SIGQUIT and hope stderr goes somewhere01:50
axwwallyworld__: I've just pushed some changes to my image-metadata branch that fixes the marshalling so numbers aren't floats01:51
davecheneythumper: http://paste.ubuntu.com/6038698/01:51
axwwallyworld__: it's a bit gnarly though, you might want to review my changes to environs/simplestreams01:52
davecheneythumper: right, it did the upgrade, but it didn't restart01:52
thumperhmm...01:53
davecheneyhmm, maybe it worked01:54
davecheneyhard to tell from the output01:55
davecheneythumper: ok, here is the issue01:59
davecheney2013-08-29 01:59:40 INFO juju runner.go:253 worker: start "upgrader"01:59
davecheney2013-08-29 01:59:43 DEBUG juju.worker.uniter.filter filter.go:289 got unit change01:59
davecheney2013-08-29 01:59:43 INFO juju.worker.upgrader upgrader.go:138 required tools: 1.13.3.1-precise-amd6402:00
davecheney^ this is the message from the upgrade _after_ it has restated02:00
davecheneyoops 2013-08-29 02:03:48 INFO juju.worker.uniter context.go:234 HOOK Shutting down without a db02:04
davecheney2013-08-29 02:03:48 INFO juju.worker.uniter context.go:234 HOOK /var/lib/juju/agents/unit-mediawiki-0/charm/hooks/db-relation-departed: line 4: /var/lib/juju/agents/unit-mediawiki-0/charm/hooks/stop: No such file or directory02:04
davecheneynope, charm bug02:04
wallyworld__bigjools: awesome. i've just made a second one for today02:05
bigjoolswallyworld__: \o/02:05
wallyworld__axw: thanks, i'll take a look02:05
axwwallyworld__: thanks. also, I started using tools.Fetch to test... but it looks like that only returns a single version? is that right?02:06
axwso I guess I'll just grab the files from storage and check their contents directly02:07
wallyworld__axw: the Fetch method can return multiple but the constraint limits it. i've pushed a branch for review which allows loser matching and hence returns multiple02:08
axwwallyworld__: ok, cool02:08
wallyworld__to generate the metadata, i think the current best option is to grab from storage02:08
wallyworld__we will/should revist that i think02:08
wallyworld__axw: it is hacky isn't it. perhaps we can make it better by working the construct logic into the unmarshall method02:24
axwwallyworld__: moving it into which unmarshal method?02:24
wallyworld__the json unmarshaller for the collection02:25
wallyworld__so instead of shoving stuff into a "" key, we can call construct and fill out the collection directly02:26
axwwallyworld__: the problem is that the item type isn't known there02:26
axwwallyworld__: there's no way to convey context to the unmarshaller, except through a global :(02:27
wallyworld__is it sort of since we figure out the call point02:27
axwhm02:27
wallyworld__so we can map that to type02:27
axwI don't like any of the solutions :)02:27
wallyworld__i'm being a bt hand wavey, but i think it is possible02:27
wallyworld__i agree, they all suck02:28
axwyeah I get you02:28
wallyworld__i think Go's json unmarshalling sucks02:28
wallyworld__it can't be extended quite right02:28
wallyworld__at least we would be confining the hackery to a single unmarshall method02:29
wallyworld__so the method is a black box that "just works" but is hacky inside02:29
wallyworld__and i'd put it separately in a json.go file in the same package02:29
axwhmmmm02:31
axwI'll have a look later02:31
wallyworld__ok02:31
axwneed to respond to some review comments02:31
wallyworld__np02:31
axwwallyworld__: so one way you could do it is this: have ParseCloudMetadata store itemType in a global, protected with a mutex (only one unmarshal at a time); have ItemsMap.UnmarshalJSON do the Callers check, and then use the global02:34
axwis that what you were thinking?02:34
wallyworld__axw: sort of. i was thinking there'd be a map of method name (as determined in the current code) -> type02:35
wallyworld__so no mutex needed02:35
wallyworld__just look u the map after calling method is determined02:35
axwah yeah ok02:36
axwso they just register up front the function name -> reflect.Type02:36
wallyworld__yep02:37
wallyworld__still hacky, but it allows it to be kept under the rug02:37
wallyworld__and isolated from the core business logic02:38
axwthumper: can you please explain this to me (comment by William)? "Never use conn.Environ if you can possibly help it. It's basically never up to date."03:23
thumperaxw: sure03:24
thumperthe conn.Environ is the environment based purely on the parsing of the local config03:24
thumpernot the value in the bootstrap node03:24
thumperwhen a machine is bootstrapped03:24
thumperis initializes passwords etc03:24
thumperso they are no longer the same03:24
axwah right03:24
thumperalso, if someone calls juju set-environment03:24
thumperit doesn't modify the local03:24
thumperonly the bootstrap copy03:25
thumperwhich then notifies all the workers03:25
thumperdoes that make sense?03:25
axwthumper: yes03:25
thumpercool03:25
axwI've seen the code that updates config from state03:26
axwnot sure about an Environ tho03:26
davecheneytrollololo, more bugs03:27
davecheneyhttps://bugs.launchpad.net/juju-core/+bug/121816803:33
_mup_Bug #1218168: cmd/juju: upgrade-charm does not expand tilde in filepaths <papercut> <juju-core:Triaged> <https://launchpad.net/bugs/1218168>03:33
* thumper runs the tests knowing that they'll fail04:08
* thumper was very surprised to see them all pass04:09
thumperwas in the wrong pipe04:09
* thumper smiles at the failures04:12
thumperseing base64 encoded certs rather than yaml serialized []byte04:12
davecheneythumper: so you fixed that huge turd of output in the cloud-init-output ?04:34
davecheneybigjools: https://bugs.launchpad.net/maas/+bug/121818204:42
_mup_Bug #1218182: No way to put a node into "maintenance mode" <MAAS:New> <https://launchpad.net/bugs/1218182>04:42
davecheneyhow can this be a thing04:42
davecheneysurely someone has asked for this already04:43
bigjoolsjust re-commission it04:43
bigjoolsbut yes generally that would be useful04:43
bigjoolswe even have a node state for it that's not used yet04:43
davecheneybigjools: can you recomission remotely ?04:52
davecheneyor does one need to get off ones ass ?04:52
bigjoolsdavecheney: just click on the ui button to do it04:53
bigjoolshowever04:53
bigjoolsit'll do the usual cycle and may not fail if nothing is getting installed04:53
bigjoolswe need to add commissioning tests04:53
bigjoolsdeletion is the best way of taking it out for now04:54
jam1davecheney: ~ is expanded by your shell, and has different behaviors if you attach an argument. Try: "echo -f=~/" vs "echo -f ~/" For me the former doesn't expand, the latter does expand.04:58
=== jam1 is now known as jam
davecheneyjam: we hit this in japan05:00
davecheneyit would be nice if there was a solution05:00
jamdavecheney: use --repository ~/foo/bar05:01
jamit works05:01
jamdon't use --repository=~/foo/bar it doesn't05:01
davecheneylucky(~/src/launchpad.net/juju-core) % juju upgrade-charm --repository=~/charms --switch local:mediawiki mediawiki05:01
jambash-ism05:01
davecheneyerror: no repository found at "/home/dfc/src/launchpad.net/juju-core/~/charms"05:01
davecheneysure05:01
davecheneybut can we expand it in the command05:01
axwthumper: did you want to do another review of my manual provisioning changes, or are you happy with it? fwereade_ has LGTM'd05:30
thumperaxw: if you don't mind, I'll take a quick look05:41
thumperbut probably just before the meeting05:41
* thumper breaks for dinner, back later05:42
=== thumper is now known as thumper-dinner
axwthumper-dinner: not at all, I will go back to simplestreams stuff for now05:45
axwjam: what is that gwacl/failing-test thing about?05:46
jamaxw: sorry for the noise. bigjools has asked that I set up gwacl under our tarmac bot, and I want to test that it both "successfully lands good patches" and "successfully fails bad patches"05:47
axwjam: I was just curious, not bothered :)05:49
axwthanks05:49
rogpeppe1mornin' all06:23
jammorning rogpeppe106:28
=== rogpeppe1 is now known as rogpeppe
rogpeppejam: hiya06:28
rogpeppejam: any idea what might be going on here? It stopped my merge last night and i can't reproduce it locally. https://code.launchpad.net/~rogpeppe/juju-core/376-factor-out-provider-utils/+merge/182465/comments/41417806:33
rogpeppefwereade_: ^06:33
jamrogpeppe: the only thing that comes to mind is that the test suite is "leaking" information an the test case is trying to contact a mongodb running elsewhere.06:35
jam(either a 'zombie' one that didn't get torn down properly or something else)06:35
rogpeppejam: that is a possibility i suppose, if the port selection logic isn't working06:36
rogpeppejam: i'm considering changing it actually06:36
rogpeppejam: currently it makes a socket, letting the system choose the port, then closes the socket, and trusts that it will be still ok to use in a short while06:37
rogpeppejam: we can't avoid some window, but i'm wondering if it might be better to pick a port at random, check that we can't dial it, then use that06:37
* rogpeppe wishes the port name space was considerably larger06:38
jamrogpeppe: could we pick a port but open it as reopenable and only close it after something else has grabbed it?06:38
jamSOCK_REUSEADDR or whatever that param is06:39
rogpeppejam: i don't think SOCK_REUSEADDR works like that06:39
rogpeppejam: it only allows address reuse of unique local/remote pairs, AFAIR06:39
rogpeppejam: i don't think it allows you to bind two listeners to the same port06:39
jamhttp://stackoverflow.com/questions/775638/using-so-reuseaddr-what-happens-to-previously-open-socket06:39
jamrogpeppe: probably06:40
jamI know you can bind them to the same port by doing fork magic06:40
rogpeppejam: you mean by inheriting the fd?06:40
jamrogpeppe: right. it is how apache used to do it with their forking daemons.06:40
jamone of the subprocesses "wins" the Accept request06:41
rogpeppejam: that's kind of a different thing - it's just sharing the already bound socket06:41
jamrogpeppe: though to be fair, I don't have high expectations that it is actually the bug you are seeing.06:41
jamrogpeppe: but I *have* been seeing a lot of zombie mongodb's this week.06:41
rogpeppejam: i went through a rash of "cannot bind to port" problems last week06:41
jamrogpeppe: "SO_REUSEPORT... allows you to bind an arbitrary number of sockets to exactly the same source address and port as long as all prior bound sockets also had SO_REUSEPORT"06:43
* rogpeppe didn't know about REUSEPORT06:43
jambut it looks like it may be a BSD flag06:43
rogpeppejam: but i don't think that helps us06:43
rogpeppejam: even if it was available06:44
rogpeppejam: because mongod won't be using that flag06:44
jamrogpeppe: "Linux 3.9 added the option SO_REUSEPORT to Linux as well"06:44
jamrogpeppe: it does06:44
jambecause *we* use that flag06:44
jamand then the next person can bind without the flag06:44
jamat least from what I read06:44
jamI could be wrong06:44
rogpeppejam: i slightly doubt it. let's check, one mo06:45
jamrogpeppe: the wording is a bit funny, so no guarantees06:45
jamalso, I think precise is older than kernel 3.906:45
rogpeppejam: the wording sounds to me as if all binders to the port must use that option06:45
rogpeppejam: otherwise it's really quite dangerous06:45
rogpeppejam: because i might wish to bind a server to a port, but because the previous server on that port has used REUSEPORT, it allows us anyway, and then we get two different servers randomly sharing the same network address06:46
rogpeppejam: there's another possibility which won't rule out the failure but will make it more obvious what's happening06:47
rogpeppejam: which is to get the API server to send back the env UUID and have the client check that06:48
rogpeppejam: then at least we will definitively know when we're talking to an unexpected server06:48
jamrogpeppe: except we've already gotten rejected by that point haven't we? Or are you saying we send it before login?06:50
rogpeppejam: we'd need to make it available even to non-logged-in clients though, and i'm not sure if that would be judged to be an unwanted information leak06:51
jamhaven't we validated the cert by this point?06:51
rogpeppejam: yeah, we have validated the cert, yes06:51
rogpeppejam: and the cert is randomly generated, so actually that's a good point06:51
rogpeppejam: and i *think* we use a secure mongo connection even in tests06:53
rogpeppejam: no, i don't think it can be a duplicate mongo problem06:55
jamrogpeppe: I know that if you have a mongo that doesn't support TLS the test suite dies in horrible ways06:55
rogpeppehrmph, well it's managed to merge noe06:58
rogpeppenow06:58
rogpeppethat failure does concern me though. wtf can be going on, when we've got two concurrent sessions connected to the same API port, the second of which fails logging in with exactly the same creds as the first succeeded with?07:00
rogpeppefwereade_: i just noticed this comment of yours: "07:05
rogpeppeNever use conn.Environ if you can possibly help it. It's basically never up to07:05
rogpeppedate.07:05
rogpeppe"07:05
rogpeppefwereade_: what does it mean for an Environ to be "up to date"?07:05
rogpeppefwereade_: ah, you mean that it might have out of date config attrs?07:06
jamrogpeppe: he means that conn.Environ is read from local disk, but the source of truth is actually conn.State.Environ07:09
jamor whatever the actual request is07:09
jamrogpeppe: which is why for the CLI API stuff we went away from using APIConn and are trying to get away with just api.Client07:10
rogpeppejam: yeah07:10
rogpeppejam: (well, that's not the only reason for avoiding client use of Environ)07:10
jamrogpeppe:  this one also failed earlier today, and left a mongodb running: https://code.launchpad.net/~allenap/juju-core/makefile-stuff/+merge/18111307:11
jama Watcher didn't err when it exited07:11
jamI don't know why07:11
jamI'm concerned we introduced some race conditions recently without realizing it.07:11
jamOr the bot is just on a VM that is having neighbor issues, which triggers these less frequent problems.07:11
rogpeppejam: interesting, that also died in TestManageStateServesAPI07:14
rogpeppejam: (the same place i saw the problem)07:14
jamrogpeppe: I don't quite see that in the 500 line panic, but I trust you did07:15
jamand yes, we might just have a flakey test, that when it fails might leave a mongodb running.07:15
rogpeppejam: (to find which test is running, search for .Test in the stack trace07:16
rogpeppe)07:16
rogpeppejam: even if we have moribund mongodb's, that shouldn't be a problem AFAICS07:16
jamrogpeppe: I'm saying the test is *causing* moribound mongodb's not that it is affected by them.07:17
rogpeppejam: ah, right, yeah07:17
jam(test suite teardown is known to fail to tear down the mongodb it started)07:17
rogpeppejam: it probably happens when a goroutine panics without a recover07:17
rogpeppejam: (that happened in this case)07:18
jamrogpeppe: I thought gocheck recovered from all panics in order to catch them cleanly and report errors from test cases ?07:21
jamis this happening in a TearDownSuite or something where it isn't being caught?07:21
rogpeppejam: it can't recover from panics in goroutines that it didn't start07:21
jamrogpeppe: ah, even if it starts the one that started it07:22
rogpeppejam: which is true in this case - the panic is in a watcher goroutine07:22
rogpeppejam: yes - you can't catch panics from many goroutines at once - that would be nastily asynchronous07:22
rogpeppejam: the usual solution is to put some cleanup code outside the main executable07:23
axwwallyworld_: I came up with a better approach to the JSON problem. It's now very similar to how it was originally, but without the float problem07:27
wallyworld_great :-)07:28
axwand with no runtime callstack crap07:28
wallyworld_hooray, i'll take a look in a bit07:28
rogpeppejam: i've found how that panic can happen, i think07:29
=== thumper-dinner is now known as thumper
TheMuerogpeppe: you've once discussed https://bugs.launchpad.net/juju-core/+bug/1202163 with hazmat07:54
_mup_Bug #1202163: openstack provider should have config option to ignore invalid certs <papercut> <juju-core:Triaged by themue> <https://launchpad.net/bugs/1202163>07:54
mgzokay, nearly reboot for meeting time07:54
mgzTheMue: I'm probably the best person to ask about that bug07:54
TheMuerogpeppe: could you give me a hint where this change has to be done07:54
TheMuemgz: ok, so we'll continue after the meeting, thanks07:55
TheMuemgz: that you can reboot now ;)07:55
rogpeppeTheMue: it's probably something that needs a change in goose too07:55
rogpeppeTheMue: basically we need some way to tell goose that it should ignore unknown certs07:56
rogpeppeTheMue: within goose, it would need to set the TLS config on the https request that it makes to have InsecureSkipVerify=true07:56
TheMuerogpeppe: ah, this makes it more clear. already looked in our code as a first step, but not goose07:57
rogpeppeTheMue: cool07:58
mgzTheMue: posted a comment in the bug08:01
TheMuemgz: thx08:03
thumperdavecheney: coming to the meeting?08:04
=== thumper is now known as thumper-afk
* fwereade_ goes to get breakfast08:43
jamrogpeppe: you mention that you might have a solution for the TestManageStateServesAPI bug?08:44
rogpeppejam: for the panic(no error) problem anyway, i think, yes08:44
jamfwereade_: what did you decide on: https://code.launchpad.net/~fwereade/juju-core/prepare-leave-scope/+merge/18106508:45
jamthe thread went long, and sort of ended on "maybe this is or isn't correct"08:45
rogpeppejam: i believe it's because the underlying State is being closed, which causes the state.Watcher to be stopped and return without an error08:46
rogpeppes/state\.Watcher/watcher.Watcher/08:46
jamrogpeppe: so still just a race condition, right?08:46
rogpeppejam: not really08:46
jamas in we expect the Watchers to be closed first08:46
jambut in this case the State got closed.08:46
jamrogpeppe: given it doesn't always fail it is clearly *some* sort of race condition :)08:47
rogpeppejam: hmm, there's definitely some racing involved, yes08:47
rogpeppejam: but i think it's wrong that the state watchers assume that because the underlying state has been closed they can panic08:48
rogpeppejam: you're probably right that the watchers should probably be closed nicely before the state is closed08:48
jamrogpeppe: so I think the MustErr thing is because in production they want to expect that if they are shutting down, there is a reason for it.08:49
jamrogpeppe: But I find it very strange to panic when you *don't* have an error :)08:49
jamrogpeppe: there *might* be a case where we purposefully trigger something like that during upgrade to force the process to restart, but I'm not 100% sure how all that ties together.08:50
rogpeppejam: the usual reason for MustErr is that if you're the code solely in control of a watcher, you *know* that it can't have been stopped by something else08:50
rogpeppejam: so if it dies without an error there's something weird enough going on to warrant a panic08:50
jamfwereade_: thinking of upgrading. You had a comment about WatchAPIVersion (I think) being unhappy before we've gotten our env credentials set up. Is it just that you don't want that API call to return until we're ready to handle FindTools requests, or ?08:50
rogpeppejam, fwereade_: FWIW i don't think it's a good idea to make that call block indefinitely until there's a valid environ config08:51
rogpeppejam, fwereade_: because that could take forever and there's no way of interrupting that call once it's in progress08:52
rogpeppefwereade_:08:53
rogpeppejam, fwereade_: although having said that, i'm not sure i can think of a better alternative08:53
jamrogpeppe: well, avoiding panic will be a good first step towards figuring out what is going wrong. :)08:54
rogpeppejam: indeed08:54
jamrogpeppe: because I think fwereade_ said jpds managed to get 'juju status' to run and either we still have the log-replay bug, *or* it was still failing on something.08:55
jamI was very surprised to see the err was a "schema.error_" which sounds like it is coming from somewhere else.08:55
rogpeppejam: that panic should have been fixed by the recent ServerError change08:56
rogpeppejam: that error comes when a schema doesn't match08:56
fwereade_jam, it's Tools in particular08:59
fwereade_jam, rogpeppe: I am relatively unbothered by blocking forever there08:59
fwereade_jam, rogpeppe: and using the environ in the first place is somewhat suboptimal08:59
rogpeppefwereade_: yeah, i was just wondering about that - we're only using for agent-version, right?09:00
rogpeppes/using/using it/09:00
fwereade_jam, rogpeppe: so at some point it will wither away regardless, in favour of a cache of simplestreams data09:00
jamfwereade_: as in, WatchAPIVersion runs, finds stuff, and then we call FindTools but that blocks until we have creds?09:00
fwereade_rogpeppe, nope09:00
fwereade_rogpeppe, it's FindExactTools that's the problem09:00
fwereade_rogpeppe, I'm 80% sure that we manage to extract agent-version, for the watcher, without creating an environ09:01
fwereade_jam, yeah09:01
rogpeppefwereade_: oh, of course09:01
rogpeppefwereade_: i think i agree that we can block forever - it doesn't mean we can't still respond the Upgrader.Kill, as long as we run the Tools call in a new goroutine09:02
rogpeppes/respond the/respond to/09:02
jamfwereade_: well one option would be to add one more api which is "State.DesiredAgentVersion()" rather than having it always be Tools with the URL to get the new tools.09:03
jamfwereade_: because then it will go quiescent without having to search the provider.09:03
fwereade_rogpeppe, WaitForEnviron requires a done chan orsomething already iirc09:03
jamfwereade_: the change that worker/upgrader/upgrader.go did09:03
jamis that on startup for every agent it must go scan the bucket09:03
fwereade_jam, what's the utility there?09:03
rogpeppefwereade_: but we're talking server side here, right?09:03
jamI believe we did it that way because it seemed silly to do 2 api requests09:04
jambut given that 1 is expensive (must read the provider buckets)09:04
jamand one is cheap (just from the db)09:04
jammaybe it is worth splitting up09:04
fwereade_jam, istm that it just complicates things without delivering any benefits?09:04
jamfwereade_: it very specifically moves us closer to how we used to do it, and would avoid this bug09:05
jamfwereade_: as the Upgrader would say "what version do you want me to be at?" and the response would match currentTools.version and we would go back to waiting on a change09:05
jamfwereade_: and we don't need provider creds to get that answer.09:05
jamrogpeppe: we got Unauthed access again: https://code.launchpad.net/~thumper/juju-core/container-address/+merge/18227109:06
jammgz: it has already been approved, but if you could look over https://code.launchpad.net/~thumper/juju-core/container-address/+merge/182271 to see how it fits with your Addresses stuff.09:07
rogpeppejam: that is *so weird*09:07
fwereade_jam, ah, ok... maybe that leads to a nicer server-side implementation too?09:07
jamrogpeppe: I agree, it is clearly a test that is an issue09:07
jamfwereade_: it splits the bits nicely09:07
jamfwereade_: and is probably really easy to implement09:07
fwereade_jam, ok, consider it blessed, thanks :)09:08
jamfwereade_: do we have a bug about failing during startup in 1.13.x ?09:08
mgzjam: is this the one I read through the other day, looking...09:11
jamfwereade_: also, this probably only happens when you are using a private bucket that requires creds.09:11
jammgz: if you read thumper's MP you didn't respond to it09:11
jamfwereade_: it also means that we don't scan the provider every time *anything* in environconfig changes09:12
jamsince we don't have smarts about just noticing api version changes yet09:13
rogpeppejam: i'm not sure i see how DesiredAgentVersion would help09:16
rogpeppejam: we'd still need to wait for the environment config to be valid, wouldn't we?09:16
mgzjam: right, didn't comment, still not completely sure on the implications (but as a hack, it seemed fine)09:17
rogpeppeafk09:22
jamrogpeppe: we write AgentVersion into the environment config during bootstrap. We don't yet have *provider* (eg EC2/MaaS/Openstack) credentials.09:35
jamrogpeppe: the existing Tools() api requires searching the provider.Storage for the binary that matches the desired version09:35
jamrogpeppe: because it returns the URL to download those tools.09:35
jamwhich is a problem during bootstrap because we don't actually have the credentials to search Storage yet.09:35
jamwell, "first boot"09:35
rogpeppejam: ah yes, of course09:40
rogpeppejam: i think that separating the API calls makes a lot of sense actually09:41
rogpeppejam: then the relationship between the version watcher and the API call we're making is obvious09:41
fwereade_jam, I'm feeling somewhat nauseous and it isn't going away, I'm going to lie down for a while10:19
jamfwereade_: shame, I'm just about to propose the fix. Feel better soon.10:20
rogpeppefwereade_: hope it *does* go away10:20
fwereade_jam, if I don't come back for the meetings please make my apologies10:20
fwereade_jam, I will surely at least manage some reviewing later today though10:20
fwereade_rogpeppe, cheers )10:21
jamdavecheney: if you are around, didn't you have a bug about seeing listing-the-storage-bucket over and over in the logs?10:22
jamI think my fix will also address that10:22
jamrogpeppe: if you have time https://codereview.appspot.com/13380043/10:25
* TheMue => lunchtime10:33
rogpeppejam: reviewed10:49
jamrogpeppe: so I was following the example of "tools.Tools" which returns a pointer rather than a struct.10:51
jamIs there a reason they should be different?10:51
rogpeppejam: just convention10:52
rogpeppejam: we always pass around *tools.Tools10:52
rogpeppejam: and version.Number10:52
rogpeppejam: if we want to change it, we should do it consistently across the code base10:53
jamrogpeppe: what about the API itself then? I think it was using *tools so that it just puts nil there when it say, has an error.10:53
jamit seems a little strange to serialize a bunch of 0's onto the wire when you have an error.10:53
rogpeppejam: omitempty might possibly work10:54
rogpeppejam: although it may not work on structs, come to think of it10:54
rogpeppejam: i don't mind if the serialisation struct uses a pointer, if that's what we need to lose it from the RPC resulyt10:55
mgzwhat is "empty" in the context of a struct... can you test for nilledness easily with go?10:56
mgzzeroedness actually I guess10:56
jammgz: foo == Foo{}10:56
rogpeppemgz: yeah10:56
rogpeppemgz: but it's not that easy to check for using reflection, so it's quite probably it doesn't do that10:56
rogpeppeprobable even10:57
mgzthat makes sense10:57
rogpeppemgz: yeah, it doesn't do that10:58
mgzjam: any ideas why sync-tools --source is trying to list tools before doing anything?11:06
mgz<http://paste.ubuntu.com/6039913/>11:06
mgzon canonistack, so may involve simplestreams...11:06
jammgz: as in why it would be listing ~/go/bin or listing something upsteram?11:06
jamit normally lists the target tools11:06
jamso it can find what tools need to be copied11:06
mgzit's trying to list a swift container. it should just splat up the local stuff, no?11:06
jammgz: not when you already have stuff11:07
jamit is "put stuff I don't have"11:07
jamnot "overwrite everything"11:07
jammgz: that way if I get interupted after copying 3 things, I don't start from scratch again.11:07
mgzbut... this is then a catch-22. have no tools, can't upload my local tools, because I have not tools?11:07
jamnot that it should fail if it can't find any target tools11:07
jammgz: I think you are misreading it. I think it is failing because it can't find any *source* tools to copy11:07
mgzjam: that dir certainly contains jujud11:08
mgzall: will miss standup, things to mention, filed a selection of goose bugs about issues related to rackspace11:09
mgzand er... I'm being prodded11:09
jammgz: tools are usually a foo-series-arch-number.tar.gz sort of thing11:11
arosalesjam, https://bugs.launchpad.net/juju-core/+bug/121676811:16
_mup_Bug #1216768: Azure provider: Authentication error when using public tools <juju-core:Fix Committed by axwalk> <https://launchpad.net/bugs/1216768>11:16
jamrogpeppe: https://plus.google.com/hangouts/_/f497381ca4d154890227b3b35a85a985b894b471 standup?11:32
arosalesjam, https://bugs.launchpad.net/juju-core/+bug/1218329 is the other Azure bug needed.11:49
_mup_Bug #1218329: Update default environment.yaml for Azure to use Precise for default-series <juju-core:New> <https://launchpad.net/bugs/1218329>11:49
arosalesjam what method would you suggest to test trunk with a public tools? sync-tools to upload the current trunk tools to a public bucket?11:50
jamarosales: you can create a different "public" bucket and sync-tools into it, I think.11:50
jamand then configure you environment to treat that as the actual public bucket.11:51
arosalesjam, ok I'll give that a try to day thanks.11:52
jamarosales: for bug #1218329 you've confirmed we can switch to precise? because it is pretty trivial to change that one line.11:52
_mup_Bug #1218329: Update default environment.yaml for Azure to use Precise for default-series <juju-core:New> <https://launchpad.net/bugs/1218329>11:52
arosalesjam, the other point I need to confirm is the image-stream.11:53
arosalesI need to confirm if we are calling the latest precise images with the fix as "released" or "daily" in simple streams and in Azure publication.11:53
arosalesjam, I also added a comment with that.11:53
jamrogpeppe: I think I responded to all of your requests: https://codereview.appspot.com/13380043/12:07
jamarosales: I won't be around tomorrow to make sure azure things are addressed before the cut of the release (usually happens on the weeked). You can probably poke some of the people who are in Europe during your morning (mgz, fwereade_, allenap come to mind)12:08
jamhey mramm, we didn't think we'd see you today12:09
mrammjam: I had the overnight flight to london12:09
mrammjust checking in at the hotel12:09
arosalesjam, I'll sync with davecheney and fwereade_  on it if a release is targetted this week12:09
jamarosales: I fully expect at least 1.13.3 to be out this weekend. And we'd like to release it, test it, and possible directly upgrade it to 1.1412:12
arosalesjam, ok, and if a stable release causes a lot of pain and you just go with devel just let me know, for azure documentation set up purposes.12:14
rogpeppejam: reviewed12:18
TheMuejam: due to doc sprint tomorrow and now having discovered that it's a deeper goose change too i would like to see lp:1202163 reassigned to one of the goose team. what do you say?12:40
rogpeppejam, fwereade_: state.RelationUnitsWatcher doesn't seem to have any tests at all. do you know what's going on there?12:42
rogpeppehmm, looks like it was deleted in https://codereview.appspot.com/7198051/12:50
rogpeppehttps://bugs.launchpad.net/juju-core/+bug/121836212:54
_mup_Bug #1218362: state.RelationUnitWatcher is not tested <tech-debt> <juju-core:New> <https://launchpad.net/bugs/1218362>12:54
* rogpeppe just ran the coverage test tool for the first time13:36
rogpeppeit works well13:36
natefinchnice13:36
rogpeppe85% coverage of the state package13:36
natefinchhey, 85% is really good13:36
rogpeppenatefinch: it would be 86.9% if we actually tested RelationUnitWatcher13:36
rogpeppeaw, "cannot use test profile flag with multiple packages"13:37
natefinchrogpeppe: heh. I don't put a ton of stock in coverage, since covered doesn't necessarily mean tested... but not covered is definitely not tested13:37
rogpeppenatefinch: that's my thought13:37
rogpeppenatefinch: i was wondering about things that would have made it obvious that we'd lost test coverage13:38
natefinchrogpeppe: so, only 15% definitely not tested, and 85% that is at least exercised, so that's pretty great13:38
rogpeppenatefinch: (as happened in this CL in january: https://codereview.appspot.com/7198051/ )13:38
natefinchrogpeppe: yeah, detecting when we lose coverage is a good idea13:39
rogpeppejam: if you're still around, this fixes the watcher panic: https://codereview.appspot.com/13386044/14:01
rogpeppefwereade_, natefinch, mgz: reviews appreciated14:01
* rogpeppe goes for some lunch14:02
natefinchrogpeppe: I'll take a look14:03
arosalesany juju core folks around to attend vUDS session: http://summit.ubuntu.com/uds-1308/meeting/21899/servercloud-s-juju-new-user-ux/15:21
arosalesrogpeppe,  ^15:22
* arosales was going to bother fwereade but I don't see him online atm15:22
rogpeppearosales: he's sick atm, i think15:23
arosalesah, sorry to hear15:23
rogpeppearosales: what time zone is that time in?15:23
arosalesrogpeppe, utc15:23
arosalesso roughly in half hour15:23
rogpeppearosales: ok, i'll be there15:23
arosalesrogpeppe, much appreciated, thank you15:24
=== pepper_chico is now known as Vader
rogpeppearosales: do i have to register as attending to join?15:28
arosalesrogpeppe, I don't think so15:28
arosalesrogpeppe, I'll post the hangout url in the channel here in a bit, and we can take it from there.15:28
rogpeppearosales: ah, it's a hangout - i was wondering where the video was15:29
rogpeppearosales: thanks15:29
arosalesrogpeppe, yup live hangout, but I haven't started it just yet15:30
=== Vader is now known as pepper_chico
arosalesstill have about 20 minutes15:30
rogpeppenatefinch: i've addressed your concerns, i hope: https://codereview.appspot.com/1338604415:47
rogpeppenatefinch: or replied, at any rate :-)15:48
natefinchrogpeppe: cool, I'll take a look.  Would like someone more familiar with the problem to give it the lgtm if possible, though15:57
rogpeppenatefinch: yeah, i guess i'll have to wait until tomorrow unless mgz or jam are around15:58
mgzthe watcher change makes some sense to me, but I'm not sure we have more qualified than rog on the problem :)16:00
mgzwhat's the implication of a one-value return from a channel, rather than the `, ok` form?16:01
natefinchrogpeppe: it sorta bugs me that Watcher is an interface without a Watch() method :p16:09
rogpeppeplease think of a better name!16:09
rogpeppenatefinch: ^16:09
natefinchrogpeppe: I would almost call it Stopper or Ender... it's the  Changes() method that really makes a watcher a watcher16:12
rogpeppenatefinch: i originally thought about Worker16:14
natefinchrogpeppe: yeah, I was thinking something like that originally16:14
natefincharosales: you should email the team ahead of time so we can plan on being around for these meetings :)16:16
arosalesnatefinch, you guys didn't know about vUDS?16:17
arosalesnatefinch, but noted I don't think I included juju-core folks in my uds reminders16:18
natefincharosales: reminders are much appreciated :) Also, I'm new, so I might not know things I'm supposed to know :)16:18
arosalesnatefinch, for sure you get a pass :-)16:18
arosalesbut these other veterans  . . . .16:19
arosalesnatefinch, but I agree with you on reminders. I'll note for next time bother the juju-core folks :-)16:19
weblifeJuan Negron in here?17:39
* rogpeppe has reached eod18:27
rogpeppeg'night all18:27
=== thumper-afk is now known as thumper
thumpermorning folks21:31
=== marrusl is now known as marrusl_afk
=== marrusl_afk is now known as marrusl
* thumper is at that WTF moment debugging23:18
* thumper grunts...23:24
thumperfound the source of my confusion23:37
thumpersimplified to this:23:37
thumper    c.Assert(obtained, gc.DeepEquals, expected)23:37
thumper... obtained []uint8 = []byte{}23:37
thumper... expected []uint8 = []byte{}23:37
thumperbigjools: the magic of gocheck  :)23:39
* thumper fixes 23:39
bigjoolsthumper: wtf23:40
thumperbigjools: I know, right?23:40
thumperhad me scratching my head for quite a while23:40
bigjoolswhat is it hiding?23:40
thumperit is outputting something incorrectly23:40
thumperhere are the two lines prior23:40
thumperobtained := []byte{}23:41
thumpervar expected []byte23:41
thumperobtained is an empty slice23:41
thumperexpected is a nil slice23:41
davecheneythumper: we need a SliceEquals checker23:45
thumperwhat is shown here is just a part of the problem23:45
thumperI'm checking an entire structure23:45
thumperusing deep equals23:45
thumperthe slice is just one part23:45
thumpera key part of the problem is that it isn't showing []byte{nil}23:47
thumperwhich is what *should* be shown for a nil slicke23:47
thumperslice23:47
thumperthat would have made the problem completely obvious23:47
thumperinstead of hiding it23:47
thumperoh...23:48
thumpercheck this out:23:48
thumperhttp://play.golang.org/p/LRDkBszMNa23:48
thumpervs http://play.golang.org/p/iO2wpSUxeO23:48
thumpera nil string slice is output as []string(nil), but a nil byte slice is shown as []byte{}23:49
thumperhowever, a nil byte slice does not equal an empty byte slice23:49
thumperdavecheney: go bug?23:50
davecheneynope23:53
* bigjools boggles23:54
thumperdavecheney: why?23:56
davecheneyotp23:56

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