| Posted | Nick | Remark | |
|---|---|---|---|
| #openstack-nova - 2018-03-27 | |||
| 18:14:22 | efried | cfriesen: "efried: if you send in two granular resource requests for resources1 and resources2, wouldn't it make sense to get back a dict of {resource1:<rp>, resource2:<rp>} or similar? They could still be the same RP." Sorry, I let this scroll by... | |
| 18:14:38 | efried | cfriesen: Yes, something like that would make sense. But we don't have that in the plan at the moment. | |
| 18:16:35 | efried | cdent, edleafe, jaypipes: How do you feel about the granular microversion changing the response payload to something like ^ to preserve the division of the requests? | |
| 18:17:22 | efried | gibi has already identified a place where that would be useful. | |
| 18:17:23 | cdent | efried: which response payload are you talking about? | |
| 18:17:39 | efried | cdent: The response from GET /a_c | |
| 18:17:52 | edleafe | efried: the purpose of the granular request is to ensure that each of those requirements is met by a single RP. What would be the advantage of splitting the out if it turns out that they are the same RP? | |
| 18:17:54 | cdent | a_r or p_s? | |
| 18:17:55 | efried | cdent: The format of an allocation_request, I think. | |
| 18:18:04 | efried | a_r, definitely not p_s | |
| 18:18:37 | cdent | efried: I'm not visualizing what you're really suggesting, could you paste something somewhere, or link me to some context? | |
| 18:18:56 | cdent | (I'm stuck on "how is this different from what we already do") | |
| 18:19:54 | efried | cdent: edleafe: The example I gave above was: resources1=VF:1,BW:200&resources2=VF:1,BW:300 may result in an allocation_request like RP_X: { VF: 2, BW: 500 }. Without consulting the original request (which, as in gibi's neutron case, may not be available), the caller can't tell that one VF should get BW:200 and the other should get 300. | |
| 18:20:47 | efried | cdent, edleafe: So the suggestion is that the response should instead look like: { resources1: { RP_X: { VF: 1, BW: 200} }, resources2: { RP_X: { VF: 1, BW: 300 } } } | |
| 18:21:02 | cdent | efried: and in this case we're on the same pf, and it is the pf that is being the resource provider, yes? | |
| 18:21:09 | efried | cdent: yes | |
| 18:21:23 | efried | RP_X is a PF provider of VF and BW resources. | |
| 18:21:36 | cdent | efried: does the caller still know the request it made? | |
| 18:21:49 | cdent | or still have whatever info it used to make the call? | |
| 18:22:02 | efried | cdent: That depends on the scenario. But in general ima say no. | |
| 18:22:30 | sean-k-mooney[m] | mriedem: regarding https://review.openstack.org/#/c/532410/4/specs/rocky/approved/volume-backed-server-rescue.rst i think they just want to do a normal image based nova rescue but for boot from volume instance. so the image size bits of the spec are just saying the rescue image is not empty | |
| 18:22:31 | gibi | cdent: neutron provide resource request pieces via the neutron port API, nova combines them to one big a_c request | |
| 18:23:15 | cdent | In general ima say that changing the allocation format again would make me sad, especially to represent granular stuff which seems icky somehow (will have to think a bit longer on why). Which is not "god no, I hate that" but rather "hmm, I'm not immediately in love with this" | |
| 18:23:26 | efried | cdent: I think the compute manager is the thing that builds the request, and the report client sends it down and gets the response, but the thing that needs to correlate the allocations to real resources is the virt driver (or in gibi's case, neutron (maybe a neutron agent)), and we're not giving that information to those guys. | |
| 18:24:04 | cdent | I'm uncomfortable with placement being use as state manager for the interaction between nova and neutron | |
| 18:24:16 | efried | eh, state manager? I don't see that. | |
| 18:24:43 | efried | All we're doing is providing the caller of GET /a_c with more detailed information about how the allocation_request was fulfilled. | |
| 18:24:54 | sean-k-mooney[m] | cdent: well its not state management. we just need to know how to correlate placement RP inventory to phyical resouce on the host | |
| 18:25:03 | efried | I.e. I took *this* request group to make *this* chunk of allocations. | |
| 18:25:53 | cdent | sounds like communicating state by proxy to me but maybe I'm peculiar | |
| 18:25:56 | efried | cdent: In the case of the virt driver, he can *probably* glean that information by looking back at the flavor... but now we also have resources/traits in the image, and gibi will also have them in the port, and future us may have... So asking virt to reconstruct all of that, which we currently do in nova, seems like a really bad idea. | |
| 18:26:49 | efried | cdent: It's not state. I see it as the difference between, "You asked for X and Y. Here's XY," and "You asked for X and Y. Here's X, Y." | |
| 18:27:34 | cdent | who is making the request for allocations in the example you gave? | |
| 18:27:40 | cdent | sorry candidates | |
| 18:27:53 | efried | the scheduler report client is the thing making the placement API call. | |
| 18:28:14 | cdent | right so nova is asking placement to construct data in a particular way so it can communicate something to nova | |
| 18:28:20 | cdent | s/nova$/neutron/ | |
| 18:28:41 | efried | No, if that's the part that's bothering you, let's remove neutron from the equation. | |
| 18:28:48 | efried | Just looking at nova talking to nova. | |
| 18:29:43 | efried | nova synthesizes resource+trait info from flavor, image, request spec, whatever sources. It comes up with a ResourceRequest (which is a set of RequestGroup) by the time it's ready to ask for allocation candidates. | |
| 18:29:47 | sean-k-mooney[m] | cdent: we have the same problem with numa in nova alone | |
| 18:30:16 | sean-k-mooney[m] | cdent: placement has 2 numa RP both with cpus. placement claims against one of the RPs how do i know which phyical numa node that alloaction is against | |
| 18:30:28 | cdent | so you have some state in the flavor, you use it to make a request and because you don't want to look back at that state in the flavor, you want to extend placement to transmit that state (again I'm not saying this is the worst thing ever, just trying to identify what's being done) | |
| 18:30:30 | efried | sean-k-mooney[m]: Not that, no. | |
| 18:30:53 | openstackgerrit | Balazs Gibizer proposed openstack/nova-specs master: Network bandwidth resource provider https://review.openstack.org/502306 | |
| 18:31:10 | efried | How is what's in the flavor "state"? It's a set of resource requests. | |
| 18:31:35 | efried | As currently conceived, we'd be summing up resource requests that happen to land in the same RP. | |
| 18:31:42 | cfriesen | does anyone know why we plug vifs at nova-compute startup, but then also plug them again (but don't wait for them) when powering on the instance? (for libvirt anyway) | |
| 18:31:43 | efried | That takes away information. | |
| 18:32:11 | sean-k-mooney[m] | cfriesen: linux bridge | |
| 18:32:13 | efried | If they happened to be assigned from different RPs, we would *have* that information. | |
| 18:32:28 | efried | But since they happened to be assigned from the same RP, they get rolled together, and we lose that information. | |
| 18:33:03 | sean-k-mooney[m] | cfriesen: the plug on startup is because on a reboot the tap wont be added to linux bridge because linux bridge does not preseits state. we then need to do it as part of boot a second time | |
| 18:33:05 | efried | Certainly when the virt driver is trying to grab real resources corresponding to an allocation, it needs to be able to correlate the RC+RP back to something real. | |
| 18:34:17 | gibi | mlavalle, jaypipes: I updated the bandwidth spec based on our discussion. | |
| 18:34:22 | cdent | I think may be using the term "state" far more generally than you are, but that's probably not all that germane | |
| 18:34:51 | jaypipes | gibi: ty gibi. | |
| 18:35:18 | gibi | efried: I don't have the brainpower any more to think through you mapping comments in the bandwidth spec today. I will get back to that tomorrow | |
| 18:35:19 | efried | cdent: looklook, here's another example. Today I have no way of requesting two different disks from placement. With granular, I could. I want a 1G disk and a 2G disk, so I would say: resources1=DISK_GB:1024&resources2=DISK_GB:2048. | |
| 18:35:35 | gibi | efried: thanks for pushing the discussion forward with cdent right now :) | |
| 18:35:38 | efried | cdent: In a scenario where I have sharing providers, or maybe multiple disk providers in my tree, or whatever, I may get back a candidate like { STOR_RP1: { DISK_GB: 1024 }, STOR_RP2: {DISK_GB: 2048 } } | |
| 18:36:03 | cdent | efried: I'm still trying to think this through, but it's slow going because I need to get past a fundamental issue for me: I really don't want to expose granularity in allocations... | |
| 18:36:19 | edleafe | efried: in that scenario, there isn't anything preventing placement from getting both "disks" from the same disk RP | |
| 18:36:19 | efried | cdent: And that would be fine, cause now my virt driver can tell it needs to get 1024 from STOR_RP1 and 2048 from STOR_RP2. | |
| 18:36:50 | efried | edleafe: Exactly. In which case, as currently conceived, we would report a candidate like: { STOR_RP1: { DISK_GB: 3072 } } | |
| 18:36:58 | cfriesen | sean-k-mooney[m]: I get the boot-time one...why do we need to do it again at instance boot if vifs_already_plugged=True ? | |
| 18:37:06 | cdent | didnt we have a discussion (or was it in my mind) recently about the difference between contiguous and non-contiguous resource providers? | |
| 18:37:20 | efried | cdent: Somehow virt needs to figure out that that's really a 1G disk and a 2G disk. How does he figure that out? Where does he get that information? | |
| 18:37:44 | efried | cdent: Yes, this is related to that discussion. It's why we couldn't e.g. split a VCPU:2 request across two numa nodes. | |
| 18:37:52 | edleafe | efried: what I'm saying is that there is no way to express "these must be two separate RPs" | |
| 18:38:06 | efried | edleafe: Yes, but in this case that's not something I need to express. | |
| 18:38:23 | edleafe | what granular gets you is "everything in this group must be on the same RP tree" | |
| 18:38:26 | efried | edleafe: What I *am* trying to express is that "these must be two separate *disks*". | |
| 18:38:38 | sean-k-mooney[m] | cfriesen: i dont think vifs_already_plugged will be true on the boot case. just on soft reboot | |
| 18:38:39 | mriedem | are people ok with me just self approving this spec update to match the actual multiattach implementation? https://review.openstack.org/#/c/544152/ | |
| 18:38:39 | efried | edleafe: ...which I expressed by putting them into separate granular groups. | |
| 18:38:47 | sean-k-mooney[m] | cfriesen: are you using hybrid plug? | |
| 18:39:02 | sean-k-mooney[m] | cfriesen: e.g. are you using the iptables firewall driver or conntrack | |
| 18:39:08 | efried | mriedem: Given the +1s that are on it, fine by me. | |
| 18:39:09 | cfriesen | sean-k-mooney[m]: for power-on vifs_already_plugged is true | |
| 18:39:24 | edleafe | efried: that's not what granular is for, is it? It's to ensure that all the requirements in a single group come from the same RP tree | |
| 18:39:39 | edleafe | not that every group must come from different trees | |
| 18:39:41 | mriedem | efried: done | |
| 18:39:42 | mriedem | thnaks | |
| 18:39:47 | mriedem | thanks even | |
| 18:40:07 | efried | edleafe: "what granular gets you is "everything in this group must be on the same RP tree"" -- no, "everything in this group must be on the same RP". But also it allows you to request different resources of the same class. | |
| 18:40:27 | openstackgerrit | Kashyap Chamarthy proposed openstack/nova master: libvirt: Allow to specify granular CPU feature flags https://review.openstack.org/534384 | |
| 18:40:36 | sean-k-mooney[m] | if vifs_already_plugged is true then we should not be calling plug at least in the os-vif case | |
| 18:40:50 | efried | edleafe: The canonical example being two VFs on different networks. resources1=VF:1&required1=PHYSNET_A&resources2=VF:1&required2=PHYSNET_B | |
| 18:40:59 | efried | edleafe: No way to do that in a single group. | |
| 18:41:01 | sean-k-mooney[m] | cfriesen: if libvirt is doing the plugging (kernel ovs with conntrack or noop security gorup driver) then its likely a side effect of libvirts ovs code | |
| 18:41:08 | edleafe | efried: of course | |
| 18:41:30 | efried | edleafe: And in that case, you would be assured that the resources came from different providers (because presumably one PF can't be on two physnets at once), so you would be fine. | |
| 18:41:31 | cdent | at one point I thought we had decided that if we wanted to do that the vf's had to be resource providers | |
| 18:41:46 | edleafe | efried: but if you have resources1=VF:1&required1=PHYSNET_A&resources2=VF:1&required2=PHYSNET_A you don't necessarily get different PFs | |
| 18:41:47 | efried | cdent: No, the PFs can still be providers. | |
| 18:41:56 | cfriesen | sean-k-mooney[m]: LibvirtDriver._create_domain_and_network() plugs the vifs | |
| 18:41:58 | efried | edleafe: Yes, correct. | |
| 18:42:12 | efried | edleafe: In the case of VF resources, where one VF is one resource, that's okay. | |
| 18:42:14 | edleafe | efried: but you're claiming that separate groups return separate RPs | |