RE: POE::Component::Resolver patch for PAR compatibility

[email protected] (Markus Jansen) Thu, 19 May 2011 10:35:57 +0200
Newsgroups perl.poe,perl.par
Message-ID <4682B762ECD8E9428E39B8ED2EEDF3EAE56D9096@ESESSCMS0365.eemea.ericsson.se>
Hi,

... just realized that the PAR problem practically applies to all POE programs wrapping blocking Perl objects.
Especially POE::Component::Generic is affected here.

Philip: do you see a generic way to introduce my PAR support in your module?
Are there other POE places we might want to look at?
Maybe it makes sense to even provide a generalization for wheel executables contained in the PAR archive.

Steffen and Roderich: could you please scrutinize my patch from a PAR perspective?
I know that I have been a little bit more paranoid than necessary when trying to detect whether
a) the script runs under PAR, and b) the "external Perl" version is wanted.
Regarding the calling via --reuse - is there an easier/faster way?
I also admit that a test suite is missing.

Best regards,
        Markus


_____________________________________________
From:   Markus Jansen
Sent:   Wednesday, May 18, 2011 3:38 PM
To:     Rocco Caputo
Cc:     Markus Jansen
Subject:        POE::Component::Resolver patch for PAR compatibility

Hi Rocco,

thanks for your fast answer on [email protected].

In the meantime, I have found a solution, which works both with "ordinary PAR"
(in this case resulting in forks), and "tuned PAR" (starting separate processes).
From the benchmarks at the end of this mail you can see why I clearly prefer the latter :-),
allthough it may not work under all circumstances, hence both solutions should be supported.

Please consider applying my patch (excluding my version number fake but eventually modifications/corrections to it).

Best regards,
        Markus

===========
patch
===========
diff -c /vobs/cc/CCA-perl01/perl5____________________sixtyfive_char_path/prod/lib/site_perl/5.10.1/POE/Component/Resolver.pm perl5/POE/Component/Resolver.pm
Warning: missing newline at end of file /vobs/cc/CCA-perl01/perl5____________________sixtyfive_char_path/prod/lib/site_perl/5.10.1/POE/Component/Resolver.pm
*** /vobs/cc/CCA-perl01/perl5____________________sixtyfive_char_path/prod/lib/site_perl/5.10.1/POE/Component/Resolver.pm        Wed May  4 04:39:59 2011
--- perl5/POE/Component/Resolver.pm     Wed May 18 15:22:09 2011
***************
*** 1,6 ****
  package POE::Component::Resolver;
  BEGIN {
!   $POE::Component::Resolver::VERSION = '0.912';
  }

  use warnings;
--- 1,6 ----
  package POE::Component::Resolver;
  BEGIN {
!   $POE::Component::Resolver::VERSION = '0.912_001'; # [email protected]
  }

  use warnings;
***************
*** 187,192 ****
--- 187,200 ----
        return if $heap->{shutdown};

        while (scalar(keys %{$heap->{sidecar}}) < $heap->{max_resolvers}) {
+               my $is_within_PAR;
+               {
+                       no warnings;
+                       $is_within_PAR = defined $ENV{PAR_PROGNAME}
+                                                && defined %PAR::LibCache
+                                                && defined $PAR::LibCache{$ENV{PAR_PROGNAME}};
+               }
+
                my $sidecar = POE::Wheel::Run->new(
                        StdioFilter  => POE::Filter::Reference->new(),
                        StdoutEvent  => 'sidecar_response',
***************
*** 195,200 ****
--- 203,224 ----
                        Program      => (
                                ($^O eq "MSWin32")
                                ? \&POE::Component::Resolver::Sidecar::main
+                               : ($is_within_PAR && defined $ENV{PAR_TEMP} && -x $ENV{PAR_PROGNAME}
+                                  && -f $ENV{PAR_TEMP} . '/inc/POE_Component_Resolver_Sidecar_main.pl' )
+                               ? [
+                                       $ENV{PAR_PROGNAME},
+                                       '--par-options',
+                                       '--reuse',
+                                       $ENV{PAR_TEMP} . '/inc/POE_Component_Resolver_Sidecar_main.pl'
+                                       # POE_Component_Resolver_Sidecar_main.pl script consisting of the 2 next lines, added via pp option -a
+                                       # use POE::Component::Resolver::Sidecar;
+                                       # POE::Component::Resolver::Sidecar->main();
+                               ]
+                               : $is_within_PAR
+                               ? sub { # line breaks temporarily needed for Module::ScanDeps
+                                           require POE::Component::Resolver::Sidecar;
+                                           POE::Component::Resolver::Sidecar->main();
+                                 }
                                : [
                                        $^X,
                                        (map { "-I$_" } @INC),
***************
*** 674,677 ****
  software; you may redistribute it and/or modify it under the same
  terms as Perl itself.

! =cut
--- 698,701 ----
  software; you may redistribute it and/or modify it under the same
  terms as Perl itself.

! =cut

===========
benchmarks
===========
test results with PAR and external processes (via PAR --reuse):
-----
 12966 user     1  59    0   79M   72M sleep    0:03  0.00% ccsecsrv_sp_mai
 12984 user     1  59    0   24M   22M sleep    0:01  0.00% ccsecsrv_sp_mai
 12976 user     1  59    0   24M   22M sleep    0:01  0.00% ccsecsrv_sp_mai
 12977 user     1  59    0   24M   22M sleep    0:01  0.00% ccsecsrv_sp_mai
 12983 user     1  59    0   24M   22M sleep    0:01  0.00% ccsecsrv_sp_mai
 12978 user     1  59    0   24M   22M sleep    0:01  0.00% ccsecsrv_sp_mai
 12974 user     1  59    0   24M   22M sleep    0:01  0.00% ccsecsrv_sp_mai
 12973 user     1  59    0   24M   22M sleep    0:01  0.00% ccsecsrv_sp_mai
 12975 user     1  59    0   24M   22M sleep    0:01  0.00% ccsecsrv_sp_mai
-----
 12966 user     1  59    0   79M   72M sleep    0:03  0.00% ccsecsrv_sp_mai
-----

test results: with PAR and fork():
-----
  4886 user     1  59    0   79M   72M sleep    0:04  0.00% ccsecsrv_sp_mai
  4904 user     1  59    0   79M   68M sleep    0:00  0.00% ccsecsrv_sp_mai
  4903 user     1  59    0   79M   67M sleep    0:00  0.00% ccsecsrv_sp_mai
  4901 user     1  59    0   79M   67M sleep    0:00  0.00% ccsecsrv_sp_mai
  4900 user     1  59    0   79M   67M sleep    0:00  0.00% ccsecsrv_sp_mai
  4899 user     1  59    0   79M   67M sleep    0:00  0.00% ccsecsrv_sp_mai
  4894 user     1  59    0   79M   67M sleep    0:00  0.00% ccsecsrv_sp_mai
  4893 user     1  59    0   79M   67M sleep    0:00  0.00% ccsecsrv_sp_mai
-----
  4886 user     1  59    0   79M   72M sleep    0:04  0.00% ccsecsrv_sp_mai
-----


 << OLE Object: Picture (Metafile) >>

Markus Jansen

Ericsson GmbH
Eurolab R&D
Ericsson Allee 1
52134 Herzogenrath, Germany
Phone +49 2407 575 5157
Fax +49 22407 575 150
Mobile +49 172 2742003
[email protected]
www.ericsson.com

 << OLE Object: Picture (Metafile) >>

Ericsson GmbH. Sitz: Düsseldorf. Registergericht: Amtsgericht Düsseldorf, HRB 33012. Geschäftsführer: Stefan Koetz (Vors.), Nils de Baar, Bernd Schmidt. Aufsichtsratsvorsitzender: Anders Runevad.

This Communication is confidential. We only send and receive email on the basis of the terms set out at www.ericsson.com/email_disclaimer<http://www.ericsson.com/email_disclaimer>.