[00:34] davecheney: hmm, went to the gym before the LGTM [00:36] shit happens [00:44] davecheney: changes being proposed now if you want to LGTM the actual review... [00:44] davecheney: just give it a minute [00:45] changes look good, i trust ya [00:45] it was only nit picking stuff [00:45] davecheney: so submitting now should pick the right reviewers? [00:45] davecheney: one time before it failed to do so [00:45] and had "R=" in the commit message [00:45] thumper: looks like that thing is unreliable [00:45] i don't think anyone cares [00:45] or looks [00:45] or both [00:45] * thumper cares [00:45] kinda [00:45] that makes one then [00:46] * thumper does the switch to trunk, merge and run tests prior to submitting [00:46] :) [00:47] thumper: so you switch to trunk then merge your branch before pushing ? [00:47] i do the other way around [00:47] i merge trunk into my branch, test, then push if it passes [00:48] if I switch to trunk then merge it, and it works, it is all good [00:48] then I revert, and switch and submit [00:48] kinda the same [00:48] horses for courses [00:48] but my way avoids bringing in the extra merge [00:48] meh, that isn't the slow part [00:48] heh, no [00:49] davecheney: if you have time, i'd love to chat about the upgrade process [00:49] as in 'juju upgrade' [00:49] do you know much about it? [00:49] a little, dating back to august last year (2nd lisbon sprint) [00:49] i don't think much has changed since then [00:50] want me to grab moi headset ? [00:51] sure, 5 min? [00:51] as in, in 5 min? [00:51] kk [00:54] hangout? [00:58] sure [00:58] lemmie try [02:25] thumper: davecheney: want the easiest review ever? +1/0 https://codereview.appspot.com/8064043 [03:44] wallyworld: for your patch, the idea is that we should retry only for IsNotFound errors, but exit on everything else? [03:44] jam: yes [03:44] that's how ec2 does it too [03:44] wallyworld: I would probably find it easier to read with inverted if logic [03:45] if !errors.IsNotFound(err) { return err} [03:45] otherwise LGTM [03:45] ok, i copied the logic style used by ec2 for consistency [03:45] wallyworld: yeah, but consistency with *cough* is not necessarily worth keeping. [03:45] sure :-) [03:46] i would be happy if you wanted to tweak the ec2 side as well [03:46] will do [03:46] jam: i reworked the debug log branch also, as per william's review, less code now [03:49] wallyworld: to make sure I understand: https://codereview.appspot.com/7749048/patch/6001/7004 [03:49] that change is because you can't use the nil constructor [03:49] because 'sshCmd' is an interface. [03:49] so it doesn't know which one to do. [03:49] The only thing I might say is "could we just check for nil?" [03:49] jam: go doesn't allow default values in struct definitions sadly [03:50] so Init does something like "if s.sshCmd == nil {sshCmd = XXX}" [03:50] wallyworld: right, but you set it in Init if it isn't set yet. [03:50] jam: i did that, but SetFlags() is called before init, so the nil check needed to go there, hence i aborted that way of doing it because it wasn't obvious to the reader where the nil check needed to go [03:50] anyway, I'm not to unhappy with just specifying it at register. [03:51] wallyworld: yeah, I wondered about that. SetFlags vs Init... good enough for me. [03:51] ie the expected place Init() wasn't the right place at all [03:51] so best to be explicit [03:51] you could hide it under a method call [03:51] DebugLogCommand.sshCmd() which would do it. [03:51] i could, but then debug log would be the only command with a New() [03:51] but yeah [03:52] hmm, i could have used a method like you suggest [03:52] wallyworld: I was meaning a method on DebugLogCommand. But it is a fair amount of *stuff* just to avoid setting it for registration. [03:52] wallyworld: so certainly, think about it, if you like it more than what you have you can change it, but it seems very much 6-of-one half-dozen of another. [03:53] Neither is clearly better. [03:53] yeah, agreed [03:53] it's landed now, so not really worth changing unless really needed [03:55] wallyworld: anything left on your plate that hasn't landed? [03:55] wallyworld: and did you get a chance to look at sync-log? [03:56] jam: writing tests for the invalid region stuff. will propose soon [03:56] remind me, what was sync-log again? [04:02] wallyworld: sorry not sync-log, sync-tools [04:02] I was mixing my work with yours [04:02] it is "get the official posted binaries, upload them to my local space" [04:04] jam: ah, balls, i haven't looked yet. sorry. will do it now. i was going to do it before you came on line and clearly i didn't expect you to log on till later :-) [04:04] wallyworld: I'm not officially here for another hour at least [04:05] that's what i thought :-) [05:32] jam: i made the change to that branch without first seeing your comment. you happy with my version? [05:32] wallyworld: change to which branch? [05:32] sorry, the retries one [05:33] https://codereview.appspot.com/8064043/ [05:34] wallyworld: yeah, break is fine vs return [05:34] cool, landing now [05:34] i've pushed my other branch with the error messages, so might even get to land it tonight [06:41] jam: i thought about the \n, but the common convention *seems* to be just a long string. i'll tweak it and see how it turns out [06:41] wallyworld: I like the amount of context, but it is a little hard to read [06:41] our error formatting putting in a bunch of "caused-by" doesn't help either. [06:41] wallyworld: as for convention, the convertion isn't to give super-helpful error messages with info for the user, either. [06:41] jam: i agree that it's hard to read for sure [06:42] so I feel comfortable breaking convention here :) [06:42] jam: caused by messages should all come after a \n imho [06:43] wallyworld: yeah, I'd probably agree with that [06:43] but i'll just do this one thing perhaps so i can land it before i go [06:43] wallyworld: it isn't a blocker, your patch is better in than out, etc. [06:43] but if you can tweak it, I think we can make it better. [06:43] that's what she said [06:44] wallyworld: I'm pretty sure that is "in and out" . [06:44] lol [06:45] * wallyworld biab [07:37] morning all [07:40] dimitern: hiya [07:41] rogpeppe: yo [07:46] *: morning [07:55] * thumper is back [07:56] can someone send me the HO link? [08:01] i found it [09:07] fwereade_: I'm looking for something next week... [09:07] fwereade_: how about I take https://bugs.launchpad.net/juju-core/+bug/1131608 [09:07] <_mup_> Bug #1131608: deployed series is arbitrary < https://launchpad.net/bugs/1131608 > [09:07] thumper, hum, ok, let me think a sec -- and I *think* you've actually basically fixed that one [09:08] thumper, modulo openstack [09:08] fwereade_: in fact, part 3 of that bug solution is done [09:08] fwereade_: ok, I'll let you think on it [09:08] fwereade_: and pick something on Tuesday next week [09:08] thumper, yeah, I did 1 and 2, you did 3 [09:08] Monday is a public holiday here too [09:08] thumper, I do have an idea [09:08] fwereade_: feel free to email me :) [09:08] * thumper is off now [09:08] thumper, which is to look into the cards surrounding machine status and reporting back of provisioning errors [09:08] 10 pm before 4 days off \o/ [09:08] thumper, but I shall mail you [09:09] thumper, enjoy your holiday :) [09:09] fwereade_: awesome, ta [09:10] fwereade_: so now upgrade-charm is done (up to py-juju parity) what next? [09:10] fwereade_: or can just pick some other card [09:10] dimitern, it is probably best to pick some other card [09:11] dimitern, trying to swarm is probably a good idea [09:11] dimitern, since you have picked up some experience with state [09:11] ok, any ideas where? [09:11] dimitern, I might lean towards the "add machine status field" [09:11] dimitern, which is in blue's TODO [09:11] i'll take a look [09:13] fwereade_: i'd appreciate it if you could take a look at the Relation embedded in Endpoint CL at some point, please. i *think* it worked out pretty well, but YMMV. https://codereview.appspot.com/8055044/ [09:14] rogpeppe, sweet, I will take a look [10:24] fwereade: ping [10:24] fwereade: " [10:24] Not sure what the distinction is between Limit and Optional -- they're equally [10:25] ignored AFAICT, so we should probably include both or neither. [10:25] " [10:25] fwereade: we do include both AFAICS [10:27] rogpeppe, ah, sorry, let me reread [10:28] rogpeppe, yep, I'm an idiot, please disregard [10:28] fwereade: np [10:28] fwereade: what are the possible machine statuses? are they basically the same as machine agent statuses (as with unit statuses)? [10:36] dimitern, hum, not necessarily [10:36] dimitern, I don't think "installed" is meaningful [10:36] dimitern, all the others might be [10:40] fwereade: ok, thanks [10:40] fwereade: so this comment is wrong? // UnitStatus represents the status of the unit agent. [10:45] dimitern, well -- there is a fuzzy distinction between the "unit" and the "unit agent" [10:46] dimitern, and there's an additional complication in that agent presence is conflated with unit status (see Unit.Status) [10:46] fwereade: so it's better to say "UnitStatus represents the status of a unit." and similarly for a machine status [10:46] dimitern, yeah, sgtm [10:47] dimitern, btw, since you're hitting that [10:47] fwereade: and specific status value have a relation to the agent? cf. UnitStarted UnitStatus = "started" // Agent is running properly [10:47] dimitern, it would prbably be valuable, as a first step, to move the "down" stuff out of Unit.Status and put it in cmd/juju/status instead [10:47] dimitern, not really [10:48] dimitern, "Agent is running properly" applied to every status except pending and down [10:48] dimitern, and down isn't really a status [10:48] fwereade: i'm thinking of moving all of unit status in state/status.go [10:49] dimitern, no firm opinion either way on that, follow your heart :) [10:49] fwereade: cheers [10:49] fwereade: and istm i'll just s/agent/unit in those comments [11:10] lunchtime [11:18] niemeyer: blog.labix.org is currently offline [11:18] jam: I noticed.. great timing [11:18] jam: The whole server is down an inaccessible [11:18] that's a hosted site/ [11:19] ? [11:19] jam: Yeah, dreamhost [11:19] Already filed a support request [11:23] niemeyer: its back up [11:23] jam: Phew [11:24] jam: I'll wait a bit until making it public, to make sure it won't happen again [11:32] wallyworld: are you aronud for standup? [11:40] mgz: https://codereview.appspot.com/8051043/ [11:41] ta [11:43] fwereade: " [11:43] Let's keep that terminology out of charm, I think it's only meaningful at [11:43] runtime. [11:43] " [11:43] fwereade: we already use the term "endpoint" in the RelationScope type doc [11:43] fwereade: should i remove it from there too? [11:43] rogpeppe, good point -- yes, I think so [11:44] rogpeppe, does that make it unpleasant? [11:44] fwereade: i'm don't *think* so. [11:45] rogpeppe, cool, thanks [11:45] fwereade: if we think of a "relation" as a single-ended thing [11:45] fwereade: it's a pity we don't have two terms for "one end of a relation" and "the relation that joins these things together" [11:46] rogpeppe, agreed, but the terminology seems to be reasonably well bedded in already [11:46] rogpeppe, without too much confusion, hopefully [11:47] fwereade: yeah [11:47] fwereade: certainly in charm, there's no concept of the double-ended relation anyway [11:47] rogpeppe, yeah, indeed === benji___ is now known as benji [12:31] fwereade: here's some preliminary work to make state/watcher amenable to a faster sync cycle: https://codereview.appspot.com/8078043/ [12:39] dimitern: jam: https://codereview.appspot.com/8079043 [12:39] sorry i missed the suggestions the first time [12:43] wallyworld: no worries, it looks much better now - LGTM [12:44] thanks [12:44] fwereade: ping [12:44] thanks, i must have been smoking my crack pipe to have missed it, sorry [12:44] ;) [12:48] wallyworld: reviewed [12:48] thanks, looking [12:50] jam: my point with using %s instead of %q was that ["compute, object-store"] looks uglier than [compute, object-store], and esp. [... one of these regions may be suitable instead: "reg1, reg2, reg3"] (ILTM as the region name suggested is "reg1, reg2, reg3" [12:51] jam: the wrapping with the error you pasted into the code review - i don't get that in my terminal [12:51] i get [12:51] error: failed to GET object provider-state from container juju-50548874395ac32d8896f65ab33f3e17 [12:51] caused by: cannot create service URLs [12:51] caused by: the configured region "region-a.geo-1" does not allow access to all required services, namely: compute, object-store [12:51] access to these services is missing: compute [12:51] one of these regions may be suitable instead: az-1.region-a.geo-1, az-2.region-a.geo-1, az-3.region-a.geo-1 [12:51] wallyworld: that specific wrapping was probably codereview: http://paste.ubuntu.com/5655074/ [12:51] right [12:52] which is why it is 'uneven' [12:52] Not worth worrying about. [12:52] yeah. at least each caused by is on a new line etc, so it's not tooooo hard to read [12:52] better than a long string [12:52] certainly [12:52] just not 'ideal' [12:52] but good enough for now, I believe [12:53] certainly better than what it is replacing === teknico is now known as teknico_away [12:53] yep [12:53] and quite helpful [12:54] let's see what users think :-) [12:56] * rogpeppe struggles with the crackful WatchUnits tests [13:06] dimitern: so, it appears that goamz.S3 requires an aws.Auth, and it *always* signs the request, even when your key is "". And that, in turn, is rejected by Amazon, even though the bucket is public (auth is checked first0. [13:06] so I'm thinking just to add a way to supply ec2 creds, even though we "shouldn't" need them. [13:07] jam: it looks like a bug in goamz [13:07] dimitern: well, it is something to fix in the whole stack, which seems out of scope for the benefit. [13:07] jam: but maybe it's worth a bug report at least to keep it in mind [13:07] as you have to have a way to get creds to accept not having auth entries [13:19] rogpeppe: I believe you can land: https://codereview.appspot.com/7925045/ [13:19] jam: i believe you might be right [13:19] I was going to LGTM, but its already been done [13:23] rogpeppe: it seems like you might get the framing wrong if you don't disconnect. Is there an advantage of leaving the connection open? https://codereview.appspot.com/7518052/ [13:23] it seems like while there might be a small one, it shouldn't be "normal operation" to get UnexpectedEOF [13:24] jam: yeah, i should probably not return nil on UnexpectedEOF actually [13:24] jam: the advantage of leaving the connection open is that the client gets some feedback on what went wrong. [13:25] rogpeppe: can we write the response and then disconnect? [13:25] jam: in the actual api, ReadRequestBody does not actually read anything [13:25] I do think we want to respond [13:25] I agree we want to respond [13:25] My concern is just that if we get a partial read, then we might not know where the next message starts [13:25] jam: i'm wondering about allowing the codec to return a special error code that signifies it's not a terminal error [13:26] jam: we shouldn't get an error on a partial read [13:26] rogpeppe: isn't that UnexpectedEOF? [13:26] jam: in the UnexpectedEOF case, we do bomb out [13:27] jam: the issue is other requests that may or may not signify a terminal error [13:28] jam: the thing is that the codec *knows* whether it's a recoverable error or not [13:28] jam: and when it is, i'd prefer not to drop the connection [13:28] rogpeppe: sure [13:29] jam: (this was a request from the GUI team, BTW) [13:29] properly formed messages (even when they are telling you "I can't do that") don't have to close the conn [13:29] jam: the problem is that a message can be syntactically correct (e,g. well-formed JSON) but have some problem with the param types (e.g. null instead of string) [13:30] rogpeppe: sure. My concern is specifically about malformed messages, which seemed EOF related. [13:30] jam: the behaviour at EOF and UnexpectedEOF is still pretty much what it was [13:31] jam: i'm more concerned about issues like spurious closing braces [13:31] rogpeppe: well, I'd be fine closing a conn if you had a spurious closing brace. [13:31] If you're sending stuff that badly formatted, you can connect again. [13:32] jam: yeah, but this change might make it so that doesn't happen [13:32] jam: *if* ReadRequestBody actually read some data [13:32] jam: (which it doesn't, except in the rpc tests) [13:33] jam: my thought is that if such a thing happens, and the connection really is borked, then the next read-header will deal with the issue [13:34] rogpeppe: as long as it doesn't become some sort of security hole (user-data getting interpreted as request data, etc) but I think the change is fine. [13:34] jam: i can't currently see any problem with doing that [13:34] Just having the conversation about it. [13:34] jam: yeah, it's a good conversation to have [13:34] jam: i'm glad you brought it up, because it's the central possible issue in this change [13:35] jam: if the user data could force a syntax error in the framing data, then i think the client is broken. [13:37] rogpeppe: sure, though you can always have a custom client that lets you send broken requests. [13:37] HTTP apis aren't sacred :) [13:37] anyway, [13:37] that is a bit remote [13:38] jam: that's true, but if that's true, then they can make up requests as they need - no need to leverage this method of getting user data to be interpreted as request data [13:38] yeah [13:38] s/that's true/they want to/ [13:38] second one [13:38] anybody seen "Modifiers and non-modifiers cannot be mixed" from mgo? tried searching whole or parts of it in all go code, including mgo, but couldn't find anything [13:39] dimitern: sounds like it might be an error from mongod itself [13:39] dimitern: yeah: ./src/mongo/db/ops/update.cpp:40 [13:39] rogpeppe: yeah, seems so. hmm weird.. [13:40] omg c++ [13:41] dimitern: http://paste.ubuntu.com/5655182/ [13:41] dimitern: "e.eoo()" ?! [13:41] rogpeppe: what's e.eoo() ? [13:41] :) [13:42] dimitern: my question exactly [13:42] dimitern: EOO == "end of object", i think [13:43] dimitern: ah, you're mixing "$x" with "x" [13:43] dimitern: the crucial bit is: e.fieldName()[ 0 ] != '$' [13:43] rogpeppe: I can't see how.. I dumped the doc and the key and there's no $ anywhere [13:44] dimitern: have you dumped the entire mongo op? [13:45] rogpeppe: doing it now [13:46] >>>> trying to set status of "u#wordpress/0" to &state.unitStatusDoc{Status:"error", StatusInfo:"test-hook failed"}; txn.Op{C:"statuses", Id:"u#wordpress/0", Assert:"d+", Insert:interface {}(nil), Update:(*state.unitStatusDoc)(0xf8401dd720), Remove:false} [13:46] that's what I have printed just before [13:49] rogpeppe: can I somehow get a log of what mongo is receiving? [13:50] dimitern: i'd probably put a printf somewhere in mgo [13:50] rogpeppe: good idea [13:50] dimitern: are you getting this when running a transaction? [13:50] rogpeppe: yes [13:50] rogpeppe: insert is fine, update fails [13:51] rogpeppe: in the same collection [13:51] dimitern: what does the dump of the whole transaction ops look like? [13:51] rogpeppe: I haven't changed anything else, just added a single op to an exiting transaction [13:51] dimitern: sure, but i'd still like to see it [13:52] rogpeppe: just a sec [13:54] rogpeppe: http://paste.ubuntu.com/5655208/ [13:55] dimitern: looks fishy to me [13:55] dimitern: what's that Name:"$ne" doing in there? [13:55] rogpeppe: I think I start to get it - Update: someinterface is not the same as wrapping it up in a D{{...}} [13:56] rogpeppe: that's notDeadDoc assert [13:56] rogpeppe: ah! [13:56] rogpeppe: got it [13:56] dimitern: cool [13:56] dimitern: see, told you it was worth dumping in total :-) [13:56] rogpeppe: or maybe not.. === wedgwood_away is now known as wedgwood [13:58] rogpeppe: so it used to be {C:u.st.units.Name, Id: u.doc.Name, Assert: notDeadDoc, Update: D{{"status", "somestatus"}}} and I removed the update but wanted to keep the assert [13:58] dimitern: there's still an Update in there [13:58] dimitern: which looks possibly bogus [13:58] rogpeppe: yeah, but the status is moved into a separate collection where's the update now [13:59] dimitern: all the other Update instances have D{{...}} but this just has a unitStatusDoc [13:59] rogpeppe: well, unitStatusDoc is interface{} to the setStatusOp (opaque) [14:00] rogpeppe: and I need to insert/update whatever's there [14:00] rogpeppe: should I wrap it up in a D{{something}}? [14:00] dimitern: what's the type of unitStatusDoc ? [14:01] rogpeppe: unitStatusDoc is the type - struct {Status, StatusInfo string} [14:01] dimitern: BTW, i recommend dumping with spew.Dump - it formats it nicely and shows all depths [14:01] dimitern: that doesn't look like something you can pass directly to Update [14:02] rogpeppe: actually no, there are 2 doc types: unitStatusDoc and machineStatusDoc - both have 2 fields (+ the implicit _id) and one has Status UnitStatus, the other Status MachineStatus (both are type *Status string) [14:02] dimitern: i think perhaps you want D{{"$set", unitStatusDoc}} [14:03] rogpeppe: ah, ok I'll try this 10x [14:04] rogpeppe: it worked! tyvm [14:32] fwereade: ping [14:42] fwereade: I prefer not to change annotations and constraints in this CL to use the globalKeyer, if you don't mind [14:44] and there it is - https://codereview.appspot.com/8087043/ [15:21] dimitern, heyhey [15:22] fwereade: hey, it's basically done - not sure about machine status logic; can you take a look please? [15:22] fwereade: all tests pass, it seems none of the uniter ones depend on unit changes on status [15:23] dimitern, there are a few things to talk about, not necessarily line-focused; might make sense to do so in a hangout? [15:23] fwereade: sure, I'll start one [15:24] fwereade: https://plus.google.com/hangouts/_/555b884bebd0c196b62a3b05ec40cb1ba95a5c19?authuser=0&hl=en [15:34] Can I request another reviewer for https://codereview.appspot.com/8018043/ ? It's big, but mostly just a name refactor. [16:05] Makyo: is it possible to split it into *just* a name refactor and then another patch for logic changes, that is usually a lot easier to review, though I'll still give this one a look if you want [16:06] otherwise each line I have to read carefully to see if there is more than just a mechanical change [16:07] though to be fair, everything so far has been only mechanical renames [16:09] jam, not easily, but yes, it's at least 95% mechanical, with the only logic changes being to get rid of entityNamer/namedEntity interfaces in state tests, as those are now available through the Tagger interface in state/state.go [16:09] Makyo: can you point out the specific files, so I can be careful when looking at them [16:09] state/state.go and state/?_test.go ? [16:10] jam, yes, let me see if I can narrow it down further. [16:10] Makyo: so one place here: https://codereview.appspot.com/8018043/patch/12001/13026 [16:10] you rename entityId => tag [16:10] where everything else was "entityName" [16:10] is Id something different? [16:10] jam, no, same as entityName [16:12] Makyo: so I think you mean here: https://codereview.appspot.com/8018043/patch/12001/13030 [16:13] where you got rid of the namedEntity interface [16:13] for a public state.Tagger interfac [16:13] (presumably providing the logically same interface) [16:13] jam, state/assign_test.go, state/apiserver/api_test.go, state/state_test.go [16:13] jam, yep. [16:20] reviewed [16:20] jam, Thank you :) [17:18] gosh that was a hard bug to find [18:11] eod. am off now. happy weekends all. see y'all on tuesday. === wedgwood is now known as wedgwood_away