/srv/irclogs.ubuntu.com/2012/05/25/#juju-dev.txt

davecheneyniemeyer: new revision of SetConfig incoming00:34
davecheneyyou may want to see more caching00:34
davecheneyniemeyer: ready for review, https://codereview.appspot.com/622904600:41
niemeyerdavecheney: Review on first one delivered01:16
niemeyerdavecheney: "Patch set 8 incorporates https://codereview.appspot.com/6244053."01:17
niemeyerdavecheney: I guess it shouldn't?  Otherwise what's the point of having the other CL?01:17
davecheneyniemeyer: that was a cryptic way of saying i rolled that change up into setconfig01:17
davecheneybut given your comments on the makeBucket branhc01:17
davecheneythat will turn out to be a bigger piece of work01:18
niemeyerdavecheney: The comment remains.. what's the point of having a second CL if it's included in another one01:18
davecheneyi'm finding it hard to manage branches that have multiple parents01:18
davecheneyin the future I won't merge the like patch #801:19
davecheneyi'll wait til the upstream passes review01:19
niemeyerdavecheney: Ideally things are either independent, or you use -pre-req01:19
niemeyerdavecheney: Yeah, that's a good plan in general01:19
davecheneyso, talking about https://codereview.appspot.com/6244053 for a second01:19
davecheneyyou belive this is a bug introduced recently01:20
davecheney?01:20
niemeyerOk01:20
niemeyerdavecheney: Yeah, definitely.. this logic was worked on by rog last week or so01:20
davecheneyah, ok01:20
davecheneyi'll review the commit history and try a different approach01:20
davecheneyi'll put SetConfig back into WIP01:21
niemeyerdavecheney: I'm having a look at it just now01:21
davecheneyif you could give it a cursory view that would be good01:21
niemeyerdavecheney: I'm a bit unhappy with the strategy that is spreading through there01:22
niemeyerreturn &storage{bucket: e.s3().Bucket(config.bucket)}01:22
niemeyerdavecheney: This is creating a storage+S3+bucket every single time we need to use the bucket01:22
niemeyerdavecheney: Imagine what happens in a trivial loop like this:01:23
niemeyerfor {01:23
niemeyer    ... whatever ...01:23
davecheneyyup, understood01:23
niemeyer    environ.PutFile(file)01:23
niemeyerdavecheney: *tons* of garbage01:23
davecheneyI am not overly concerned with performance at this stage01:23
davecheneyas this is talking to a network service01:24
davecheneybut I will add caching01:24
niemeyerdavecheney: For no great reason.. we got into this situation after trying to avoid the caching, which wasn't a big deal at all01:24
davecheneyunderstood01:24
niemeyerdavecheney: I'm not *concerned* either01:24
niemeyerdavecheney: I just feel bad that we're giving up on both simplicity *and* performance at the same time01:25
davecheneyi'm trying for something that is correct with respect to SetConfig01:25
davecheneyi hope that caching could be added later01:25
davecheneygoing back to makeBucket for a second, 'cos that is now a blocker01:25
davecheneyI can't see there the bug was introduced01:25
davecheneynot in the last week at least01:25
niemeyerdavecheney: THe makeBucket issue was created while avoiding the caching as well01:26
niemeyerdavecheney: Well, some of the issues, maybe not makeBucket01:26
niemeyerdavecheney: The race from the last review, for example01:26
davecheneyniemeyer: i'm concerned that making the environs reloadable is becoming a blocker01:28
davecheneyI understand it is important for the final product01:29
davecheneybut would it be possible to propose a provisioning agent that doesn't reload it's configuration after starting01:29
niemeyerdavecheney: No, we have spent a lot of time on this, let's not throw all the work and discussion now that it's pretty much done01:30
niemeyerdavecheney: Hindsight is good, but let's not ignore what was done now that we have it01:30
davecheneyi am concerned that the adding reloadability to environs is a moving target01:31
davecheneyi'm wondering if it would be better to address then after we have a PA that we can use to bring up a trial juju on ec201:32
niemeyerdavecheney: It wasn't a moving target.. I suggested not changing caching, for example, because it worked, and then you found it a better approach.. that broke things further.. and that had to be fixed.. and ...01:32
davecheneyexactly01:32
davecheneyso lets put all that to once side01:32
davecheneyone side01:32
niemeyerdavecheney: Yeah, let's *fix the problems* and not change further01:32
niemeyerdavecheney: If you're feeling overwhelmed, I can do that myself01:32
davecheneyniemeyer: not overwhelmed, just concerned that all the changes that the PA needs to environs/Environ keeps pushing back the PA itself01:33
niemeyerdavecheney: Yeah, so ignore the madeBucket stuff, if that's what you mean01:33
niemeyerdavecheney: Just drop it, and we'll put on someone else's todo list01:33
niemeyerdavecheney: That sounds fine01:34
davecheneyi'm suggesting a middle ground of delivering a PA that doesnt' try to respond to changes in /environment, so has no requirement for Environ.SetConfig01:34
niemeyerdavecheney: But I do want to see caching added back, and all that extra stuff removed01:34
niemeyerdavecheney: Because that's part of the "never ending roll"01:34
davecheneyniemeyer: yes, i want to get out of this spiral01:35
davecheneyand I can do that if the PA can skip having to reload it's environ once it's up and running01:35
davecheneythen when the rest of the PA is working01:35
niemeyerdavecheney: Again, you spent days on this, and I spend hours reviewing it.. I'm not happy with trashing both your and my time01:35
davecheneyreloading environ configs can be tackled as seperate branch01:35
davecheneyi'm not saying throw it awwy01:35
davecheneyjust put it on hold for a while01:35
niemeyerdavecheney: That doesn't work.. if it stays out, it will be broken next week01:36
niemeyerdavecheney: Let's fix it, and move on01:36
davecheneyok, understood01:36
niemeyerdavecheney: Happy to drop make/madeBucket, though01:37
niemeyerdavecheney: Didn't happen in this branch..01:37
davecheneyok, so to review, I will continue to work on SetConfig. I will restore all the cached values like ec3Unlocked and friends01:41
davecheneyand makes changes to environ.config atomic with changes to {public,}storage.bucket01:41
davecheney/s/ec3/ec2/01:42
niemeyerdavecheney: Heh, madeBucket was born broken01:42
davecheneyniemeyer: thought so01:42
niemeyerdavecheney: Sorry about that01:42
niemeyerdavecheney: I suspect the second problem is a NOOP once you deal with the first01:43
niemeyerdavecheney: You got into the second issue because replacing the bucket was done with s3(), which needed a lock01:43
niemeyerdavecheney: Once you have the cached values, it's all done within the lock01:43
davecheneyyup, that'll work01:43
davecheneyseriously, i should stop listening to roger's advice01:44
davecheneythat was his suggestion :)01:44
davecheneyanwywya, i have to go01:44
niemeyerLOL01:44
niemeyerRog have some great advices, though01:44
niemeyer''''''''''''''''has01:44
davecheneyi know, it's hard to sift one from the other01:44
davecheneyanyway, i have to go01:44
niemeyerdavecheney: Cheers01:44
davecheneywill submit another round tonihgt01:45
davecheneythank you for your time01:45
niemeyerdavecheney: My pleasure01:48
andrewsmedinaniemeyer: are you working 24/7 ?01:50
andrewsmedina:-p01:50
niemeyerandrewsmedina: Nah.. :-)01:51
andrewsmedina:D01:52
andrewsmedinaniemeyer: I submitted a new proposal01:52
niemeyerandrewsmedina: Thanks!01:52
niemeyerandrewsmedina: This was probably the last one.. with those minors, it should be good to go in01:52
andrewsmedinaniemeyer: thanks :D01:54
andrewsmedinaniemeyer: Rodrigo Senra will be here tomorrow01:54
niemeyerandrewsmedina: Wow, really?02:30
niemeyerandrewsmedina: This is awesome.. small world02:31
niemeyerandrewsmedina: Please deliver him a hug from me :)02:31
andrewsmedinaniemeyer: ok, I will02:32
niemeyerandrewsmedina: aaaaand your branhc is going in02:32
andrewsmedinaniemeyer: nice!02:32
andrewsmedinaniemeyer: thanks02:32
niemeyerandrewsmedina: Thank *you* for keeping up with it02:32
andrewsmedinaniemeyer: now I will work on local provider environ interface =D02:33
niemeyerandrewsmedina: Sweeeeet02:33
niemeyerandrewsmedina: Small increments is the key02:34
niemeyerandrewsmedina: Don't feel bad to push half baked stuff02:34
niemeyerandrewsmedina: As long as it's a correct step forward, it's fine to go in02:34
niemeyerandrewsmedina: E.g. a type that implements all interface methods returning errors in all of them is a correct step forward02:34
niemeyerandrewsmedina: the implementation of a single one of these methods is a correct step forward to02:35
niemeyertoo02:35
niemeyererror: Failed to load data for branch bzr+ssh://bazaar.launchpad.net/~andrewsmedina/juju/go-local-network/: Get https://api.launchpad.net/devel/branches?ws.op=getByUrl&url=bzr%2Bssh%3A%2F%2Fbazaar.launchpad.net%2F~andrewsmedina%2Fjuju%2Fgo-local-network%2F: dial tcp 91.189.89.224:443: connection timed out02:35
niemeyererror: Failed to load data for bran02:35
niemeyerAh, dave isn't here02:35
andrewsmedinaniemeyer: Why this error??02:36
niemeyerandrewsmedina: NEvermind.. I was going to point to Dave that it wasn't just on him that it was blowing up :)02:36
andrewsmedinaniemeyer: I will sent small proposes02:36
niemeyerandrewsmedina: Cheers!02:37
niemeyerandrewsmedina: It's in!02:44
niemeyerand the queue is zeroed!02:45
niemeyerAh, the feeling of mission accomplished.. well, at least for a few hours.02:45
niemeyerWill take the chance to have a nice sleep02:45
niemeyerNight all!02:45
andrewsmedinaniemeyer: good night!02:45
davecheneyrogpeppe: whoop whoop!09:05
rogpeppedavecheney: haroo!09:06
fwereadedavecheney, rogpeppe: heyhey09:08
rogpeppefwereade: yo!09:08
fwereadedavecheney, btw, what awful time of day is it for you?09:08
davecheneyfwereade: 7pm09:09
davecheneyrogpeppe: this is what i'm thinking http://paste.ubuntu.com/1006126/09:09
fwereadedavecheney, ok, not so awful then :)09:09
rogpeppefwereade: you might want to fix this bug BTW: cmd/jujuc/server/util_test.go:37: not enough arguments in call to st.AddCharm09:09
davecheneynot aweful at all09:09
fwereaderogpeppe, oof, thanks09:09
davecheneys/awe/aw/g09:10
rogpeppedavecheney: that won't work, sadly09:10
davecheneypoop, why not09:10
rogpeppedavecheney: look at the implementation of deleteAll09:10
* davecheney looks09:10
rogpeppedavecheney: it wouldn't be good to have the bucket changing underfoot during the execution of that method09:10
rogpeppedavecheney: hence my "immutable" suggestion.09:11
rogpeppedavecheney: i thought that's what you meant when you said it was "a bit harder" BTW09:12
davecheneyrogpeppe: good point, but consider why the bucket would be changing09:12
rogpeppedavecheney: if we change the bucket, does it make sense to have an ongoing delete method suddenly start to remove objects that were listed in one bucket from another bucket?09:12
* davecheney thinks09:13
rogpeppedavecheney: i think that an "immutable" method gives a nice understandable semantic - if you've started an operation with one set of settings, it will complete with the same.09:13
davecheneyrogpeppe: if only it were that easy, for environ.SetConfig doesn't create a new storage, but alters it's bucket value09:14
davecheneyhowever, that can be fixed09:15
rogpeppedavecheney: that's fine, i hadn't intended that it did09:15
fwereaderogpeppe, trivial: http://paste.ubuntu.com/1006133/09:15
rogpeppedavecheney: did you look at my immutable method?09:15
davecheneyyup, you look to be taking another reference to the *storage09:15
rogpeppefwereade: oh cool, i thought maybe it needed a real sha hash09:15
fwereaderogpeppe, it may do at some stage09:16
rogpeppedavecheney: no, i'm copying the contents of the storage.09:16
fwereaderogpeppe, but we're not at that stage yet :)09:16
rogpeppedavecheney: well, the contents of the storage struct anyway09:16
* davecheney reads again09:16
davecheney7~oooooooooh09:17
davecheneywow, i never considered that09:17
davecheneymainly 'cos i've never used a lanugage that could do that09:17
rogpeppedavecheney: it does mean we've got another allocation each time, but i think that's irrelevant, as mentioned earlier09:18
davecheneyi agree about allocations09:18
davecheneyi don't think allocation counting is important when we're talking to a slow arse ec2 provisioning service09:18
rogpeppedavecheney: and actually i think probably the compiler can tell that the value never escapes, so it might not even do one.09:19
rogpeppedavecheney: absolutely09:19
rogpeppedavecheney: particular when PutReader allocates 1700 times!09:19
rogpeppes/ar/arly09:19
davecheneyyeah, but gustavo had a point that I was touching too much code09:21
davecheneyrogpeppe: what if the exported Storage/PublicStorage methods always returned an immutable *storage ?09:22
davecheneythen DeleteAll would just work09:22
fwereaderogpeppe, btw, can I just submit that directly please?09:24
davecheneyhmm, that might need a little more finesse, deleteAll isn't part of the public Storage API09:24
rogpeppefwereade:  i think you should make a CL, i'll LGTM it and you submit it immediately. that way the commit log looks consistent.09:24
fwereaderogpeppe, SGTM09:25
rogpeppedavecheney: i don't think that would work09:25
davecheneyrogpeppe: would you say that deleteAll is the exception that breaks the rule09:25
rogpeppedavecheney: because there's nothing stopping someone holding on to a Storage object, but i guess we want it to change when the settings change.09:25
rogpeppedavecheney: ... or maybe not. i wonder.09:25
davecheneyrogpeppe: there are arguments for an against09:26
fwereaderogpeppe, https://codereview.appspot.com/624305409:26
rogpeppefwereade: you've checked that all tests pass?09:27
fwereaderogpeppe, heh, I'll do a full run through09:27
rogpeppefwereade: i think it's worth it :-)09:27
davecheneyrogpeppe: which do you think gustavo had in mind ?09:27
fwereaderogpeppe, quite so :)09:27
rogpeppedavecheney: i dunno. as you say, arguments for and against.09:28
davecheneyif we call Environ.SetConfig, should that apply to any Storage that was requested, or should the Storage you previously asked for remain valid ?09:28
davecheneygiven that the reason for calling SetConfig is most likely to update some credentials09:28
rogpeppedavecheney: exactly. that's the question09:28
davecheneyit's likely that your previous Storage would be inoperable09:28
fwereaderogpeppe, huh, strange things are going on elsewhere; I'll poke around and see if I can figure out what's up09:29
davecheneyactually, SetConfig can _only_ change credentials, or the bucket09:29
davecheneyas those are the only configuration values consumed09:29
rogpeppedavecheney: if we're changing credentials, to avoid screwing things up, we'll have to change the credentials *before* deprecating the old credentials09:31
davecheneyrogpeppe: how about this, SetConfig never changes the value of storage.bucket, that is immutable once created09:31
rogpeppedavecheney: that won't work if we want a Storage to work long term09:32
davecheneyit simply replaces (and safely publishes) new storage and publicStorage references09:32
davecheneyright, so then the opposite is the better chioce09:32
davecheneythe mutex guards storage.bucket, and changes to that are visible immediately09:32
rogpeppedavecheney: i think the crux is deleteAll - do we treat that as an "external" method, so the bucket can change underfoot as it's progressing?09:37
rogpeppedavecheney: what i'm concerned about is someone changing not just the security credentials (but leaving them pointing to the same original AWS account) but the name of the bucket too.09:38
rogpeppes/(but /c/(/09:38
davecheneyso, what if I implement 'immutable' inside deleteAll, as it is the special case09:39
davecheneyor at least use it in just the deleteAll case09:39
rogpeppedavecheney: tbh i think we might be better for all concerned if we make storage not change with SetConfig09:39
davecheneyrogpeppe: i would be more than happy with that09:40
rogpeppedavecheney: and we can document that SetConfig works only on the Environ and not on storage objects returned from it09:40
davecheneywhat is your feeling about gustavo's view on this ?09:40
rogpeppedavecheney: then anything that calls Storage gets a nice coherent view09:40
rogpeppedavecheney: i *think* he'd be ok with that.09:40
davecheneyi've seen you raise the point a few times09:40
rogpeppedavecheney: i have mixed feelings - there are trade-offs all over09:41
TheMuemorning09:41
rogpeppedavecheney: but my current feeling is that this is the sweet spot09:41
davecheneyhey09:41
rogpeppeTheMue: hiya!09:41
davecheneyrogpeppe: i'm happy to float that09:41
davecheneyrogpeppe: in your extimation, who are these long term holders of Storage references ?09:41
rogpeppedavecheney: i don't think there are any09:42
rogpeppedavecheney: that's the reason for my current thoughts09:42
davecheneyrogpeppe: then why suggest that storages' not change with SetCOnfig ?09:45
rogpeppedavecheney: because even though there are no long term holders of Storage references, there will be *concurrent* holders of Storage references09:46
rogpeppedavecheney: so we can provide them with a coherent view09:46
rogpeppedavecheney: by letting each call to Storage return a new *storage instance.09:46
davecheneyrogpeppe: yup, i'd support that09:47
rogpeppedavecheney: in fact it's easier than that09:47
rogpeppedavecheney: we just alloc a new storage on each SetConfig09:47
rogpeppedavecheney: and return that from Storage09:48
rogpeppedavecheney: easy peasy09:48
rogpeppedavecheney: (changing the type of the storage field in environ to be a pointer, of course)09:48
rogpeppedavecheney: then the current storage implementation stays identical to current.09:49
davecheneylet rogpeppe it's slightly less easy, 'cos we have to publish that reference properly09:49
rogpeppedoh, s/identical to current/the same/09:49
rogpeppedavecheney: that reference is inside the environ instance, no?09:49
davecheneyi'd vote for constructing a new storage for each call to environ.Storage() using the current values of config()09:49
rogpeppedavecheney: i don't think there's a need to publish it09:50
rogpeppedavecheney: we will get the new instance when we call Storage again09:50
davecheneypublish across goroutines09:50
rogpeppedavecheney: why do we need to do that?09:50
rogpeppedavecheney: we've said that there are no long-term users of Storage instances, right?09:50
rogpeppedavecheney: which means that when the current storage operations are complete, the goroutines will call Storage again and get the new version.09:51
rogpeppedavecheney: there, published.09:51
davecheneyif goroutine X calls SetCOnfig, we need a mutex to ensure the value of environ.storage is properly published09:51
rogpeppedavecheney: yeah, obviously we still need the mutex on the environ09:51
rogpeppedavecheney:  but we make sure that any Storage returned from Environ is immutable.09:52
davecheneyrogpeppe: yup, i can do that09:58
rogpeppedavecheney: it's important, then, that environ doesn't call deleteAll directly on the storage instance inside the environ. it should call Storage() first, and then cast .(*storage).09:59
davecheneyi'll add a comment block if appropraite10:02
davecheneyrogpeppe: this it looking like a much smaller diff10:23
davecheneystorage.go is almost untouched10:23
rogpeppedavecheney: that's what i hoped10:23
davecheney# launchpad.net/juju/go/environs/ec2_test10:24
davecheney./live_test.go:281: undefined: "launchpad.net/juju/go/environs/ec2".DeleteStorageContent10:24
davecheneyo_O10:24
davecheneythis is against trunk10:24
davecheneylet me check I haven't delted that by accident10:24
rogpeppedavecheney: trunk works for me10:25
davecheneyignore that error, ny fault10:25
davecheneymy fault10:25
TheMue*rofl*10:25
fwereaderogpeppe, ok, I just plain cannot figure out what is up with the store tests... I think I've nuked everything and started perfectly clean, and I still get 1 pass, 2 fixture panic, 25 missed10:42
fwereaderogpeppe, have you seen this before?10:42
rogpeppefwereade: yeah, i see it every so often. i'll try again and see if i can reproduce it10:42
davecheneyrogpeppe: https://codereview.appspot.com/6256050, tell me what you think10:48
davecheneyspecifically around immutable storages10:49
rogpeppedavecheney: LGTM10:54
rogpeppedavecheney: and i think this shows the goodness of the approach actually10:54
davecheneyi'm relieved that storage.go is virtually unaffected10:54
rogpeppedavecheney: it means that we can still continue to use environs.EmptyStorage when there's no public storage10:54
rogpeppedavecheney: otherwise that wouldn't work.10:54
davecheneycoolcoolcool10:55
davecheneyso, from the POV of someone who wrote Storage, are you happy with the tradeoffs there ?10:55
davecheneyie, Storage() gives you an immutable reference10:55
rogpeppedavecheney: yeah, i think this works nicely10:55
rogpeppedavecheney: it means that someone external can write the equivalent of deleteAll without worrying about things changing underfoot10:56
davecheneyrogpeppe: the only time I had to step outside the API was in instance.Destroy, but it was only two lines10:56
* rogpeppe didn't notice that. one mo, while i look.10:56
rogpeppedavecheney: oh, you mean e.Storage().(*storage) ?10:57
davecheneyyup10:57
davecheneye.Storage() gives you your own reference, the cast it too (*storage)10:57
rogpeppedavecheney: yeah, i think that's inevitable, unless we provide a Destroy method on environs.Storage10:58
davecheneythis is just so you go through the mutex to get the properly published reference to environ.storageUnlocked10:59
rogpeppedavecheney: because the bucket's existence isn't something dealt with in the storage API10:59
rogpeppedavecheney: exactly; i think i mentioned this case above.10:59
rogpeppe[11:00:00] <rogpeppe> davecheney: it's important, then, that environ doesn't call deleteAll directly on the storage instance inside the environ. it should call Storage() first, and then cast .(*storage).10:59
davecheneyjynx10:59
davecheneyi'll fix the typos11:00
davecheneywhoa, how did that change to storage slip into NewConfig11:02
davecheneyright - time for a break, and probably a scotch11:12
fwereaderogpeppe, after much messing around it appears that the only thing that makes any difference is adding a ludicrously long sleep after starting the server in MgoSuite12:30
fwereaderogpeppe, by "ludicrously", I mean that sometimes 10s isn't long enough but it hasn't yet failed with 20s12:30
rogpeppefwereade: hmm.12:30
rogpeppefwereade: how is it failing again?12:31
fwereaderogpeppe, failing to dial12:31
hazmatfwereade, the server hasn't started?12:31
fwereaderogpeppe, no reachable servers12:31
fwereadehazmat, yeah12:31
rogpeppefwereade: maybe the dial should retry?12:31
fwereaderogpeppe, reading the docs it appears it should anyway12:32
fwereaderogpeppe, I'll try DialWithTimeout again (10s is usual I think; I tried 20s, but I should probably try 30s to match the always-succeed-with-sleep rate)12:32
rogpeppefwereade: sounds like a plan12:33
rogpeppefwereade: what is it with these servers that forever to come up?12:33
fwereaderogpeppe, I have no idea, I really wasn't expecting that12:34
fwereaderogpeppe, I've spent all morning poking around at entirely unrelated things :/12:34
rogpeppefwereade: i know the feeling!12:34
rogpeppefwereade: hmm, having fixed the bug in madeBucket, one of my old tests fails. it *should* fail given the new semantics, but i'm not sure now if they're right.12:35
fwereaderogpeppe, heh :(12:36
rogpeppefwereade: the test scenario is we have two Environs, both pointing to the same remote environ, e and e2; we do this: e.Bootstrap(); e2.Destroy(); e.Bootstrap()12:36
rogpeppefwereade: do we care about that working or not?12:37
fwereaderogpeppe, tbh that feels somewhat edgey to me12:37
rogpeppefwereade: me too. when are we ever gonna call Bootstrap twice on the same Environ, right?12:37
rogpeppeAram: yo!12:37
Aramhi.12:38
fwereaderogpeppe, indeed; if reported the response should probably be "don't do that please"12:38
rogpeppefwereade: yeah. i think i'll change the test.12:38
rogpeppefwereade: and perhaps the docs: "When Destroy has been called, all Environs referring to the same remote environment may become invalid", or something.12:40
fwereaderogpeppe, yeah, sounds pretty clear12:41
rogpeppefwereade: you gonna submit that AddCharm fix?12:43
fwereaderogpeppe, yeah, I got distracted with trying to make all tests pass :/12:45
fwereaderogpeppe, I'll submit that one separately right now12:45
rogpeppefwereade: there are still more that fail too. i get sporadic StateSuite.TestUnitWatchPorts failures.12:45
fwereaderogpeppe, I saw that one once, indeed12:45
rogpeppefwereade: i think TheMue has it in hand12:46
fwereaderogpeppe, cool12:46
TheMuerogpeppe, fwereade: Not yet really, only the idea of a race condition.12:47
TheMuerogpeppe: We talked about inserting a little sleep. But it could be a similar flaky behavior in production environment. So I've got to analyze your laste change deeper and how to avoid this behavior directly in the content watcher.12:50
rogpeppeTheMue: no need to insert a sleep.12:50
rogpeppeTheMue: i can see the problem, and i know the fix.12:50
TheMuerogpeppe: Oh, so feel free. I've got two branches in queue before.12:51
TheMuerogpeppe: What is your idea now?12:51
rogpeppeTheMue: i think! i haven't tested it yet, but i've just written the code (one line)12:51
TheMuerogpeppe: Small and beautiful ;)12:51
rogpeppeTheMue: insert a null op as the first test in unitWatchPortsTests12:52
rogpeppeTheMue: expecting an empty ports array12:52
TheMuerogpeppe: It's not only the port test.12:52
TheMuerogpeppe: There are more failing, all based on the content watcher.12:52
rogpeppeTheMue: the same would apply to any similar test12:52
TheMuerogpeppe: But so you fix the test, but not the nehavior.12:53
rogpeppeTheMue: the tests need to take account of the fact that the watcher *always* sends an initial value on the channel12:53
rogpeppeTheMue: i think that's reasonable behaviour12:53
rogpeppeTheMue: if we don't think that, then we can fix the behaviour12:53
TheMuerogpeppe: The idea of always sending is ok. But the fact, that we sometimes get errors and sometimes not.12:54
rogpeppeTheMue: but that behaviour was deliberately made that way; i don't mind if we change it to be different.12:54
rogpeppeTheMue: that's a bug in the tests.12:54
rogpeppeTheMue: they're creating the watcher and setting the content immediately after. there's a race there.12:54
TheMuerogpeppe: And what do you do when this happens in production?12:55
rogpeppeTheMue: there's no race unless you're trying to predict what the events are coming on to the channel, as the tests are.12:55
rogpeppeTheMue: each of those events is a valid representation of the contents at some point in the past.12:56
rogpeppeTheMue: and that's all we want from the contents watcher12:56
TheMuerogpeppe: I'll take a look at your change.12:56
rogpeppeTheMue: i'll push it in a mo12:57
TheMuefwereade: I've got to change the endpoint related methods to not separate between provider/requirer and peer. Instead I shall change it to …(endpoints …RelationEndpoint). OK, less functions, but more complex code imho.12:59
fwereadeTheMue, yeah, I think that's a shame, IMO it makes it much harder to see what's going on13:00
fwereadeTheMue, but hey ho13:00
fwereadeTheMue, sorry for the noise, I guess :(13:00
TheMuefwereade: np ;)13:01
rogpeppeTheMue: there's an issue with ResolvedWatcher13:08
rogpeppeTheMue: when the content is empty, parseResolvedMode fails.13:09
TheMuerogpeppe: Will have to look at the change history. IMHO I've tested it.13:09
rogpeppeTheMue: yes, but before we weren't seeing that initial blank value. i guess it's being created blank, but perhaps it should be created with a valid resolved content.13:10
rogpeppeTheMue: ah, no! i guess that it just didn't exist before.13:11
TheMuerogpeppe: Yep.13:11
rogpeppeTheMue: so the first value on the content-changed channel is "no node existing"13:11
rogpeppeTheMue: what should the value of "resolved" be then?13:12
rogpeppeTheMue: maybe it should just be ResolvedNone if there's no node.13:14
TheMuerogpeppe: Sorry, I'm in a totally different context currently. IMHO the resolve change is relative new even for the Python version. Maybe fwereade can help.13:15
TheMuerogpeppe: I have to take some to to see the change history here too and look why it now fails.13:17
TheMuesome time13:17
rogpeppeTheMue: i think it's quite straightforward - if you do WatchResolved on a unit without a resolved node, what should you read from the channel?13:18
rogpeppeTheMue: ah! the answer is there in Unit.Resolved13:19
rogpeppeTheMue: ResolvedNone is correct.13:19
TheMuerogpeppe: Didn't the original implementation did its first shot when the node is created, not before?13:20
rogpeppeTheMue: yes, but in keeping with the current thinking on watchers, we want to send the current state as the first event on the channel.13:21
rogpeppeTheMue: which in this case is ResolvedNone.13:22
TheMuerogpeppe: Yes, that's ok. But I'm a bit astonished that the change is in the code based but dependencies havn't been changed so far.13:23
TheMuecode base13:23
rogpeppeTheMue: which dependencies?13:23
TheMuerogpeppe: You now see several follow-up, like in the tests.13:24
rogpeppeTheMue: sorry, i don't understand13:24
TheMuerogpeppe: The checkin of the changed watcher has been too early. The same branch IMHO has to change the tests or the problem with the parseResolvedMode.13:25
rogpeppeTheMue: i haven't checked in anything13:25
rogpeppeTheMue: i'm fixing those problems currently.13:26
rogpeppeTheMue: and the fact that ChildWatcher doesn't always send a first event.13:26
TheMuerogpeppe: The behavior of the content watcher changed. That's what I'm talking about.13:27
rogpeppeTheMue: ah yes. that's true. the problem was that the tests usually passed!13:28
rogpeppeTheMue: so i'm fixing that now.13:28
TheMuerogpeppe: Yip, here we have to find a proper way, like a continous integration server running all tests after each submit.13:28
rogpeppeTheMue: i think it's fine. as niemeyer said recently, we just need to make sure we run the tests ourselves before submitting.13:29
rogpeppeTheMue: ok, i have all tests passing reliably (i think!) now.13:30
TheMuerogpeppe: Do you run all tests? Off each package?13:30
TheMuerogpeppe: Great, cheers.13:30
rogpeppeTheMue: just the state package currently.13:31
TheMuerogpeppe: The cheers is for the fixing. ;)13:31
TheMuerogpeppe: I would like some kind of running all (!) tests at least once per day.13:31
rogpeppeTheMue: i'm gonna fix the watcher tests too.13:31
rogpeppeTheMue: we all run the tests at least once a day, i hope!13:32
TheMuerogpeppe: Do you have a script for it or do you go into each package manually?13:32
rogpeppeTheMue: go test launchpad.net/juju/go/...13:33
rogpeppeTheMue: or just go test ./...13:33
rogpeppefrom the root of the go hierarchy13:33
TheMuerogpeppe: Oh, the elipses works? I didn't know, great, that helps a lot.13:33
rogpeppethe go tool is lovely like that13:33
TheMuerogpeppe: Wow, thx for that hint.13:33
rogpeppeTheMue: the ellipses are a wildcard - you can do go test .../state13:34
Aramrogpeppe: do you use bzr manually or do you use niemeyer's wrapper?13:34
rogpeppeor go install .../test/.../foo13:34
rogpeppeAram: i use niemeyer's cobzr wrapper13:34
Aramok, I'll look into it.13:34
rogpeppeAram: it makes the branches work well with $GOPATH13:34
rogpeppeAram: otherwise it's a right pain13:34
rogpeppeTheMue: https://codereview.appspot.com/624505313:44
TheMue*click*13:44
rogpeppeTheMue, fwereade: i'm going to be away for an hour or two soon.13:46
TheMuerogpeppe: OK13:46
fwereaderogpeppe, np, I'm finishing in a mo too13:46
fwereaderogpeppe, might manage to push a couple of CLs before I do13:47
rogpeppefwereade: cool. will have a look later.13:47
TheMueBtw, I've got a public holiday on Monday. So don't wonder if you don't reach me.13:47
rogpeppeTheMue: ah, ok. sometime we're going to have to try to do a meeting!13:48
rogpeppeTheMue: you know Aram is starting on monday, right?13:48
TheMuerogpeppe: Yep, good news. ;)13:48
rogpeppeTheMue: indeed. maybe we should have a meeting on tuesday?13:49
TheMuerogpeppe: Would be fine to me.13:49
rogpeppefwereade: ?13:49
rogpeppefwereade: i.e. would you be up for a meeting on tues?13:50
fwereaderogpeppe, tuesday would be fine13:50
rogpeppefwereade: probs around 8pm oz time13:50
fwereaderogpeppe, is there only one time zone there?13:50
rogpeppefwereade: which i think was what we agreed before13:50
rogpeppefwereade: no idea. i mean sydney time, of course.13:50
fwereaderogpeppe, ok, so my midday I guess; that sounds great13:52
rogpeppefwereade: not so good for niemeyer i think13:52
TheMuerogpeppe: Yep, midday is ok, lunch is later. :)13:52
rogpeppefwereade: maybe he should call the time.13:53
TheMuerogpeppe: It's 7:00 then for him.13:53
rogpeppeTheMue: exactly.13:53
rogpeppeTheMue: maybe 9pm and 8am might be better13:53
fwereaderogpeppe, TheMue: I'm easy, but as you say niemeyer should probably call it13:53
TheMuerogpeppe: Isn't he in UK next week?13:54
rogpeppeTheMue: that's true13:54
Aramwhat timezone is dave cheney in?13:54
rogpeppeAram: sydney, australia13:55
Aramah.13:55
TheMuerogpeppe: LGTM13:58
rogpeppeTheMue: thanks13:58
rogpeppeniemeyer: yo!13:59
Aramhi ni13:59
Aramniemeyer:13:59
niemeyerHello!13:59
rogpeppeniemeyer: you've arrived just as i'm leaving for a couple of hours13:59
rogpeppeniemeyer: got a couple more CLs for you to look at though. just bug fixes.13:59
niemeyerrogpeppe: Super14:00
niemeyerrogpeppe: Thanks14:00
TheMueniemeyer: Moin14:02
niemeyerHeya14:03
rogpeppesee y'all in a bit14:04
TheMueniemeyer: Just for info, the earring is back. ;)14:46
niemeyerTheMue: Hah, awesome :)14:46
TheMueniemeyer: One of the side jobs: plumber.14:47
niemeyerTheMue: Hehe, I know how it feels :)14:47
Arammeh, vmware website is getting worse every day.15:01
TheMueniemeyer: Could you please take a look at topology.py line 567 ff?15:02
niemeyerTheMue: Local or branch?15:03
TheMueniemeyer: Current trunk (python).15:03
niemeyerTheMue: Ah, .py15:03
TheMueniemeyer: There the interface of the actual relation in the loop is tested only against the interface of endpoint 0.15:04
niemeyerTheMue: There15:04
niemeyerTheMue: Ok15:04
niemeyerTheMue: ?15:04
TheMueniemeyer: When doing a test now with two endpoints with different interfaces, but the rest is ok, it seems to return a key instead of an error.15:05
TheMueniemeyer: Is that ok?15:05
niemeyerTheMue: How could this possibly happen?15:05
niemeyerTheMue: That would mean there's a relation with two different interfaces on it?15:06
TheMueniemeyer: No, adding is tested ok. But the user of the function may test two invalid endpoints (I've done so in my unit test, extra).15:06
TheMueniemeyer: IMHO a test that all passed endpoints share the same interface could be added.15:07
niemeyerTheMue: Yeah, that sounds fine15:08
TheMueniemeyer: OK, will add it, the rest of the new function RelationKey() has been changed according to your review. That's the last point.15:09
niemeyerTheMue: Super, thanks!15:09
TheMueniemeyer: For the NoRelationError string I've tried %+v, which is really good due to the field names, but long, and %v, which only shows the values of the endpoints. What do you prefer, short or long?15:10
niemeyerTheMue: Neither.. that's an error message.. should be oriented towards the user, not with types and debugging information15:11
niemeyerTheMue: An endpoint is uniquely identified by service name + relation name15:12
TheMueniemeyer: Hehe, that's why I wrote a RelationEndpoint.String() where you told me that it's not needed, instead %v.15:12
niemeyerTheMue: There can't be two different relations between two services with the same (service name, relation name) => (service name, relation name) characteristics15:13
niemeyerTheMue: Yeah, because you were *already* printing debugging information there15:13
niemeyerTheMue: In a way that is not understandable to a user nor to a developer15:13
TheMueniemeyer: OK, what about a method Id() string for RelationEndpoint returning exactly this with a colon?15:13
niemeyerTheMue: That's what I was against15:13
TheMueniemeyer: And I would use that id in the error generation.15:14
niemeyerTheMue: foo:bar:baz:baco:bar is not readable15:14
TheMueerror message15:14
niemeyerTheMue: Yeah, sounds fine in principle15:15
niemeyerTheMue: Not sure I have the whole picture right now, but we can try it15:15
niemeyerI'll head to lunch and be back in a bit15:16
TheMueniemeyer: The message would be like ("… between %q and %q", ep1.Id(), ep2.Id()) , where %q later is "wordpress:blog" etc.15:16
niemeyerTheMue: I suggest using String()16:03
niemeyerTheMue: So you can say between %s and %s16:03
niemeyer, ep1, ep2,16:03
=== wrtp is now known as rogpeppe
rogpeppeniemeyer, TheMue, fwereade: yo!16:08
niemeyerrogpeppe: Welcome back!16:10
* niemeyer sips a delicious post-lunch coffee16:10
rogpeppeniemeyer: looks out over the sunny Tyne river16:11
* rogpeppe looks out over the sunny Tyne river :)16:11
rogpeppei just took a little time to see a final year recital from a friend who's a folk degree students here. t'was amazing. now using the free wi-fi at the Sage, Gateshead.16:14
niemeyerrogpeppe: Where's that?16:14
rogpeppeniemeyer: http://en.wikipedia.org/wiki/The_Sage_Gateshead16:15
rogpeppeniemeyer: am currently sitting just inside the glass just above the smaller of the two boats you can see in that picture. and the sky is just as blue.16:16
rogpeppeniemeyer: it's a fantastic building16:16
rogpeppeniemeyer: have you got any suggestions for the best way to do the putFakeTools thing?16:25
niemeyerrogpeppe: Woah16:25
niemeyerrogpeppe: This is amazing16:25
rogpeppeniemeyer: what is?16:25
niemeyerrogpeppe: That building16:26
rogpeppeniemeyer: it certainly is16:26
rogpeppeniemeyer: although some have compared it to a sea slug :-)16:26
niemeyerrogpeppe: It reminds me of the rubber that protects a car's wheel transmission16:28
niemeyerrogpeppe: Has the same shape16:28
rogpeppe:-)16:28
niemeyerrogpeppe: But I digress wildly :)16:28
rogpeppeniemeyer: i'm sitting just near to where the woman on the left is in this picture: http://en.wikipedia.org/wiki/File:Newcastle_the_sage_innen.jpg16:28
niemeyerrogpeppe: Regarding the putFakeTools, if you want to keep the tools fake, sounds fine, but I still see that as a lot of logic for what is basically "List + Get"16:29
rogpeppeniemeyer: and that arc you can see outside above her head is also an amazing piece of engineering, the millenium bridge16:29
rogpeppeniemeyer: well, yes.16:29
rogpeppeniemeyer: i'm mildly inclined to export ToolsPath from environs16:29
niemeyerrogpeppe: Sounds sensible too16:29
rogpeppeniemeyer: which would simplify the logic a lot, but slightly clutter the public API for the sake of testing.16:30
rogpeppeniemeyer: which i don't like doing.16:30
niemeyerrogpeppe: I'd prefer that we had at least a couple of variables on it, to make it explicit what it is depending upon16:30
rogpeppeniemeyer: ? variables on what?16:31
niemeyerrogpeppe: environs.ToolsPath(version, arch, "12.04")16:31
rogpeppeniemeyer: definitely. i think that function already might exist.16:32
rogpeppeniemeyer: just not exported16:32
rogpeppe12.04 or precise? :-)16:32
rogpeppeniemeyer: BTW, i caught this piece of your conversation last night with davecheney: http://paste.ubuntu.com/1006651/16:33
rogpeppeniemeyer: i beg to disagree :)16:33
niemeyerrogpeppe: Yeah, good question, I kind of put the literal to talk about it :)16:33
rogpeppeniemeyer: do you have any idea how many allocations PutFile does?16:33
niemeyerrogpeppe: I don't, and I see no reason to increase it whatever that number looks like16:34
rogpeppeniemeyer: 178016:34
rogpeppemore than16:34
niemeyerrogpeppe: Nice, let's make it larger then! Not.16:34
rogpeppeniemeyer: 3 allocations is lost in the noise16:34
rogpeppeniemeyer: (literally - it's within the standard deviation)16:34
niemeyerrogpeppe: Yeah, sounds great. Let's do caching please, it's simpler.16:35
rogpeppeniemeyer: the code is more complex actually. i don't mind too much, but i just had to take a little issue with the reasoning.16:35
rogpeppeniemeyer: anyway, "precise" vs "12.04"16:36
niemeyerrogpeppe: No, it's not, and we don't have to discuss this because we have evidence.. two different bugs were already introduced on the way of removing caching..16:36
rogpeppeniemeyer: i like the former because it's obviously an ubuntu release name. i like the latter because it's more amenable to program manipulation.16:37
niemeyerrogpeppe: Well, let's have "precise" then.. it's already around the code base, and we can actually manipulate it too now that I think of it.16:38
niemeyerrogpeppe: Still curious about what happens after 'z', but I'm sure *some* form of the logic will remain16:38
rogpeppeniemeyer: yeah, i'm slightly concerned about that.16:38
rogpeppe(if the code's simpler, i'm all for it in general - it was just the "it allocates more therefore let's do it differently" reasoning i wasn't keen on.16:39
rogpeppe)16:39
niemeyerrogpeppe: If you read properly, you'll see in the context that this is just yet another argument among the others16:41
niemeyerrogpeppe: and that argument is *also* true.16:41
niemeyerfwereade: ping16:47
rogpeppeniemeyer: fair enough16:53
niemeyerfwereade, rogpeppe, TheMue, Aram: Folks, just as a reminder, next week I'll be in London16:55
rogpeppeniemeyer: do you think you'll be able to make a meeting on Tues?16:55
niemeyerI'm not sure about how the flow of the sprint will look like16:56
niemeyerBut I'll try to keep on top of reviews and communication as usual16:56
TheMueniemeyer: *envy*16:56
Arambtw niemeyer, do you think I'll be able to access the wiki by monday?16:56
AramI don't have permission right now :).16:56
niemeyerAram: I'm hoping so16:56
TheMueniemeyer: I only have been there on the airport so far. Would like to see more.16:56
niemeyerAram: There's a "nice" list of tasks for you to go through after starting16:56
niemeyerTheMue: I won't be able to see much more than the airport, and the office, I'm afraid :)16:57
niemeyerTheMue: Well, the office is still in a fantastic spot, though..16:57
niemeyerThat's changing soon unfortunately16:57
niemeyerAram: That said, hmm16:57
niemeyerAram: DOn't be super enthusiastic about it.. As far as juju goes, it's pretty much all public16:57
TheMueniemeyer: The new one seems to be nice too. Only not such a good outlook.16:58
niemeyerrogpeppe: Most probably, re. the meeting16:58
rogpeppeniemeyer: i'm thinking that it would be nice if we could attempt at least one face-to-face with Aram next week.16:58
niemeyerrogpeppe: Wasn't it Monday, btw?16:58
niemeyerrogpeppe: Yeah, that sounds like a great idea actually16:58
rogpeppeniemeyer: yeah, but TheMue has a public holiday on mon16:59
rogpeppeniemeyer: how about early one morning?16:59
niemeyerrogpeppe: Ah, sounds good then16:59
niemeyerrogpeppe, Aram: What about Friday?16:59
rogpeppeniemeyer: then it'll be ok for davecheney16:59
Aramniemeyer: next friday? as in one feek from now?16:59
Aramsure.16:59
Aramanytime.17:00
niemeyerAram: Yeah, in London17:00
niemeyer:)17:00
niemeyerrogpeppe: Sounds good.. good chance given we're all closer in terms of timing17:00
rogpeppeniemeyer: BTW by "face to face" i meant G+...17:00
niemeyerrogpeppe: ROTFL17:01
niemeyerrogpeppe: That's what face-to-face has turned into? :-)17:01
niemeyerrogpeppe: I actually mean *real* face-to-face.. :)17:01
rogpeppeniemeyer: more so than IRC :-)17:01
niemeyerAram: Can you get to London on Friday?17:01
rogpeppeniemeyer: actually next fri would work for me17:01
niemeyerAram: How troublesome would it be for you?17:01
rogpeppeniemeyer: seems like a long way to come for a short time though.17:02
niemeyerrogpeppe: It pays off..17:03
niemeyerrogpeppe: The next several weeks will be a lot nicer for Aram after having met people personally17:03
Aramniemeyer: I guess I could come, have to check up flights and whatnot, never bought tickets from here.17:03
rogpeppeniemeyer: FWIW i can get to london in about 3h15m17:05
rogpeppeniemeyer: yeah, i agree with that17:05
rogpeppeniemeyer: when do you fly back?17:05
niemeyerrogpeppe: Friday too17:05
niemeyerrogpeppe: EOD17:06
niemeyerMaybe Thursday would be better17:06
niemeyerAram: Which city are you in again?17:06
Aramvienna17:07
niemeyerAram: I'll send a probe to the agency that books flights for us17:08
niemeyerAram: Will CC you17:08
Aramplease, thanks17:08
rogpeppelooks like flights from vienna to heathrow are ok17:09
rogpeppeniemeyer, Aram: http://www.skyscanner.net/flights/vie/lond/120530/120602/airfares-from-vienna-to-london-in-may-2012-and-june-2012.html17:09
* Aram has to leave for a few hours, sorry.17:10
AramI'll be back.17:10
rogpeppeAram: see you monday!17:11
niemeyerMail sent17:11
niemeyerrogpeppe: Yeah, not to bad17:12
niemeyertoo17:12
niemeyerAram: Cheers17:12
rogpeppeniemeyer: i've just proposed a new version of https://codereview.appspot.com/6245048 with simplified putFakeTools17:13
niemeyerrogpeppe: Looking17:15
rogpeppeniemeyer: i've got to head off now. will poke my head in later.17:20
rogpeppeniemeyer, TheMue, Aram, fwereade: have a great w/e17:20
TheMuerogpeppe: Thx, you too.17:20
niemeyerrogpeppe: Review delivered17:21
niemeyerrogpeppe: Thanks for the quick turn around17:22
TheMueniemeyer: Btw, changed Id() to String() of the RelationEndpoint too.17:28
niemeyerTheMue: Sweet, is it ready for another round?17:49
TheMueniemeyer: Yep, it's in the box. ;)17:49
niemeyerTheMue: Checking17:49
niemeyerTheMue: Diff looks bogus17:54
niemeyerTheMue: https://codereview.appspot.com/6198055/17:54
TheMueniemeyer: Ooops, but I set the prerequisite.17:55
niemeyerTheMue: Yeah, this is a bug in lbox that I still haven't fixed17:55
TheMueniemeyer: Hmm, but that is now in the trunk. May that be the reason?17:55
niemeyerTheMue: The problem is that the pre-req has been merged17:56
niemeyerTheMue: But lbox is still comparing against the pre-req17:56
niemeyerTheMue: I'm sorry about that17:56
niemeyerTheMue: To fix it, merge trunk on the pre-req, and push it17:56
niemeyerTheMue: (with bzr push only)17:56
niemeyerTheMue: Then, re-propose the follow up17:56
niemeyerTheMue: This will get the diff clean again17:56
niemeyerOuch, forgot to buy the new battery17:59
TheMueniemeyer: OOK, wait a moment, will try.18:01
TheMueniemeyer: Ah, great, thx, looks cleaner now.18:02
niemeyerTheMue: Wow, yeah :)18:12
niemeyerTheMue: Review delivered18:25
niemeyerTheMue: The logic there is not quite right18:25
TheMueniemeyer: In which way?18:27
niemeyerTheMue: Please check the review and let me know if you need further details18:27
TheMueniemeyer: Done, that's why I ask. ;)18:28
niemeyerTheMue: Ok.. so you don't know that a *relation name* and a *service name* are not the same thing?18:28
TheMueniemeyer: I took line 571 in topology.py as example18:30
TheMueniemeyer: There is service["name"] != endpoint.relation_name18:31
niemeyerTheMue: The code is misleading indeed, but it's important to keep an eye on what you are actually doing18:32
niemeyerTheMue: What is inside that "service" dictionary?18:32
niemeyerTheMue: Have a look at assign_service_to_relation18:32
TheMueniemeyer: Ah, the relation name of the service.18:35
niemeyerTheMue: Do you have a good mental model of what a relation name is?18:37
niemeyerTheMue: That's not a trick question.. if you don't, let's talk about it18:38
TheMueniemeyer: It's a part of the relation identifier, but I find the name "name" mislieading.18:39
niemeyerTheMue: Ok.. so let's pick a metadata.yaml to look at18:39
* niemeyer looks18:39
TheMueniemeyer: One moment, have to help my wife.18:40
niemeyerTheMue: https://juju.ubuntu.com/docs/charm.html#the-metadata-file18:40
niemeyerTheMue: At the end of the doc there are some samples18:40
niemeyerTheMue: The relation name is that "db" under provides or requires18:41
niemeyerTheMue: Now, imagine that I have an application called mywiki that takes a couple of mongodbs18:41
niemeyerTheMue: One of them is for caching, and the other contains the actual app data18:42
niemeyerTheMue: Both of these relations will have the "mongodb" interface, for example18:42
niemeyerTheMue: But we need to disambiguate them so we can refer to them18:42
niemeyerTheMue: So we might call one of them "data" and the other "cache"18:42
niemeyerTheMue: Both with interface "mongodb"18:42
niemeyerTheMue: So when I'm adding a relation, I could say something like18:43
niemeyerTheMue: juju add-relation mywiki:data themongoservice18:43
niemeyerFor example..18:43
niemeyerTheMue: TO connect that specific relation18:43
niemeyerTheMue: So it is indeed a "relation name"18:43
niemeyerTheMue: Makes sense?18:43
TheMueniemeyer: Ah, ok, thank you, makes it more clear.18:49
niemeyerTheMue: np18:49
TheMueniemeyer: OK, so I'll change it (with a glas of whine beside me)18:50
TheMueniemeyer: For the interface error I used a plain error to return informations about the interface name.18:50
niemeyerTheMue: Will keep that in mind when reviewing.. LOL18:50
TheMueniemeyer: But indeed, I can change it to a NoRelationError too.18:51
TheMueniemeyer: Hehe, only one wine (or two or three *hicks*)18:51
niemeyer;-)18:53
TheMueniemeyer: One question, coult you please take a look at https://codereview.appspot.com/6200044/diff/3001/state/topology.go.19:26
TheMueniemeyer: This has been my first approach before UDS. In line 50 and 55 you see that I used a type to contain the name information.19:27
niemeyerTheMue: Checking19:28
niemeyerTheMue: Ok?19:28
TheMueniemeyer: After the discussion with William I switched to a map of role to service key. Our idea has been that the name relates to the service name and that the key is better here. A wrong assumption, as you now showed to me.19:28
TheMueniemeyer: So now I would like to reintroduce this type, but containing the serviceKey (like today the sting in the map) and the relationName. What do you think?19:29
niemeyerTheMue: Sounds reasonable19:29
TheMueniemeyer: Fine, thanks.19:30
niemeyerTheMue: Thank you!19:30
niemeyergo-environs-setconfig is ready to go.. OMG.. so happy19:36
andrewsmedinaniemeyer: nice!20:22
niemeyerWoohoo.. clean queue again20:42
niemeyerI'm heading out for some exercising20:42
TheMueniemeyer: I have to disappoint you. Just reproposed the latests branch. ;)20:57

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