[pve-devel] [PATCH qemu-server 02/10] add memory parser

Fiona Ebner f.ebner at proxmox.com
Thu Jan 5 13:47:48 CET 2023


Am 02.01.23 um 11:50 schrieb DERUMIER, Alexandre:
> Hi Fiona,
> 
> 
> I'm beginning to rework the patch serie 
> 
> If it's ok for you, I'll split it in differents patch series, 1 to add
> the parser, 1 for maxmem and 1 for virtio.
> 
> About this comment:
> 
> Le vendredi 16 décembre 2022 à 14:38 +0100, Fiona Ebner a écrit :
>>> diff --git a/PVE/QemuServer/Helpers.pm b/PVE/QemuServer/Helpers.pm
>>> index e91f906..9115d50 100644
>>> --- a/PVE/QemuServer/Helpers.pm
>>> +++ b/PVE/QemuServer/Helpers.pm
>>> @@ -143,8 +143,7 @@ sub version_cmp {
>>>   }
>>>   
>>>   sub config_aware_timeout {
>>> -    my ($config, $is_suspended) = @_;
>>> -    my $memory = $config->{memory};
>>> +    my ($config, $memory, $is_suspended) = @_;
>>
>> Why do you add this? Also, when you adapt the callers, you only pass
>> in
>> $config->{memory} which is already part of $config.
> 
> When I try to 
> 
> use PVE::QemuServer::Memory qw(get_current_memory);
> 
> in the Helpers.pm, to parse the $conf->{memory},
> 
> I'm getting errors in tests:
> 
> # error does not match expected error: 'Undefined subroutine
> &PVE::QemuServer::windows_version called at ../PVE/QemuServer.pm line
> 3562.
> 
> That's why I'm parsing the memory in QemuServer and send it as param
> config_aware_timeout.
> 

I suspect it's because PVE::QemuServer::Memory does a
use PVE::QemuServer;
resulting in a circular include and that seems to break the export?

The same error also shows up if I do
use PVE::QemuServer;
in PVE::QemuServer::Helpers directly.

But it's strange, because your series turns PVE::QemuServer::Memory into
an exporter and PVE::QemuServer uses it, and there it doesn't break. But
I guess we just got lucky there :/


I tried to track it down and it seems to be because
run_config2command_tests.pl does a
use PVE::QMPClient;
which in turn does a
use PVE::QemuServer::Helpers;

It seems the "early" include of Helpers invalidates the later one with qw().


A small reproducer is:

febner at pve7-dev ~/playground (git)-[master] % cat Helpers.pm
package Helpers;

use strict;
use warnings;

use Server;

use base qw(Exporter);
our @EXPORT_OK = qw(foo);
sub foo { print "foo\n"; }

1;
febner at pve7-dev ~/playground (git)-[master] % cat Server.pm
package Server;

use strict;
use warnings;

use Helpers qw(foo);

sub bar {
    foo();
}

1;
febner at pve7-dev ~/playground (git)-[master] % cat test.pl
#!/usr/bin/perl

use strict;
use warnings;

use lib qw(.);

#use Helpers;
use Server;

Server::bar();
febner at pve7-dev ~/playground (git)-[master] % ./test.pl
foo
febner at pve7-dev ~/playground (git)-[master] % vi test.pl
febner at pve7-dev ~/playground (git)-[master] % cat test.pl
#!/usr/bin/perl

use strict;
use warnings;

use lib qw(.);

use Helpers;
use Server;

Server::bar();
febner at pve7-dev ~/playground (git)-[master] % ./test.pl
Undefined subroutine &Server::foo called at Server.pm line 9.

> 
> Do you known a better way to do it ?
> 

I guess we should avoid circular use statements whenever possible, so
the current way can be fine.





More information about the pve-devel mailing list