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

=== wedgwood is now known as wedgwood_away
wallyworld_davecheney: hi, any chance of a quick 2 line code review? improved boilerplate for 1.9.8 release https://code.launchpad.net/~wallyworld/juju-core/improve-boilerplate-config/+merge/14727904:28
davecheneysure04:28
wallyworld_thanks04:28
davecheneyhave you guys stopped using lbox ?04:29
wallyworld_i can't login04:29
wallyworld_it won't auth04:29
wallyworld_trying to debug it now - it seems the login response returns no cookies04:29
wallyworld_even though it nominally succeeds04:29
davecheneyLGTM04:31
davecheneyafk for a bit - hangout04:31
wallyworld_thanks04:32
thumperhi wallyworld_04:33
thumperI'm just about to sign off04:33
wallyworld_g'day04:33
thumperbusy getting my head around juju04:33
wallyworld_hah04:33
wallyworld_have a good weekend04:33
* thumper waves at davecheney too04:33
thumperyou too04:33
* wallyworld_ wishes it would stop raining so soccer isn't cancelled tonight04:33
davecheney013/02/08 17:34:22 JUJU juju bootstrap command failed: cannot start bootstrap instance: cannot allocate a public IP as needed06:35
davecheneyany ideas ?06:35
davecheneythis is on canonistack06:35
TheMueMorning07:38
rogpeppedavecheney: i think public IPs are few and far between in canonistack08:06
rogpeppedavecheney: istr there was some talk of making getting a public IP optional08:08
rogpeppeTheMue, fwereade_, all: mornin'08:08
TheMuerogpeppe: Hello Mr Peppe ;)08:08
TheMuedavecheney, fwereade_: And also a hello to you.08:09
* rogpeppe loves it when tests find obvious mistakes that you've looked at many times without seeing.10:12
rogpeppefwereade_: ping11:11
rogpeppeif anyone wants to take a look, here's the CL that implements API authentication: https://codereview.appspot.com/7299066/11:16
TheMuerogpeppe: *click*11:16
TheMuerogpeppe: You've got a +1.11:43
rogpeppeTheMue: thanks11:43
TheMuerogpeppe: yw11:44
rogpeppe"11:45
rogpeppeName "stm" has been a bit misleading because we mostly talk about state.Machine11:45
rogpeppehere.11:45
rogpeppe"11:45
rogpeppeTheMue: the point of naming it stm there is because it *is* a state.Machine11:45
rogpeppeTheMue: an alternative would be to call all the api-specific variables apist, apim, etc11:46
rogpeppeTheMue: rather than st, m11:46
TheMuerogpeppe: All m's in there are state.Machines. And in the same method you also mad a pure m. In that case the M(achine) has a special semantic. That's why I proposed a different prefix.11:48
rogpeppeTheMue: "pam" is not great, because it doesn't say anything about why that machine is special (the machine returned by the api.State.Machine call is a representation of that machine too)11:49
rogpeppeTheMue: perhaps i should just call it apim11:49
TheMuerogpeppe: +1 on that, yep.11:50
TheMuerogpeppe: But even w/o a change it would be ok for me, it only has been a minor.11:50
rogpeppeTheMue: ok, cool11:51
TheMuerogpeppe: One look into the according function and it has been clear.11:51
TheMuerogpeppe: But your func() func() (func(), error) is nice. *bg*11:51
rogpeppeTheMue: closures are great :-)11:51
TheMuerogpeppe: Indeed.11:52
TheMuerogpeppe: Only missed a func() as arg of that func. *rofl*11:52
rogpeppeTheMue: higher-order tests, yay!11:53
TheMuerogpeppe: Or a func, getting a func, producing a func which has a func as arg to produce a func.11:53
rogpeppeTheMue: now now, then, we're not using haskell :-)11:53
TheMuerogpeppe: Hehe, and it would look weird. Smalltalk closures are pretty short. [:a :b | a doSomethingWith: b]11:55
TheMuerogpeppe: But the call is ugly.11:55
TheMuerogpeppe: In case that one is stored in c it has to be "c value: something value: anotherThing."11:56
TheMueOh, just called for lunchtime.11:57
TheMuebiab11:57
rogpeppeTheMue: of course, no unnamed params in smalltalk11:57
fwereade_rogpeppe, pong, sorry I missed you12:13
dimiternfwereade_: fancy a quick review? :)12:16
fwereade_dimitern, sure :)12:17
dimiternfwereade_: https://codereview.appspot.com/7299047/ - should be simple enough12:17
dimiternfwereade_: 10x12:17
rogpeppemgz: i'm interested to know what you thought was particularly bad about the ec2 port handling code. nothing seems to stand out for me, but i'm certainly biased :-)12:35
rogpeppefwereade_: just thought you might wanna have a look at the API authentication CL: : https://codereview.appspot.com/7299066/12:35
rogpeppedimitern: looking12:35
fwereade_rogpeppe, ah, cheers12:35
mgzrogpeppe: which particular frustration I feel with it varies :)12:36
rogpeppefwereade_: it's a bit bigger than i intended, but hopefully still not *too* bad12:36
rogpeppemgz: top 3 frustrations?12:36
mgzso, currently,12:37
mgzthe copy code between ec2/openstack (need to learn go trick for sharing code without making something public interface)12:38
rogpeppemgz: the difficulty there is that openstack and ec2 interfaces are very similar but not the same...12:38
rogpeppemgz: if there was any code you wanted to factor out, it could go into another package, say environs/ec2like12:39
rogpeppemgz: it has always been the intention to factor out common code between providers - but before we had multiple providers, it was hard to say which code was appropriate.12:40
mgzbatch rule handling where it doesn't make sense for openstack, magic-name lookup and unclear behaviour on individual errors12:40
mgzand the long-standing but less current one of security group per-machine and cleanup of resources12:41
rogpeppemgz: yeah, the magic name lookup was a legacy from the python port12:41
rogpeppemgz: in openstack, can you change the security groups assigned to a machine?12:42
mgzyup.12:42
rogpeppemgz: ah, then you can avoid the one-security-group-per machine issue12:42
mgzthough, there are caveats that make that less promising that it sounds.12:42
rogpeppemgz: in ec2 you can't12:42
dimiternrogpeppe, mgz: you can change the secgroups of a machine, but you need to reboot it to take effect12:44
mgzin that, I think deployment variable, you can't trust rules on a new group to apply unless the vm is rebooted12:44
rogpeppemgz: cleanup of resources is an issue - the main problem is when you kill the instances but never run destroy-environment.12:44
rogpeppemgz: ah, that makes it pretty useless12:44
mgzin openstack cleanup can be done properly, if careful, because you can delete groups on terminate machine12:45
rogpeppemgz: "i'll call juju expose - oops, all my machines have just rebooted!"12:45
mgzanyway, the port batching is annoying12:48
mgzespecially given it's still port-at-a-time12:48
mgzand range ignorant12:48
rogpeppemgz: at one time, i did have the ec2 provider delete security groups on instance termination, but it failed all the time, because the instance takes a while to relinquish its security groups12:50
mgzright, I know that code12:50
mgzit can be done safely with openstack because you can remove the group from the server first12:50
rogpeppemgz: the port batching means you do at least have the capability to do it as a batch. but i agree it's not entirely clear what to do about partial errors.12:50
mgzleads to some slightly-complicated deferred chaining with twisted though :)12:51
rogpeppemgz: but that issue applies to the agent too - what should the agent do if it can't remove a given port?12:52
rogpeppemgz: hopefully not so complicated under Go :-)12:52
mgzclearly report that one part failed and continue, probably12:53
mgzthe fun has tended to be that things get logged somewhere far from what cares about it so it's hard to tell why something hasn't worked12:54
rogpeppemgz: yeah, logging is an issue we need to think hard about13:04
rogpeppemgz: i'd be happy to see the batch operations return an error that summarises all the ports that couldn't be closed, rather than just stop at the first.13:04
rogpeppelunchtime13:05
dimiternwhat does it mean `json:"-"` as a tag?13:11
dimiternon a struct field13:12
TheMuedimitern: The field is ignored in serialization.13:15
dimiternTheMue: ignored only on marshaling, but not unmarshaling?13:16
TheMuedimitern: Oh, would have to test. IMHO only marshalling.13:17
dimiternTheMue: ok, thanks13:17
dimiternfwereade_, rogpeppe: any thoughts on the CL?13:28
fwereade_dimitern, reviewed, let me know your thoughts; I might be missing some subtleties13:29
dimiternfwereade_: cheers, I'll take a look13:30
dimiternfwereade_: I'm not sure I get your idea with simplifying the matching loop - can you elaborate a bit?13:36
fwereade_dimitern, say I ask for the following ids: "", "a", "b", "c", "d" (hope that's enough)13:39
=== wedgwood_away is now known as wedgwood
dimiternfwereade_: so, you propose to take the API calls out of the function and pass the result as a map13:40
fwereade_dimitern, "a" is missing due to eventual consistency, "b" is in the wrong env, "c" is terminated, and "d" actually works correctly13:40
fwereade_dimitern, gatherInstances would put an instance in the map under "d"13:41
fwereade_dimitern, and return only {"a"}13:41
fwereade_dimitern, because it has enough information after the first call to eliminate all the others from consideration13:42
dimiternfwereade_: ah, so the API calls stay there13:42
fwereade_dimitern, yeah13:42
rogpeppeTheMue, dimitern: json:"-" means it's ignored for both marshalling and unmarshalling13:42
rogpeppehttp://play.golang.org/p/QdPfN_Dv4Z13:42
dimiternrogpeppe: got it, thanks13:43
dimiternfwereade_: so gather will return only the ones it cannot find13:43
dimiternfwereade_: but that'll change Instances and make it more complex it seems13:44
fwereade_dimitern, maybe I'm missing something, because it seemed it would become simpler, I'll try to sketch what I'm imagining13:45
dimiternfwereade_: quite a lot is happening there - handling all of these cases: empty ids passed, multiple ids, single ids with empty ones (essentially a single id), servers with errors/missing13:45
dimiternrogpeppe: Add() is there because we reuse url.Values and its methods13:47
dimiternrogpeppe: I don't know how to override an inherited method so it's not public any more and cannot be called13:48
rogpeppedimitern: i hadn't seen that. i'm not sure it's entirely appropriate to embed url.Values there13:49
dimiternrogpeppe: we need it because of the Encode() method mostly, but also Get and Set13:49
rogpeppedimitern: do nova clients need to call Encode on it?13:49
TheMuerogpeppe: tThx for the info.13:50
dimiternrogpeppe: yes, to pass it to nova in the url13:50
dimiternrogpeppe: it happens internally in ListServers/Detail13:50
rogpeppedimitern: but that's an implementation detail, right. nothing external to nova needs to see that the underlying representation is a url.Values, does it?13:51
rogpeppes/right./right?/13:51
dimiternrogpeppe: right13:52
rogpeppedimitern: i'd be much happier to see type Filter struct {v url.Values}13:52
rogpeppedimitern: implementing only the single method Add13:52
dimiternrogpeppe: I see you point, and I was wondering so myself13:52
fwereade_dimitern, ahh, I see the problem -- you can't tell whether something missing from ListServersDetail is because it's not there, or because it is there but in in the wrong environment13:52
rogpeppedimitern: a mean the single method *Set* of course :-)13:53
rogpeppes/a mean/i mean/13:53
dimiternrogpeppe: I should propose a follow-up changing this, so we only have explicit methods on Filter13:53
rogpeppedimitern: +113:53
dimiternfwereade_: exactlty13:53
dimiternfwereade_: exactly even :)13:53
dimiternrogpeppe: I'm on it - it should be trivial13:55
fwereade_dimitern, ok, but that is very much an edge case indicating that things are seriously wrong elsewhere, right?13:55
dimiternfwereade_: not necessarily, why?13:55
fwereade_dimitern, because for that value to have been passed in, something must have some reason to believe that instance is part of the environment, right?13:56
dimiternfwereade_: right13:58
fwereade_dimitern, I'm not saying it *can't* happen, but it certainly shouldn't ;p13:58
rogpeppefwereade_, dimitern: i'm not sure whether a map will help, but it does appear to me that the code could be simpler14:06
dimiternI'd appreciate a short example how, because I spent all day yesterday trying to make it as good and fast as I can, but probably failed it seems14:09
fwereade_dimitern, how about http://paste.ubuntu.com/1624792/ ?14:11
fwereade_dimitern, I appreciate that it's a bit of a gnarly problem and I've probably missed something14:11
dimiternfwereade_: looking14:11
dimiternrogpeppe: here's the follow-up - I think it should be trivial enough - https://codereview.appspot.com/730106414:12
dimiternfwereade_: is x := map[T]Y{} equivalent to x := make(map[T]Y) ?14:14
fwereade_dimitern, yeah, as far as I'm aware14:14
dimiternfwereade_: cool, I'll remember that :)14:14
fwereade_dimitern, yeah, I prefer it myself usually14:14
* rogpeppe prefers make when appropriate :-)14:15
dimiternrogpeppe: because it's more explicit?14:15
rogpeppedimitern: yeah - i often have to look twice for the {} at the end14:16
dimiternrogpeppe: yes, I can see how it could be confusing - I missed it at first14:16
rogpeppedimitern: the difference between var x map[T]Y and x := map[T]Y{} is subtle :-)14:17
rogpeppedimitern: i don't mind either form though tbh14:18
dimiternrogpeppe: but var x map[X]Y is not the same, right? you still need to make() it before using?14:18
rogpeppedimitern: exactly. that's why it's a subtle difference to spot.14:18
dimiternrogpeppe: yeah14:18
dimiterni'll go grab some food, bbiab14:19
rogpeppein limbo if you used a type expression as a normal expression, it made something of that type. so you could say x := chan of int, and it was equivalent to x := make(chan int)14:20
rogpeppethat was nice but syntactically limiting14:21
rogpeppefwereade_: +1 to your collectInstances14:22
fwereade_rogpeppe, cheers :)14:22
rogpeppefwereade_: although an approach similar to ec2's can also work fine there i think. it's got an n^2 loop, but n is always 1 in our code...14:23
fwereade_rogpeppe, I think ec2 gathers more than it needs to, but it's a simple fix: n++ at :504 before continuing14:26
rogpeppefwereade_: omg you're right. that's a bug.14:27
rogpeppefwereade_: and i think that it cause errors actually14:28
rogpeppes/cause/could cause/14:28
fwereade_rogpeppe, glad we saw it then :)14:29
rogpeppefwereade_: ah, i see why the tests don't catch it - it can only happen if a request fails first time, then succeeds the next.14:29
fwereade_rogpeppe, yeah, think so14:30
rogpeppefwereade_: we should probably add something to ec2test to enable particular failure modes14:30
fwereade_rogpeppe, +10014:30
rogpeppefwereade_: perhaps like the hook feature in the openstack double14:31
fwereade_rogpeppe, yeah, given that it doesn't seem to be causing too much pain, I think it's a solid model14:31
rogpeppefwereade_: i didn't do it before because i wasn't sure of a nice way to do it.14:31
dimiternfwereade_: right :) that pesky n++ :)14:31
fwereade_rogpeppe, I completely understand that :)14:31
dimiternfwereade_: but the other thing - removing the for loop checking if any(insts) is nil should stay as is14:32
rogpeppefwereade_: have you had a glance at the api auth CL, by any chance? i'm interested how you think it's turning out.14:32
fwereade_rogpeppe, was just starting to when I got distracted by this discussion :)14:33
rogpeppefwereade_: lol14:33
fwereade_dimitern, ah, I thought I'd handled that -- what scenario did I miss?14:33
dimiternfwereade_: collectInstances won't work correctly with [id0, ""] or [id0, "", ""] for that mater, needs an extra check to avoid doing List when you can do Get14:33
dimiternfwereade_: no I meant ec2 Instances()14:34
fwereade_dimitern, ahok14:34
fwereade_dimitern, yeah, I guess we could start by just filtering ""s out in Instances14:35
dimiternfwereade_: sure, we can filter them, but we need to still return ErrPartialInstances whenever there are empty ids14:36
fwereade_dimitern, that'll happen anyway, won;t it?14:36
dimiternfwereade_: that's what a lot of the code and tests expect (why though, it beats me)14:36
fwereade_dimitern, we just construct missing by filtering ids at the start14:36
dimiternfwereade_: yes, but len(ids) == 1 is not enough, we should scan through it until we find one or more ids to check14:37
dimiternfwereade_: imagine ["",id0] or ["", "", id0], etc.14:37
dimiternfwereade_: in this case all we need is Get(id0)14:38
fwereade_dimitern, if we pre-filter ids to missing in Instances, we'll just pass ["id0"] up to collectInstances, right?14:38
dimiternfwereade_: that'll work, but despite filtering, we still have to return ErrPartialInstances in Instances() when there are empty ones14:39
fwereade_dimitern, I assert that it will work correctly, because the final loop won't find any Instance for ""14:39
dimiternfwereade_: you're right, so just a filtering before collect should be enough14:41
dimiternfwereade_: and not calling it at all if after filtering len == 014:42
dimiternfwereade_: i.e. ["", ""] was passed14:42
fwereade_dimitern, yeah, +114:42
dimiternfwereade_: great, I'll give it a go then14:43
dimiternfwereade_: tyvm14:43
rogpeppedimitern: reviewed https://codereview.appspot.com/7301064/14:46
rogpeppedimitern: i don't think you should worry if we call ListInstances when the user passes in blank instances14:48
rogpeppedimitern: it should never happen, and the code should work correctly even when it does14:48
rogpeppedimitern: so i wouldn't bother doing any initial filtering - it complicates the code for no gain14:49
dimiternrogpeppe: thanks for the review14:50
dimiternrogpeppe: it happens a lot in tests14:51
rogpeppedimitern: do we care?14:51
rogpeppedimitern: the performance will be almost exactly the same14:51
dimiternrogpeppe: hmm.. since we're not actually trying to pass any ids to nova, but rather filter them later, this will affect only the single id - Get case, we shouldn't call Get("")14:53
rogpeppedimitern: i don't even care if we do that14:54
rogpeppedimitern: the tests should probably use "somerandomthing" rather than "" as an invalid id14:55
rogpeppedimitern: but the result is probably the same tbh14:55
rogpeppedimitern: there's nothing special about ""14:55
rogpeppedimitern: in this case14:55
dimiternrogpeppe: not exactly, passing "" will try to fetch /servers/ rather than /servers/id and till return 40414:56
rogpeppedimitern: that seems like a bug in goose to me14:56
dimiternrogpeppe: s/till/will/, but this is the same really14:56
rogpeppedimitern: it should error out if the id is empty14:57
dimiternrogpeppe: this makes sense14:57
dimiternrogpeppe: anyway - I only added the Get() single id case as jam suggested14:58
dimiternrogpeppe: but now it seems more of an overkill to support this case will all its subtleties14:59
rogpeppedimitern: i think using Get when appropriate is good14:59
rogpeppedimitern: but i don't think that you need to worry about the case where some ids are invalid14:59
rogpeppedimitern: the only difficulty is that the server might return an "invalid id" error.15:00
dimiternrogpeppe: yes, and having List only will solve any issues15:01
dimiternrogpeppe: and frankly, he performance benefit of get escapes me now15:01
dimiternrogpeppe: when we have to handle all those extra cases so it won't blow unexpectedly15:02
dimiternrogpeppe: changes applied - https://codereview.appspot.com/7301064/15:10
dimiternmy irc client behaves odd15:20
dimiternnot sure I managed so send anything in the last 10m15:20
rogpeppedimitern: last messages i've seen from you:15:49
rogpeppe[15:10:11] <dimitern> rogpeppe: changes applied - https://codereview.appspot.com/7301064/15:49
rogpeppe[15:20:20] <dimitern> my irc client behaves odd15:49
rogpeppe[15:20:42] <dimitern> not sure I managed so send anything in the last 10m15:49
dimiternrogpeppe: so I didn't miss anything, cheers15:50
dimiternfwereade_: fresh from the oven - https://codereview.appspot.com/7299047/ :)16:13
fwereade_dimitern, cheers -- I'm just going through rog's API stuff now16:14
dimiternfwereade_: no worries16:15
dimiternrogpeppe: refactored filters, as discussed: https://codereview.appspot.com/730106416:54
dimiternfwereade_: when you can, can you look at this too please? ^^16:54
fwereade_dimitern, ack16:55
dimiternfwereade_: thanks16:55
rogpeppefwereade_: i still see Get and Del methods on nova.Filter16:55
dimiternrogpeppe: oops, sorry they're unused now, but forgot to remove them16:56
dimiternrogpeppe: fixed now, 10x16:57
* dimitern afk 10m16:57
rogpeppedimitern: reviewed17:02
dimiternback17:08
dimiternrogpeppe: tyvm17:08
dimiternis a map always passed by reference?17:13
rogpeppedimitern: yes17:13
dimiternfunc f(m *map[X]Y) <=> func f(m map[X]Y) ?17:13
rogpeppenope17:14
rogpeppedimitern: a pointer to a map is a pointer to a map17:14
rogpeppedimitern: the first form of the function there is redundant17:14
dimiternbut i suppose having a pointer here no longer makes sense17:14
mgzdimitern: so, just to double check with you, to land things on goose now I should set a commit message on lp and mark approved?17:14
rogpeppedimitern: yup17:14
dimiternmgz: yes17:14
dimiternrogpeppe: cheers17:14
mgzdimitern: ta17:15
dimiternrogpeppe: so LGTM? :)17:24
dimiternmgz: so the release is today?17:28
mgzwell, by monday we assume17:28
rogpeppedimitern: LGTM17:28
dimiternrogpeppe: great, 10x17:29
fwereade_rogpeppe, I'm not going to finish it today, but I think I'm comfortable with what I've seen so far17:34
fwereade_dimitern, I won't get to yours tonight I'm afraid17:34
dimiternfwereade_: no problem17:37
dimiternmgz: can you take a look then? https://codereview.appspot.com/7299047/17:38
mgzsure17:38
dimiterncheers17:38
rogpeppefwereade_: great, thanks17:43
rogpeppefwereade_: any chance of publishing any comments you have so far?17:43
dimiternrogpeppe: can i bug you one last time (for today)? :) https://codereview.appspot.com/7299047/17:55
rogpeppedimitern: i preferred william's version that used GetServer most of the time17:57
dimiternrogpeppe: the round-trip is still the same actually17:57
rogpeppedimitern: because we really don't want to be downloading all server details when we're after just a single instance (which is actually the only way we use Instances currently)17:58
rogpeppedimitern: the amount of traffic is not though17:58
mgzright, there are a few slightly complex things there dimitern that I'm not certain of17:58
dimiternrogpeppe: so it's certain we're using mostly Instances([]{id}) ?17:58
rogpeppedimitern: if you've got 10000 servers, you're going to get details for all of them, even though you're just interested in one.17:58
mgzI don't mind landing it if we actually get a chance to revisit though17:59
rogpeppedimitern: yup. grep for it yourself...17:59
rogpeppedimitern: we never actually call Instances with more than one instance, except in tests.17:59
dimiternrogpeppe: and how about passing empty ids ? is this just for tests for it actually happens often?17:59
rogpeppedimitern: that's just for tests.18:00
rogpeppedimitern: i have another idea actually18:00
rogpeppedimitern: you could just spawn off n concurrent GetServer requests18:00
dimiternrogpeppe: ok, so that's easy enough to fix - i'll just test the len() == 1 case and leave the rest18:00
rogpeppedimitern: and avoid using List at all18:00
rogpeppedimitern: sounds good.18:00
dimiternrogpeppe: wow! that's seems an overkill18:00
dimiternrogpeppe: how it would be better?18:01
rogpeppedimitern: yeah, ignore that. although it's probably not much code.18:01
dimiternrogpeppe: no, i can see it in like 5 lines, but I'm curious about the merits18:01
rogpeppedimitern: it would mean that if you're fetching only 2 instances out of 1000, you only get info for those two instances.18:02
rogpeppedimitern: and the round-trip time would be similar18:02
dimiternrogpeppe: exactly, it'll effectively increase in fact - n*GetServer >> m*ListServers, and now ISTM m is usually 118:03
rogpeppedimitern: i dunno; it's not n*GetServer because we're doing them all concurrently.18:04
dimiternrogpeppe: the traffic I mean, not the time18:04
dimiternrogpeppe: with n=100k it makes a huge difference to use 1 getserver if possible18:05
rogpeppedimitern: yeah. and even 2 getservers when n is two.18:05
rogpeppedimitern:  if you've got 1000 servers but you're only requesting two instances, the traffic for ListServers is proportional to 1000, but the traffic for GetServer is proportional to 2.18:06
rogpeppedimitern: but tbh the 1-instance case is the only one i care about.18:06
dimiternrogpeppe: i didn't quite get that 1-instance? you mean optimize both len == 1 and len == 2 cases?18:07
dimiternrogpeppe: going even further, we can estimate how many getserver calls we can make and still be better of than a single listservers if we know N :)18:08
rogpeppedimitern: you mean if we know M, presumably?18:08
dimiternrogpeppe: and of course, we parallelize the getserver calls18:09
rogpeppedimitern: yeah18:09
dimiternrogpeppe: yeah18:09
dimiternrogpeppe: but perhaps that's going a bit too far now18:09
rogpeppeactually, we didn't have a variable name for overall number of instances...18:09
rogpeppedimitern: yeah. just implement the n=1 case, and that will work fine for now.18:10
dimiternrogpeppe: we can assume len == 1 case is special and simple enough to optimize for18:10
rogpeppedimitern: +118:10
dimiternrogpeppe: we can cache len(AllInstances)18:10
rogpeppedimitern: not worth it18:10
rogpeppedimitern: in the cases we're concerned about, there might be huge churn, and our cache is likely worthless.18:11
rogpeppedimitern: and the number of instances we're requesting is always likely to be small, i think.18:11
dimiternrogpeppe: well, if we have metering about traffic per cloud API call we can easily estimate such dynamic run-time optimizations18:12
rogpeppedimitern: there are many optimisation possibilities :-)18:12
dimiternrogpeppe: juju will achieve some level of consciousness18:12
dimitern:)18:13
rogpeppedimitern: it's gonna happen :-)18:13
dimiternrogpeppe: great book btw - born to run, fwereade_gave it to me and I few through it18:13
rogpeppedimitern: isn't it fascinating?18:14
rogpeppedimitern: glad you like it18:14
rogpeppedimitern: do you run at all?18:14
dimiternrogpeppe: great for running motivation, i already ordered a pair of thin sole sandals :)18:14
rogpeppedimitern: cool!18:14
rogpeppedimitern: i think the main take-away is "strike toe first"18:14
dimiternrogpeppe: i started a few weeks ago, but it's tough to get out18:14
dimiternrogpeppe: oh yeah, easy, light, smooth, fast, etc.18:15
rogpeppedimitern: and most importantly easier on the joints18:15
dimiternrogpeppe: this week i did like 10m and i'm still recovering my gait :)18:15
rogpeppedimitern: i used the couch-to-5k routine for a while18:16
dimiternrogpeppe: very easy to overdo it, but as they suggest - watch your breathing18:16
rogpeppehttp://www.c25k.com/18:16
rogpeppewhich is very good for not overdoing it18:16
dimiternrogpeppe: cool! I can use something handy like that18:17
dimitern10x18:17
rogpepperight, that's me for the night18:17
rogpeppedimitern: see ya monday18:18
rogpeppeg'night all!18:18
dimiternhappy weekend :)18:18
dimiternmgz: ping18:18
mgzdimitern:  hey18:21
dimiternmgz: so you think is LGTM, assuming I complete rogpeppe's suggestion?18:21
mgzI'll leave some kind of comment to that effect, yeah18:22
dimiternthanks18:23
davecheneythe 1.9.8 packages are in the gophers PPA20:35
davecheneyif anyone feels like testing them before I hit the send button on the announcement20:35
davecheneythat would be helpful20:36
hazmatdavecheney, isn't terminate-machines implemented (ic destroy-machine) in revno87623:08
hazmatdavecheney, it would be good to tag release revnos (via bzr tag)23:11
hazmatdavecheney, there's some useful tools for releng management in landscape-devel  .. moving unclosed bugs to next milestone, etc23:36
davecheneyhazmat: well that sucks23:38
davecheneyi did remind people who were merging features on friday to update the release notes23:39
davecheneyconsider it a bonus23:39
davecheneyhazmat: ta, haven't needed them recently because mostof the development is being tracked in leankit23:39
davecheneybut *hopefully* now this is a public release, we'll get lots of wonderful feedback23:40

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