[libvirt] virsh setmaxmem
Chris Lalancette
clalance at redhat.com
Tue Mar 30 12:59:26 UTC 2010
On 03/30/2010 05:58 AM, Daniel Veillard wrote:
> On Mon, Mar 29, 2010 at 04:33:32PM -0600, Eric Blake wrote:
>> On 03/11/2010 08:46 AM, Daniel Veillard wrote:
>>> On Wed, Mar 10, 2010 at 03:33:55PM -0500, Chris Lalancette wrote:
>>
>> [revisiting something still flagged in my inbox]
>>
>>>> All,
>>>> My recent patch to remove qemudDomainSetMaxMem() revealed some surprising
>>>> (to me) behavior of "virsh setmaxmem". In particular, if you run setmaxmem, and
>>>> the hypervisor doesn't support it, this fact will be reported to you. However,
>>>> if the amount you were setting for maxmem happens to be lower than "currentMemory",
>>>> setmaxmem will silently balloon down the domain for you. This is a surprising
>>>> result exactly because virsh reports error, but did something anyway. What I
>>>> would expect is that if a hypervisor doesn't support virDomainSetMaxMem(), nothing
>>>> at all is done.
>>>> If we agree that this is behavior that needs to be fixed, I would suggest
>>>> that we move the code to do the auto-ballooning into each of the individual
>>>> drivers that *do* support virDomainSetMaxMem(). Currently that includes the
>>>> test driver, the LXC driver, and the Xen driver. This way, we maintain the
>>>> current behavior for the hypervisors that support this call, and make sure
>>>> not to do anything at all for the hypervisors that do not.
>>>> Opinions?
>>>
>>> Hum ... looking at cmdSetmaxmem() in tools/virsh.c it does
>>>
>>> -------------------------------------------------
>>> if (kilobytes < info.memory) {
>>> if (virDomainSetMemory(dom, kilobytes) != 0) {
>>> virDomainFree(dom);
>>> vshError(ctl, "%s", _("Unable to shrink current
>>> MemorySize"));
>>> return FALSE;
>>> }
>>> }
>>>
>>> if (virDomainSetMaxMemory(dom, kilobytes) != 0) {
>>> vshError(ctl, "%s", _("Unable to change MaxMemorySize"));
>>> ret = FALSE;
>>> }
>>> -------------------------------------------------
>>>
>>> maybe the two need to be reversed, i.e. after checking that
>>> virDomainSetMaxMemory actually is supported then we try to shrink the
>>> domain memory. It's a bit of a strange thing because it's somehow a
>>> chicken and egg problem, but you can't tell from virsh if
>>> virDomainSetMaxMemory() call is supported a priori.
>>>
>>> But I'm not too fond of changing the behaviour of existing APIs
>>> due to this. It's not that virDomainSetMaxMem() itself did the
>>> shrinking, it's virsh, and IMHO only virsh need to be fixed.
>>>
>>> More opinions ? :-)
>>
>> I didn't see any other opinions. Confining the fix to just virsh makes
>> sense to me, to not even attempt virDomainSetMemory unless we know
>> virDomainSetMaxMemory worked. But what happens if SetMaxMemory
>> successfully chops to a smaller size, but then SetMemory fails to follow
>> suit? The logic may be more complicated than just swapping the two actions.
>
> Well the thing is that if the hypervisor accepted to reduce the
> maximum memory to a given value, it should not fail to accept that
> value as the current memory usage target, that would be inconsistent
> and in this case we can report the inconsistency in good faith I think,
Yeah, I agree with this. If the hypervisor fails SetMemory after SetMaxMemory,
it seems like a hypervisor specific problem and we can report on that.
I'll cook up a patch to just change virsh.
Thanks,
--
Chris Lalancette
More information about the libvir-list
mailing list