[libvirt] [PATCH] LXC: Fix the output units of ram filesystem size
Daniel P. Berrange
berrange at redhat.com
Wed Oct 9 09:49:23 UTC 2013
On Wed, Oct 09, 2013 at 11:40:35AM +0200, Ján Tomko wrote:
> On 10/08/2013 07:43 PM, Eric Blake wrote:
> > On 10/08/2013 11:28 AM, Ján Tomko wrote:
> >> Commit 76b644c added support for adding RAM filesystems to LXC
> >> domains, with a syntax of:
> >> <source usage='10' unit='MiB'/>
> >> where default unit would be KiB per documentation, however the
> >> XML parser treated sizes without units as bytes.
> >>
> >> When formatting the XML, this was divided by 1024, but the KiB units
> >> were put inside the 'units' attribute, as opposed to the 'unit'
> >> attribute the parser looks for.
> >>
> >> The code generating the mount options assumed the size in the domain
> >> definition to be in KiB, despite it being parsed as B. This worked
> >> as long as exaclty one re-format of the XML happened (for domains that
> >> were just created).
> >>
> >> Change the XML output to bytes and fix the documentation.
> >
> > We still have libvirt in the wild that outputs bogus units= in the XML;
> > that should still pass the RelaxNG grammar even if it is otherwise ignored.
> >
> >> <code>name</code> attribute must be used with
> >> <code>type='template'</code>, and the <code>dir</code> attribute must
> >> be used with <code>type='mount'</code>. The <code>usage</code> attribute
> >> - is used with <code>type='ram'</code> to set the memory limit in KB.
> >> + is used with <code>type='ram'</code> to set the memory limit in bytes.
> >
> > If the RelaxNG is fixed to parse the broken output, then this could
> > document that <code>units</code> is ignored.
> >
>
> >> +++ b/src/conf/domain_conf.c
> >> @@ -14764,8 +14764,8 @@ virDomainFSDefFormat(virBufferPtr buf,
> >> break;
> >>
> >> case VIR_DOMAIN_FS_TYPE_RAM:
> >> - virBufferAsprintf(buf, " <source usage='%lld' units='KiB'/>\n",
> >> - def->usage / 1024);
> >> + virBufferAsprintf(buf, " <source usage='%lld' unit='B'/>\n",
> >> + def->usage);
> >
> > Wait. This says older libvirt was outputting k, not bytes. If that's
> > true, then we MUST continue to output k.
> >
>
> I agree. Even though the number was output in to MiB, GiB, ... after the
> definition was copied, but the output was in KiB for domains that had a chance
> of working correclty (transient and freshly-defined persistent domains seem to
> be).
>
> >> diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
> >> index b1f429c..7c722cc 100644
> >> --- a/src/lxc/lxc_container.c
> >> +++ b/src/lxc/lxc_container.c
> >> @@ -1428,7 +1428,7 @@ static int lxcContainerMountFSTmpfs(virDomainFSDefPtr fs,
> >> VIR_DEBUG("usage=%lld sec=%s", fs->usage, sec_mount_options);
> >>
> >> if (virAsprintf(&data,
> >> - "size=%lldk%s", fs->usage, sec_mount_options) < 0)
> >> + "size=%lld%s", fs->usage, sec_mount_options) < 0)
> >
> > I'm also not convince on this change - if the XML contains k by default,
> > then we must continue to pass k to the mount command.
> >
>
> This does not depend on the XML default, but on the internal unit.
>
> Libvirtd outputs the size in KiB, but since 'units' is ignored by the parser,
> libvirt_lxc just puts the raw number in 'usage', making KiB its internal unit.
>
> If we fix the formatter and/or parser to correctly read the value it just
> printed, we will need to either get rid of this 'k' or store it in KiB internally.
This code was added for the benefit of libvirt-sandbox and that is the
main (possibly only) user of this feature currently.
It passes in XML that says
<filesystem type="ram" accessmode="passthrough">
<source usage="10485760" units="bytes"/>
<target dir="/run"/>
</filesystem>
and this translates to a sandbox with a 10MB mount
# cat /proc/mounts | grep /run
tmpfs /run tmpfs rw,context=system_u:object_r:svirt_sandbox_file_t:s0,nosuid,nodev,relatime,size=10240k 0 0
And this is reflected in the output XML
<filesystem type='ram' accessmode='passthrough'>
<source usage='10240' units='KiB'/>
<target dir='/run'/>
</filesystem>
So IMHO we need to fix the parser to honour the 'units' attribute.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list