Сбой Perl-кода после обновления с rhel6 до rhel8 - PullRequest
2 голосов
/ 19 июня 2019

Я мигрировал с сервера rhel6 с Perl 5.10 на сервер с rhel8 и perl 5.24 и 5.26.

Все работает нормально, за исключением одного сбоя Perl-программы, выполняющего оператор warn.

Используя встроенный отладчик, я отследил ошибку до строки ниже. Ввод n для перехода к завершенному выполнению подпрограммы.

File::Temp::cleanup(/usr/share/perl5/vendor_perl/File/Temp.pm:934):
934: @{ $dirs_to_unlink{$$} } = ()
DB<44> n

Не работает подфункция с оператором warn:

sub add_rec_to_db {
    my $info = shift;
    # Returns (errorcode, errormsg). No errorcode means GOOD.

    my $af_rec = Logs::stats_transform($info);
    my $lpd = Logs::db_lpd();
    my $db_file = "$lpd/persistent.db";
    my $dbh = LogsCommon::open_db($db_file);
    my $err = LogsCommon::sql_insert_or_update($dbh, $af_rec, 'all_recs', 'FID');
    if ($err) {
    if ($err =~ /database is locked/) {
        return "DATABASE_IS_LOCKED";
    }
    $err = strip_special_chars($err);
    warn "AddRecToDb: FID=$info->{REC_ID} UNRECOGNIZED_DB_ERROR: $err";
    return "UNRECOGNIZED_DB_ERROR";
    }
    return undef;
}

Программа Perl выполняется без ошибок, если я изменяю параметры, чтобы она не выполняла этот раздел кода. DBI и DBD, похоже, установлены и работают правильно. Даже для подфункции, которая аварийно завершает работу, код делает то, что должен, до оператора warn После выполнения оператора warn он должен вернуть «UNRECOGNIZED_DB_ERROR».

Использование потоков модулей для переключения с Perl 5.26 на 5.24 не решило эту проблему.

1 Ответ

1 голос
/ 20 июня 2019

Программа выходит из-за настроек карпа:

use Carp qw(confess);
$SIG{__DIE__} = \&confess;
$SIG{__WARN__} = \&confess;

Он не завершился на сервере Rhel 6, поскольку переменная $ err не была вызвана. Я опубликую новый вопрос, если не смогу определить, почему на сервере Rhel8 была поднята ошибка $ err.

...