Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix the backend exiting - exit is going back to perl, we want to kill it #519

Merged
merged 1 commit into from Jun 17, 2016

Conversation

coolo
Copy link
Contributor

@coolo coolo commented Jun 16, 2016

No description provided.

@aaannz
Copy link
Contributor

aaannz commented Jun 16, 2016

What do you mean by 'going back to perl'. Do we need to avoid running 'END' section? According to perldoc, not even perls exit can't abort exiting.

@coolo
Copy link
Contributor Author

coolo commented Jun 16, 2016

unless these ENDs do a select without timeout. I blame autodie, but I couldn't prove that.

@aaannz
Copy link
Contributor

aaannz commented Jun 16, 2016

Indeed. In that case 👍

Btw. do you know some perl flag to trigger debug printing of perl itself to check what is being executed? And that it prints what sections (from which module) it is entering? Once I played with perl -D flags, maybe perl -DB would help here. Any experience?

@coolo
Copy link
Contributor Author

coolo commented Jun 16, 2016

As isotovideo still wouldn't abort fully, I traced it:

checking backend state ...
waitpid 3152 returned 0
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:70:     my $now = steady_time;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Util.pm:76:   ? sub () { Time::HiRes::clock_gettime(Time::HiRes::CLOCK_MONOTONIC()) }
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/Time/HiRes.pm:49:    *$AUTOLOAD = sub { $val };
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:71:     for my $id (keys %{$self->{timers}}) {
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:71:     for my $id (keys %{$self->{timers}}) {
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:72:       next unless my $t = $self->{timers}{$id};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:73:       next unless $t->{time} <= $now;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:76:       if (exists $t->{recurring}) { $t->{time} = $now + $t->{recurring} }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:76:       if (exists $t->{recurring}) { $t->{time} = $now + $t->{recurring} }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:81:       ++$i and $self->_try('Timer', $t->{cb}) if $t->{cb};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:142:   my ($self, $what, $cb) = (shift, shift, shift);
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:143:   eval { $self->$cb(@_); 1 } or $self->emit(error => "$what failed: $@");
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:143:   eval { $self->$cb(@_); 1 } or $self->emit(error => "$what failed: $@");
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:221:   return $self->reactor->$method($after => sub { $self->$cb });
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Server/Daemon.pm:40:   my $int = $loop->recurring(1 => sub { });
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:143:   eval { $self->$cb(@_); 1 } or $self->emit(error => "$what failed: $@");
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:31:   my $self = shift;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:34:   local $self->{running} = 1 unless $self->{running};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:37:   my $i;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:38:   until ($i || !$self->{running}) {
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:41:     return $self->stop unless keys %{$self->{timers}} || keys %{$self->{io}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:41:     return $self->stop unless keys %{$self->{timers}} || keys %{$self->{io}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:44:     my $min = min map { $_->{time} } values %{$self->{timers}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:44:     my $min = min map { $_->{time} } values %{$self->{timers}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:44:     my $min = min map { $_->{time} } values %{$self->{timers}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:45:     my $timeout = defined $min ? $min - steady_time : 0.5;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Util.pm:76:   ? sub () { Time::HiRes::clock_gettime(Time::HiRes::CLOCK_MONOTONIC()) }
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/Time/HiRes.pm:49:    *$AUTOLOAD = sub { $val };
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:46:     $timeout = $timeout <= 0 ? 0 : int($timeout * 1000) + 1;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:49:     if (keys %{$self->{io}}) {
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:49:     if (keys %{$self->{io}}) {
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:50:       my @poll = map { $_ => $self->{io}{$_}{mode} } keys %{$self->{io}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:50:       my @poll = map { $_ => $self->{io}{$_}{mode} } keys %{$self->{io}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:50:       my @poll = map { $_ => $self->{io}{$_}{mode} } keys %{$self->{io}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:53:       if (IO::Poll::_poll($timeout, @poll) > 0) {
13:17:25.9292 isotovideo done
killing commands process
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Server/Daemon.pm:41:   local $SIG{INT} = local $SIG{TERM} = sub { $loop->stop };
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:140: sub stop { _instance(shift)->reactor->stop }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:166: sub _instance { ref $_[0] ? $_[0] : $_[0]->singleton }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Base.pm:43:           exists $_[0]{$attr} ? $_[0]{$attr} : ($_[0]{$attr} = $value->($_[0]))
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:102: sub stop { delete shift->{running} }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:70:     my $now = steady_time;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Util.pm:76:   ? sub () { Time::HiRes::clock_gettime(Time::HiRes::CLOCK_MONOTONIC()) }
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/Time/HiRes.pm:49:    *$AUTOLOAD = sub { $val };
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:71:     for my $id (keys %{$self->{timers}}) {
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:71:     for my $id (keys %{$self->{timers}}) {
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:72:       next unless my $t = $self->{timers}{$id};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:73:       next unless $t->{time} <= $now;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Server/Daemon.pm:43:   $loop->remove($int);
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:94:   my ($self, $id) = (_instance(shift), @_);
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:166: sub _instance { ref $_[0] ? $_[0] : $_[0]->singleton }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:95:   my $c = $self->{in}{$id} || $self->{out}{$id};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:96:   if ($c && (my $stream = $c->{stream})) { return $stream->close_gracefully }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:97:   $self->_remove($id);
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:187:   my ($self, $id) = @_;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:190:   return unless my $reactor = $self->reactor;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Base.pm:43:           exists $_[0]{$attr} ? $_[0]{$attr} : ($_[0]{$attr} = $value->($_[0]))
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:191:   return if $reactor->remove($id);
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:89:   my ($self, $remove) = @_;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:90:   return !!delete $self->{timers}{$remove} unless ref $remove;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Server/Daemon.pm:22:   return if Mojo::Util::_global_destruction();
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Util.pm:379:   defined ${^GLOBAL_PHASE} && ${^GLOBAL_PHASE} eq 'DESTRUCT';
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Server/Daemon.pm:23:   my $self = shift;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Server/Daemon.pm:24:   $self->_remove($_) for keys %{$self->{connections} || {}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Server/Daemon.pm:24:   $self->_remove($_) for keys %{$self->{connections} || {}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Server/Daemon.pm:25:   my $loop = $self->ioloop;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Base.pm:43:           exists $_[0]{$attr} ? $_[0]{$attr} : ($_[0]{$attr} = $value->($_[0]))
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Server/Daemon.pm:26:   $loop->remove($_) for @{$self->acceptors};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Server/Daemon.pm:26:   $loop->remove($_) for @{$self->acceptors};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Base.pm:43:           exists $_[0]{$attr} ? $_[0]{$attr} : ($_[0]{$attr} = $value->($_[0]))
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:94:   my ($self, $id) = (_instance(shift), @_);
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:166: sub _instance { ref $_[0] ? $_[0] : $_[0]->singleton }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:95:   my $c = $self->{in}{$id} || $self->{out}{$id};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:96:   if ($c && (my $stream = $c->{stream})) { return $stream->close_gracefully }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:97:   $self->_remove($id);
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:187:   my ($self, $id) = @_;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:190:   return unless my $reactor = $self->reactor;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Base.pm:43:           exists $_[0]{$attr} ? $_[0]{$attr} : ($_[0]{$attr} = $value->($_[0]))
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:191:   return if $reactor->remove($id);
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:89:   my ($self, $remove) = @_;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:90:   return !!delete $self->{timers}{$remove} unless ref $remove;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:195:     if delete $self->{acceptors}{$id};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:178:   my $self = shift;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:179:   return $self unless delete $self->{accepting};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:180:   $_->stop for values %{$self->{acceptors} || {}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:180:   $_->stop for values %{$self->{acceptors} || {}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:181:   return $self;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:171:   my $self = shift;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:172:   return if $self->{accepting} || $self->_limit;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:168: sub _limit { $_[0]{stop} ? 1 : $_[0]->_in >= $_[0]->max_connections }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:164: sub _in { scalar keys %{shift->{in} || {}} }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:164: sub _in { scalar keys %{shift->{in} || {}} }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Base.pm:51:         return exists $_[0]{$attr} ? $_[0]{$attr} : ($_[0]{$attr} = $value)
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:173:   $_->start for values %{$self->{acceptors} || {}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:173:   $_->start for values %{$self->{acceptors} || {}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop.pm:174:   $self->{accepting} = 1;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop/Server.pm:28:   my $self = shift;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop/Server.pm:29:   $ENV{MOJO_REUSE} =~ s/(?:^|\,)\Q$self->{reuse}\E// if $self->{reuse};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop/Server.pm:30:   return unless my $reactor = $self->reactor;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Base.pm:43:           exists $_[0]{$attr} ? $_[0]{$attr} : ($_[0]{$attr} = $value->($_[0]))
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop/Server.pm:31:   $self->stop if $self->{handle};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop/Server.pm:120: sub stop { delete($_[0]{active}) and $_[0]->reactor->remove($_[0]{handle}) }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Base.pm:43:           exists $_[0]{$attr} ? $_[0]{$attr} : ($_[0]{$attr} = $value->($_[0]))
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:89:   my ($self, $remove) = @_;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:90:   return !!delete $self->{timers}{$remove} unless ref $remove;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Reactor/Poll.pm:91:   return !!delete $self->{io}{fileno $remove};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop/Server.pm:32:   $reactor->remove($_) for values %{$self->{handles}};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/IOLoop/Server.pm:32:   $reactor->remove($_) for values %{$self->{handles}};
>> /suse/coolo/prod/os-autoinst/commands.pm:243:         exit(0);
>> /usr/lib/perl5/5.24.0/File/Temp.pm:737:     local($., $@, $!, $^E, $?);
>> /usr/lib/perl5/5.24.0/File/Temp.pm:738:     cleanup(at_exit => 1);
>> /usr/lib/perl5/5.24.0/File/Temp.pm:744:     my %h = @_;
>> /usr/lib/perl5/5.24.0/File/Temp.pm:745:     my $at_exit = delete $h{at_exit};
>> /usr/lib/perl5/5.24.0/File/Temp.pm:746:     $at_exit = 0 if not defined $at_exit;
>> /usr/lib/perl5/5.24.0/File/Temp.pm:747:     { my @k = sort keys %h; die "unrecognized parameters: @k" if @k }
>> /usr/lib/perl5/5.24.0/File/Temp.pm:747:     { my @k = sort keys %h; die "unrecognized parameters: @k" if @k }
>> /usr/lib/perl5/5.24.0/File/Temp.pm:747:     { my @k = sort keys %h; die "unrecognized parameters: @k" if @k }
>> /usr/lib/perl5/5.24.0/File/Temp.pm:749:     if (!$KEEP_ALL) {
>> /usr/lib/perl5/5.24.0/File/Temp.pm:752:                    @{ $files_to_unlink{$$} } : () );
>> /usr/lib/perl5/5.24.0/File/Temp.pm:753:       foreach my $file (@files) {
>> /usr/lib/perl5/5.24.0/File/Temp.pm:767:                   @{ $dirs_to_unlink{$$} } : () );
>> /usr/lib/perl5/5.24.0/File/Temp.pm:768:       my ($cwd, $cwd_to_remove);
>> /usr/lib/perl5/5.24.0/File/Temp.pm:769:       foreach my $dir (@dirs) {
>> /usr/lib/perl5/5.24.0/File/Temp.pm:789:       if (defined $cwd_to_remove) {
>> /usr/lib/perl5/5.24.0/File/Temp.pm:801:         if exists $files_to_unlink{$$};
>> /usr/lib/perl5/5.24.0/File/Temp.pm:803:         if exists $dirs_to_unlink{$$};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojolicious/Plugin/EPRenderer.pm:7: sub DESTROY { Mojo::Util::_teardown(shift->{namespace}) }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Util.pm:441:   return unless my $class = shift;
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Util.pm:445:   @{"${class}::ISA"} = ();
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Util.pm:445:   @{"${class}::ISA"} = ();
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojo/Util.pm:446:   delete_package $class;
>> /usr/lib/perl5/5.24.0/Symbol.pm:142:     my $pkg = shift;
>> /usr/lib/perl5/5.24.0/Symbol.pm:146:     unless ($pkg =~ /^main::.*::$/) {
>> /usr/lib/perl5/5.24.0/Symbol.pm:147:         $pkg = "main$pkg"       if      $pkg =~ /^::/;
>> /usr/lib/perl5/5.24.0/Symbol.pm:148:         $pkg = "main::$pkg"     unless  $pkg =~ /^main::/;
>> /usr/lib/perl5/5.24.0/Symbol.pm:149:         $pkg .= '::'            unless  $pkg =~ /::$/;
>> /usr/lib/perl5/5.24.0/Symbol.pm:152:     my($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/;
>> /usr/lib/perl5/5.24.0/Symbol.pm:153:     my $stem_symtab = *{$stem}{HASH};
>> /usr/lib/perl5/5.24.0/Symbol.pm:153:     my $stem_symtab = *{$stem}{HASH};
>> /usr/lib/perl5/5.24.0/Symbol.pm:154:     return unless defined $stem_symtab and exists $stem_symtab->{$leaf};
>> /usr/lib/perl5/5.24.0/Symbol.pm:159:     my $leaf_symtab = *{$stem_symtab->{$leaf}}{HASH};
>> /usr/lib/perl5/5.24.0/Symbol.pm:159:     my $leaf_symtab = *{$stem_symtab->{$leaf}}{HASH};
>> /usr/lib/perl5/5.24.0/Symbol.pm:160:     foreach my $name (keys %$leaf_symtab) {
>> /usr/lib/perl5/5.24.0/Symbol.pm:161:         undef *{$pkg . $name};
>> /usr/lib/perl5/5.24.0/Symbol.pm:161:         undef *{$pkg . $name};
>> /usr/lib/perl5/5.24.0/Symbol.pm:166:     %$leaf_symtab = ();
>> /usr/lib/perl5/5.24.0/Symbol.pm:167:     delete $stem_symtab->{$leaf};
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojolicious/Renderer.pm:23: sub DESTROY { Mojo::Util::_teardown($_) for @{shift->{namespaces}} }
>> /usr/lib/perl5/vendor_perl/5.24.0/Mojolicious/Renderer.pm:23: sub DESTROY { Mojo::Util::_teardown($_) for @{shift->{namespaces}} }
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:175:     my ($self, $args) = @_;
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:176:     $args ||= {};    # default
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:178:     my $cmd = our $AUTOLOAD;
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:179:     $cmd =~ s,.*::,,;
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:181:     unless (ref($args) eq 'HASH') {
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:187:     *$AUTOLOAD = sub { my ($self, $args) = @_; return $self->_send_json({cmd => $cmd, arguments => $args}); };
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:188:     goto &$AUTOLOAD;     # Restart the new routine.
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:187:     *$AUTOLOAD = sub { my ($self, $args) = @_; return $self->_send_json({cmd => $cmd, arguments => $args}); };
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:187:     *$AUTOLOAD = sub { my ($self, $args) = @_; return $self->_send_json({cmd => $cmd, arguments => $args}); };
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:194:     my $self = shift;
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:195:     my $cmd  = shift;
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:200:     my $JSON = JSON->new()->convert_blessed();
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:201:     my $json = $JSON->encode($cmd);
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:203:     croak "no backend running" unless ($self->{to_child});
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:204:     my $wb = syswrite($self->{to_child}, "$json");
>> /usr/lib/perl5/5.24.0/Fatal.pm:1487:         my $caller_level = 0;
>> /usr/lib/perl5/5.24.0/Fatal.pm:1488:         my $caller;
>> /usr/lib/perl5/5.24.0/Fatal.pm:1490:         while ( ($caller = (caller $caller_level)[1]) =~ m{^\(eval \d+\)$} ) {
>> /usr/lib/perl5/5.24.0/Fatal.pm:1501:         if ($caller eq $filename) {
>> /usr/lib/perl5/5.24.0/Fatal.pm:1504:             if (!defined($wrapped_sub)) {
>> /usr/lib/perl5/5.24.0/Fatal.pm:1540:             goto $wrapped_sub;
>> (eval 143)[/usr/lib/perl5/5.24.0/Fatal.pm:1653]:3:           if (@_ == 2) {
>> (eval 143)[/usr/lib/perl5/5.24.0/Fatal.pm:1653]:8:         if (wantarray) {
>> (eval 143)[/usr/lib/perl5/5.24.0/Fatal.pm:1653]:29:         my $retval  = CORE::syswrite($_[0], $_[1]);
>> (eval 143)[/usr/lib/perl5/5.24.0/Fatal.pm:1653]:30:         my $context = "scalar";
>> (eval 143)[/usr/lib/perl5/5.24.0/Fatal.pm:1653]:34:         die autodie->throw(
>> (eval 143)[/usr/lib/perl5/5.24.0/Fatal.pm:1653]:42:         return $retval;
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:205:     die "syswrite failed $!" unless ($wb == length($json));
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:207:     my $rsp = _read_json($self->{from_child});
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:222:     my ($socket) = @_;
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:224:     my $JSON = JSON->new();
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:226:     my $fd = fileno($socket);
>> /usr/lib/perl5/5.24.0/Fatal.pm:1487:         my $caller_level = 0;
>> /usr/lib/perl5/5.24.0/Fatal.pm:1488:         my $caller;
>> /usr/lib/perl5/5.24.0/Fatal.pm:1490:         while ( ($caller = (caller $caller_level)[1]) =~ m{^\(eval \d+\)$} ) {
>> /usr/lib/perl5/5.24.0/Fatal.pm:1501:         if ($caller eq $filename) {
>> /usr/lib/perl5/5.24.0/Fatal.pm:1504:             if (!defined($wrapped_sub)) {
>> /usr/lib/perl5/5.24.0/Fatal.pm:1540:             goto $wrapped_sub;
>> (eval 139)[/usr/lib/perl5/5.24.0/Fatal.pm:1653]:7:         if (wantarray) {
>> (eval 139)[/usr/lib/perl5/5.24.0/Fatal.pm:1653]:28:         my $retval  = CORE::fileno($_[0]);
>> (eval 139)[/usr/lib/perl5/5.24.0/Fatal.pm:1653]:29:         my $context = "scalar";
>> (eval 139)[/usr/lib/perl5/5.24.0/Fatal.pm:1653]:33:         die autodie->throw(
>> (eval 139)[/usr/lib/perl5/5.24.0/Fatal.pm:1653]:41:         return $retval;
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:227:     if (exists $sockets->{$fd}) {
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:229:         $JSON->incr_parse($sockets->{$fd});
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:230:         delete $sockets->{$fd};
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:233:     my $s = IO::Select->new();
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:24:  my $self = shift;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:25:  my $type = ref($self) || $self;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:27:  my $vec = bless [undef,0], $type;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:29:  $vec->add(@_)
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:32:  $vec;
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:234:     $s->add($socket);
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:37:  shift->_update('add', @_);
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:66:  my $vec = shift;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:67:  my $add = shift eq 'add';
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:69:  my $bits = $vec->[VEC_BITS];
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:70:  $bits = '' unless defined $bits;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:72:  my $count = 0;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:73:  my $f;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:74:  foreach $f (@_)
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:76:    my $fn = $vec->_fileno($f);
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:58:  my($self, $f) = @_;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:59:  return unless defined $f;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:60:  $f = $f->[0] if ref($f) eq 'ARRAY';
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:61:  ($f =~ /^\d+$/) ? $f : fileno($f);
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:77:    if ($add) {
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:78:      next unless defined $fn;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:79:      my $i = $fn + FIRST_FD;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:80:      if (defined $vec->[$i]) {
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:84:      $vec->[FD_COUNT]++;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:85:      vec($bits, $fn, 1) = 1;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:86:      $vec->[$i] = $f;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:108:    $count++;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:110:  $vec->[VEC_BITS] = $vec->[FD_COUNT] ? $bits : undef;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:111:  $count;
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:236:     my $hash;
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:243:     while (1) {
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:244:         $hash = $JSON->incr_parse();
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:245:         if ($hash) {
>> /suse/coolo/prod/os-autoinst/backend/driver.pm:256:         my @res = $s->can_read;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:116:  my $vec = shift;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:117:  my $timeout = shift;
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:118:  my $r = $vec->[VEC_BITS];
>> /usr/lib/perl5/5.24.0/x86_64-linux-thread-multi/IO/Select.pm:120:  defined($r) && (select($r,undef,undef,$timeout) > 0)

@coolo
Copy link
Contributor Author

coolo commented Jun 16, 2016

spot how this triggers it:

  os-autoinst/commands.pm:243:         exit(0);

The same as with the other process

exit is calling all kind of exit handlers including the one of libusb, which
tries to close some monitoring that it started on library load (very strange
concept). As we fork off the data from isotovideo, we inherit all this but
can't (and shouldn't) erase it in the childs. So use _exit

On top of that perl 5.24 introduced AUTOLOADing DESTROY, which causes funny
deadlocks - so have an explit DESTROY, even when no longer DESTROYing due
to _exit (but safer is safer)
@coolo coolo merged commit d97cd69 into master Jun 17, 2016
@coolo coolo deleted the fix_backend_exit branch June 17, 2016 07:57
@okurz
Copy link
Member

okurz commented Jun 17, 2016

you think this could help or actually fix https://progress.opensuse.org/issues/12178 ?

@coolo
Copy link
Contributor Author

coolo commented Jun 18, 2016

I seriously don't know. The AUTOLOAD on DESTROY is definitely something new to perl 5.24, but the libusb pthread mess could actually be affected there too. So possibly, yes.

@nilxam
Copy link
Member

nilxam commented Jun 18, 2016

I do remember have seen the similar change while I read perldelta...

@nilxam
Copy link
Member

nilxam commented Jun 18, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants