Perl5: есть ли способ восстановления после ошибки «Ошибка памяти (coredump)»? - PullRequest
1 голос
/ 11 января 2011

Я пытаюсь подключиться к некоторой БД и получить некоторые данные. и требование следующее: если соединение с БД не удается, я вернусь к некоторому файловому подходу.

Проблема, однако, заключается в следующем: каждый раз, когда происходит сбой соединения с БД, программа завершается с ошибкой «Ошибка памяти (coredump)», и она не переходит к файловому подходу.

Я пробовал "eval {} или do {};" который тоже не работает (то есть останавливается при ошибке памяти). Любая идея о том, как я могу восстановить "Ошибка памяти (coredump)"? Большое спасибо.

Итак, вот проблемный код:

 my $db =
 "dbi:Sybase:server=$dbserver;database=$dbname;kerberos=$dbKerbPrincipal";
 my $dbh = DBI->connect($db, '', ''); 
 # BANG! if $dbname doesn't exist, you get the Memory fault,
 # and can't recover from it.

Итак, я явно выбрал неправильное имя БД, просто чтобы разорвать соединение с БД, а затем проверить следующие функции «отработки отказа». Но я не могу быть восстановлен после вышеупомянутого вызова "DBI-> connect ()".

Ответы [ 2 ]

4 голосов
/ 11 января 2011

Perl + DBI + DBD :: Sybase не должен быть сбой.Период.

Вы должны сообщить о проблеме на правильном форуме - в списке рассылки dbi-users@perl.org.Когда вы сообщаете о проблеме, вы должны процитировать версии - операционной системы, Perl, DBI, DBD :: Sybase, библиотек Sybase и сервера Sybase (да, вам нужно знать версии многих вещей при работе с Perlи DBI).

Можете ли вы надежно подключиться к вашему серверу БД с помощью обычных программ Sybase с того же компьютера, на котором работает ваш Perl?Вы подключаетесь к соединениям Kerberos?

Эта информация, вероятно, будет критической.Вполне возможно, что вы тестируете что-то, что раньше не тестировалось;Я не уверен, насколько распространены подключения с проверкой подлинности Kerberos.

2 голосов
/ 11 января 2011

Прежде всего, я согласен с предыдущими постерами и комментаторами - обычно, вы не должны получать ошибки в этой ситуации, и правильное исправление - выяснить, почему это ошибки и исправления (вполне может быть ошибкой библиотеки, так какДжонатан сказал).

ОДНАКО, чтобы ответить на ваш прямой технический вопрос, вы НЕ МОЖЕТЕ восстановить интерпретатор Perl (или любую другую программу для этого материала), как только он выйдет из строя.В любом случае, вы не ХОТИТЕ ХОЧЕТСЯ - скорее всего, в грязном состоянии.

Поэтому вы решаете свою проблему с помощью «резервного» механизма второго процесса, готового собрать разбитые фрагменты и убедиться, что шоу продолжается, следующим образом:

  • Непосредственно перед попыткой соединения с БД вы отключаете дочерний процесс.

    Обратите внимание, что вам может потребоваться демонизировать дочерний процесс сразу после разветвления, поскольку смерть родителей может убить ребенка.Сейчас около 2 часов ночи, поэтому мой мозг слишком спит, чтобы быть уверенным, так это или нет.Если это так, то демонизация неоднократно описывалась в SO.

  • Родительский процесс пытается подключиться к БД, по тайм-ауту по стандартному сигналу Perl (установлен наскажем, 10 секунд или все, что вы хотите).

  • Если соединение было успешным, оно отправляет дочернему сигнал, чтобы указать, что соединение с БД в порядке, и родительский код может продолжаться как обычно.

    В случае сбоя соединения родительский узел либо выполняет coredumps, либо выдает die, предполагая, что соединение не было выполнено не coredump или истекло время ожидания.

  • ChildПроцесс, сразу после разветвления, устанавливает обработчик сигнала для перехвата родительского сигнала «Соединение с БД установлено успешно», а затем устанавливает тревогу на 10 + epsilon секунд.

  • Если дочерний процесс перехватывает родительский сигнал «Соединение с БД установлено успешно», дочерний процесс умирает.

  • С другой стороны, если сработал обработчик тревоги дочернего процесса, это означает, что родитель не может«тподключиться к БД.Поэтому дочерний процесс отправляет родителю сигнал «Я собираюсь выполнить аварийное переключение»;и затем выполнить логику переключения при необходимости

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

ОБНОВЛЕНИЕ

Как отмечено в комментариях, вариант выше, где процесс CHILD пытается установить соединение с БД и родительский процессловит проблемы и действует как запасной вариант, который может быть несколько проще реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...