Tengo una aplicación web que segmenta cuando la base de datos se reinicia e intenta usar las conexiones anteriores. Correr bajo gdb --args apache -X
conduce al siguiente resultado:Partición segfaulting del controlador MySQL bajo mod_perl - dónde buscar el problema
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1212868928 (LWP 16098)]
0xb7471c20 in mysql_send_query() from /usr/lib/libmysqlclient.so.15
He comprobado que los conductores y la base de datos son todo hasta la fecha (DBD::mysql 4.0008, MySQL 5.0.32-Debian_7etch6-log).
un fastidio que no puedo reproducir este con un guión trivial:
use DBI;
use Test::More tests => 2;
my $dbh = DBI->connect("dbi:mysql:test", 'root');
sub test_db {
my ($number) = $dbh->selectrow_array("select 1 ");
return $number;
}
is test_db, 1, "connected to db";
warn "restart db now";
getc;
is test_db, 1, "connected to db";
que da el siguiente:
ok 1 - connected to db
restart db now at dbd-mysql-test.pl line 23.
DBD::mysql::db selectrow_array failed: MySQL server has gone away at dbd-mysql-test.pl line 17.
not ok 2 - connected to db
# Failed test 'connected to db'
# at dbd-mysql-test.pl line 26.
# got: undef
# expected: '1'
Esto comporta correctamente, decirme por qué la petición falló.
Lo que me sorprende es que es segfaulting, lo que no debería hacer. Como solo parece suceder cuando se está ejecutando toda la aplicación (que usa DBIx::Class), es difícil reducirla a un caso de prueba.
¿Dónde debería empezar a buscar para depurar esto? ¿Alguien más ha visto esto?
ACTUALIZACIÓN: un nuevo impulso demostró que estar bajo mod_perl era una pista falsa. Después de haberlo reducido a un script de prueba simple, ahora lo he publicado en el DBI mailing list. Gracias por tus respuestas.
no - parece ser un problema con DBD :: mysql o los binarios del cliente mysql. Gracias :) :) – EvdB