ravada icon indicating copy to clipboard operation
ravada copied to clipboard

Ravada.pm module cyclic inclusion

Open AndrewV666 opened this issue 4 years ago • 5 comments

Ravada has cyclic inclusion problem in the following modules:

lib/Ravada.pm:use Ravada::Auth; <---------------- lib/Ravada/Auth.pm:use Ravada::Auth::SQL; | lib/Ravada/Auth/SQL.pm:use Ravada; <----------

causing a lot of "Subroutine XXX redefined at .../Ravada/Auth/SQL.pm line YYY." warnings. Probably some other modules suffer from this bug (feature)? Is there any tool to investigate such cyclic inclusions?

AndrewV666 avatar Oct 18 '21 21:10 AndrewV666

Hey @AndrewV666, good point, how do you get the warnings exactly ? I can't see them starting the service nor running the tests. Maybe I didn't spot them, sorry if I missed something obvious.

frankiejol avatar Oct 19 '21 07:10 frankiejol

Hi!

I use our (ALT Linux) rpmbuild, which automatically builds the Requires list for rpm. strace gives me the following command:

$ /usr/bin/perl -I/usr/lib/rpm -Mfake -I/usr/lib64/perl5 -I/usr/share/perl5 -I/usr/lib64/perl5 -I/usr/share/perl5 -I/etc/perl5 -I/usr/lib/perl5/vendor_perl -MO=PerlReq -- /usr/share/perl5/Ravada/Request.pm

Subroutine _init_connector redefined at /usr/share/perl5/Ravada/Request.pm line 212, <DATA> line 960. Subroutine BUILD redefined at /usr/share/perl5/Ravada/Request.pm line 224, <DATA> line 960. Subroutine _request redefined at /usr/share/perl5/Ravada/Request.pm line 228, <DATA> line 960. Subroutine open redefined at /usr/share/perl5/Ravada/Request.pm line 245, <DATA> line 960. Subroutine info redefined at /usr/share/perl5/Ravada/Request.pm line 278, <DATA> line 960. Subroutine create_domain redefined at /usr/share/perl5/Ravada/Request.pm line 305, <DATA> line 960. Subroutine remove_domain redefined at /usr/share/perl5/Ravada/Request.pm line 336, <DATA> line 960. Subroutine start_domain redefined at /usr/share/perl5/Ravada/Request.pm line 379, <DATA> line 960. Subroutine _remove_low_priority_requests redefined at /usr/share/perl5/Ravada/Request.pm line 399, <DATA> line 960. Subroutine start_clones redefined at /usr/share/perl5/Ravada/Request.pm line 430, <DATA> line 960. Subroutine pause_domain redefined at /usr/share/perl5/Ravada/Request.pm line 450, <DATA> line 960. Subroutine resume_domain redefined at /usr/share/perl5/Ravada/Request.pm line 470, <DATA> line 960. Subroutine _check_args redefined at /usr/share/perl5/Ravada/Request.pm line 484, <DATA> line 960. Subroutine force_shutdown_domain redefined at /usr/share/perl5/Ravada/Request.pm line 516, <DATA> line 960. Subroutine shutdown_domain redefined at /usr/share/perl5/Ravada/Request.pm line 538, <DATA> line 960. Subroutine force_reboot_domain redefined at /usr/share/perl5/Ravada/Request.pm line 561, <DATA> line 960. Subroutine reboot_domain redefined at /usr/share/perl5/Ravada/Request.pm line 583, <DATA> line 960. Subroutine new_request redefined at /usr/share/perl5/Ravada/Request.pm line 612, <DATA> line 960. Subroutine _duplicated_request redefined at /usr/share/perl5/Ravada/Request.pm line 621, <DATA> line 960. Subroutine _new_request redefined at /usr/share/perl5/Ravada/Request.pm line 657, <DATA> line 960. Subroutine _last_insert_id redefined at /usr/share/perl5/Ravada/Request.pm line 732, <DATA> line 960. Subroutine status redefined at /usr/share/perl5/Ravada/Request.pm line 746, <DATA> line 960. Subroutine at redefined at /usr/share/perl5/Ravada/Request.pm line 787, <DATA> line 960. Subroutine _search_domain_name redefined at /usr/share/perl5/Ravada/Request.pm line 793, <DATA> line 960. Subroutine _search_domain_id redefined at /usr/share/perl5/Ravada/Request.pm line 802, <DATA> line 960. Subroutine _send_message redefined at /usr/share/perl5/Ravada/Request.pm line 810, <DATA> line 960. Subroutine _remove_unnecessary_messages redefined at /usr/share/perl5/Ravada/Request.pm line 853, <DATA> line 960. Subroutine _remove_messages redefined at /usr/share/perl5/Ravada/Request.pm line 872, <DATA> line 960. Subroutine result redefined at /usr/share/perl5/Ravada/Request.pm line 900, <DATA> line 960. Subroutine command redefined at /usr/share/perl5/Ravada/Request.pm line 929, <DATA> line 960. Subroutine args redefined at /usr/share/perl5/Ravada/Request.pm line 955, <DATA> line 960. Subroutine arg redefined at /usr/share/perl5/Ravada/Request.pm line 971, <DATA> line 960. Subroutine defined_arg redefined at /usr/share/perl5/Ravada/Request.pm line 987, <DATA> line 960. Subroutine copy_screenshot redefined at /usr/share/perl5/Ravada/Request.pm line 1000, <DATA> line 960. Subroutine refresh_vms redefined at /usr/share/perl5/Ravada/Request.pm line 1023, <DATA> line 960. Subroutine set_base_vm redefined at /usr/share/perl5/Ravada/Request.pm line 1050, <DATA> line 960. Subroutine remove_base_vm redefined at /usr/share/perl5/Ravada/Request.pm line 1073, <DATA> line 960. Subroutine type redefined at /usr/share/perl5/Ravada/Request.pm line 1097, <DATA> line 960. Subroutine _set_priority redefined at /usr/share/perl5/Ravada/Request.pm line 1106, <DATA> line 960. Subroutine count_requests redefined at /usr/share/perl5/Ravada/Request.pm line 1125, <DATA> line 960. Subroutine requests_limit redefined at /usr/share/perl5/Ravada/Request.pm line 1144, <DATA> line 960. Subroutine domain_autostart redefined at /usr/share/perl5/Ravada/Request.pm line 1158, <DATA> line 960. Subroutine autostart_domain redefined at /usr/share/perl5/Ravada/Request.pm line 1180, <DATA> line 960. Subroutine enforce_limits redefined at /usr/share/perl5/Ravada/Request.pm line 1215, <DATA> line 960. Subroutine refresh_machine redefined at /usr/share/perl5/Ravada/Request.pm line 1245, <DATA> line 960. Subroutine _new_request_generic redefined at /usr/share/perl5/Ravada/Request.pm line 1270, <DATA> line 960. Subroutine done_recently redefined at /usr/share/perl5/Ravada/Request.pm line 1303, <DATA> line 960. Subroutine _requested redefined at /usr/share/perl5/Ravada/Request.pm line 1325, <DATA> line 960. Subroutine stop redefined at /usr/share/perl5/Ravada/Request.pm line 1352, <DATA> line 960. Subroutine _delete redefined at /usr/share/perl5/Ravada/Request.pm line 1367, <DATA> line 960. Subroutine priority redefined at /usr/share/perl5/Ravada/Request.pm line 1378, <DATA> line 960. Subroutine requirements_done redefined at /usr/share/perl5/Ravada/Request.pm line 1390, <DATA> line 960. Subroutine AUTOLOAD redefined at /usr/share/perl5/Ravada/Request.pm line 1413, <DATA> line 960. Subroutine DESTROY redefined at /usr/share/perl5/Ravada/Request.pm line 1460, <DATA> line 960.

So the magic is in the PerlReq.pm module.

AndrewV666 avatar Oct 19 '21 15:10 AndrewV666

Ok @AndrewV666 , this is pretty interesting. I thought Perl handled nicely those circular requirements, but it would be great to tidy it up a little. I came to find this module circular::require , that checks it. I installed it running cpanm circular::require , then I tested it with perl -M-circular::require script/rvd_back --no-fork. It warned about some circular inclusion indeed, though some are from Mojo and other modules. Here an interesting excerpt similar to the one you found:

Circular require detected:
  Ravada.pm
  Ravada/Auth.pm
  Ravada/Auth/SQL.pm
  Ravada/Front.pm
  Ravada.pm

I am not sure about how to fix it, maybe removing some use statements would be enough. Let me know if you have any ideas.

Thanks !

frankiejol avatar Oct 21 '21 08:10 frankiejol

Slightly reduce the number of redefined subroutines by commenting several 'use'-s:

ravada.txt

But this is not a complete solution of this problem :( Probably we'll live with them...

AndrewV666 avatar Oct 21 '21 10:10 AndrewV666

I think the most reasonable solution to this problem would be to include the referenced modules and the procedures to use, but this would require a lot of changes to the code of those modules.

By example:

use packageA;

sub call_A_from_PackageA
{
    packageA::A();
}

will be changed to:

use packageA qw(A);

sub call_A_from_PackageA
{
    A();
}

robertperez-upc avatar Oct 26 '21 09:10 robertperez-upc