Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Mojolicious проблема соединения с PostgreSQL, Посредством has dbhandler {...} 
:(
    Опции темы
GoDleSS
  Дата 14.9.2012, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 11.2.2007
Где: Пироговский

Репутация: нет
Всего: 2



Бодрого дня, коллеги!

Прошу помощи в поиске деталей проблемы[ и ее решении].

Есть простой PRC сервис на Mojolicious, в рабочем режиме запускает с помощью гипножабы для обеспечения многопоточности.

В соответствии с рекомендациями в документации, соединения с 2 СУБД устанавливается в стартовом модуле через has
Если упрощенно (в таком режиме проверял также):
Код

# Init DBH Oracle
has dbhandler => sub {
    my $self = shift;

    my $dbh = DBI->connect("dbi:Oracle:database=...;host=...;port=...", "...", "...");
    $dbh->{AutoCommit} = 1;

    return $dbh;
};

# Init DBH Pg
has dbhandlerPg => sub {
    my $self = shift;
    
    my $dbh = DBI->connect("dbi:Pg:database=...;host=...;port=...", "...", "...");
    
    return $dbh;
};


В контроллере вызывается, соответственно:
Код

$dbh = $self->app->dbhandler;
...
$dbh_pg = $self->app->dbhandlerPg;


С Oracle соединяется без проблем. Но понадобился еще и постгрес, т.к. есть сервер СУБД с ним, на котором "вкусные" данные лежат.
С Postgresql соединение не устанавливается, никаких понятных ошибок не получаю и даже упаковка соединения в eval {} не спасает от смерти поток, который посмел постучать в сторону постгреса.
Притом, соединение с постгресом с консоли perl -e 'use DBI; ...', из скриптов на чистом перле, с клиентов устанавливается "на ура".

Бегает все добро на debian 6, perl 5.10.1, Mojolicious 3.40
Также запускал на debian 5, perl 5.10.0, Mojolicious 1.16 (или 1.14, не помню; с другой "оберткой" из-за изменений в Mojo) - проблема сохраняется.

Запуск под родным daemon, под Morbo проблему не решают и больше данных не выдают.
Выбить что-либо с помощью того же Devel::Backtrace не вышло.

Решил пока проблему с помощью костыля (консольный вызов внешнего скрипта с аргументами, который возвращает данные упакованные в json). Но хотелось бы решить по человечески.

Не очень понимаю в какую сторону далее думать - буду благодарен советам.

Это сообщение отредактировал(а) GoDleSS - 14.9.2012, 13:22
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
krypt3r
Дата 14.9.2012, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: нет
Всего: 16



RaiseError => 1
DBI->connect (...) or die(DBI->errstr);
Чтобы получить "внятные ошибки"
PM MAIL   Вверх
GoDleSS
Дата 14.9.2012, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 11.2.2007
Где: Пироговский

Репутация: нет
Всего: 2



Цитата(krypt3r @ 14.9.2012,  14:27)
RaiseError => 1
DBI->connect (...) or die(DBI->errstr);
Чтобы получить "внятные ошибки"

Пробовал - бесполезно, не доходит до || die.
С логированием:
Код

has dbhandlerPg => sub {
    my $self = shift;
    
    $self->log->fatal('dbhandlerPg enter '.$$);
    my $dbh;
    eval {
        $self->log->fatal('dbhandlerPg eval before ');
        DBI->connect("dbi:Pg:database=...;host=...;port=...", "...", "...", {RaiseError => 1})
            || die(DBI->errstr);
        $self->log->fatal('dbhandlerPg eval after ');
    };
    $self->log->fatal($@) if $@;
    $self->log->fatal('dbhandlerPg ok ');
    
    return $dbh;
};


В логе
Код

[Fri Sep 14 10:33:17 2012] [fatal] dbhandlerPg enter 3186
[Fri Sep 14 10:33:17 2012] [fatal] dbhandlerPg eval before

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

Это сообщение отредактировал(а) GoDleSS - 14.9.2012, 13:37
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
infarch
Дата 16.9.2012, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Попробуйте {RaiseError => 0}
PM MAIL   Вверх
Pfailed
Дата 16.9.2012, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Посмотрите через strace что происходит


--------------------
PM MAIL   Вверх
GoDleSS
Дата 17.9.2012, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 11.2.2007
Где: Пироговский

Репутация: нет
Всего: 2



Цитата(Pfailed @ 16.9.2012,  09:09)
Посмотрите через strace что происходит

Спасибо!

strace рассказал интересное.
Код

4239  stat64("/var/www/.postgresql/root.crt", 0xbfc1beec) = -1 ENOENT (No such file or directory)
...
4239  --- SIGSEGV (Segmentation fault) @ 0 (0) ---


Не сильно понимаю зачем постгресовскому клиенту сертификат, разве устанавливает защищенное соединение? И почему тогда точно такое же подключение из обычного (не mojolicious) скрипта устанавливается успешно?

Тем не менее, попробовал по указанному в ошибке пути создать директорию и в ней линк на /etc/postgresql-common/root.crt
Код

root.crt -> /etc/postgresql-common/root.crt

И сервис перестал выпадать что, как минимум, качественный рывок к прогрессу smile

Это сообщение отредактировал(а) GoDleSS - 17.9.2012, 12:02
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
GoDleSS
Дата 17.9.2012, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 11.2.2007
Где: Пироговский

Репутация: нет
Всего: 2



Окончательно победить удалось установив ключи для ssl-соединения согласно http://www.howtoforge.com/postgresql-ssl-certificates

Однако, в pg_hba.conf никаких требований относительно ssl не стоит и причину неожиданной потребности такого соединения из моджоликуса так и не понял.
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
DurRandir
Дата 17.9.2012, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 1
Всего: 17



У вас откуда-то взялась опция sslmode при подключении клиента: http://www.postgresql.org/docs/9.1/static/...SL-CERTIFICATES. Я бы посмотрел через gdb, в каком месте она появляется, и отправил баг в соответствующий модуль:
а) что она появляется
б) что он при этом падает
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0729 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.