Problema grave en el backup (resuelto)

Problema grave en el backup (resuelto)

de Jose Luis Diaz -
Número de respuestas: 3
He encontrado un problema muy extraño y muy grave relacionado con la realización de backups. Este problema me apareció tras actualizarme a la última versión estable (1.5+).

Consulté en los foros de "Using Moodle", pero nadie me respondió. Supongo que se trata de un problema relacionado con mi particular versión de linux/apache/php y que es muy difícil de reproducir por otras personas.

He investigado un rato y al final conseguí localizar el código causante de los problemas. Comentando una línea he conseguido arreglarlo, pero sigo sin comprender las verdaderas causas del fallo.

En este mensaje explico cuál era el problema y cuál ha sido la solución, por si a alguien más le ocurre que tenga una solución "de emergencia" y también por si alguien con más luces que yo es capaz de averiguar por qué fallaba.

El síntoma:
Al intentar un backup, tanto del sistema completo como de un curso cualquiera, la página de progreso de backup (la que va diciendo qué módulos está copiando y en la que, al final del todo debería aparecer "Backup realizado con éxito"), se queda bloqueada en una línea, y no avanza más. La línea ni siquiera se muestra completa. El backup no es creado (como puedo comprobar mirando en las carpetas de backup).

La causa:
Algún error grave dentro de PHP o de algún script parece ser el causante. La página de progreso no llega a completarse porque el proceso que estaba generando esta página muere de forma violenta sonrisa. Examinando el archivo error_log de apache veo que el proceso httpd ha finalizado con un "Segmentation fault". Imposible saber qué estaba haciendo cuando murió, y por tanto cuál puede ser la causa del error.

La investigacíón:
Puesto que el proceso muere antes de tener la oportunidad de volcar un mensaje de error, acudí al viejo método de ir volcando mensajes de progreso a medida que el programa va avanzando. Cuando uno de los mensajes no aparezca, es porque el proceso murió y así puedo saber hasta donde llegó antes de morir. Así que edité los archivos moodle/backup/backup_execute.html, moodle/backup/lib.php y /moodle/backup/backuplib.php, e introduje en ellos varios comandos "echo". Tras cada echo es necesario añadir un comando flush(), para garantizar que el texto volcado por echo realmente sale en pantalla. De lo contrario, se va almacenando en un buffer que normalmente es volcado al final, pero ya que el proceso puede morir antes de llegar al final, muchos mensajes podrían perderse.

Mediante ese truco conseguí determinar que el proceso moría cuando llamaba a la función clam_log_upload, en la línea 293 del fichero /moodle/backup/lib.php. Esto podía ocurrir antes o después, dependiendo de las opciones de backup. En todo caso siempre ocurriría al final de todo, una vez el backup estuviese ya realizado, en el paso en que moodle lo copia de un directorio temporal al directorio definitivo de los backups.

La solución (provisional):
Aún sin saber qué hace exactamente la función clam_log_upload, su nombre me hizo suponer que simplemente añade a algún fichero de log información acerca de la copia de ficheros realizada con éxito. Por tanto no me pareció que estuviera eliminando una funcionalidad básica si eliminaba esa línea.

Mi solución fue por tanto simplemente comentar esta línea para que no sea ejecutada. Funcionó. Ahora por fin puedo hacer mis backups de nuevo.

Naturalemente, sigo sin comprender del todo la naturaleza del problema, y me temo que seguiré sin comprenderla pues veo improbable que un desarrollador sea capaz de reproducir y analizar mi problema.



Promedio de valoraciones: -
En respuesta a Jose Luis Diaz

Re: Problema grave en el backup (resuelto)

de Eloy Lafuente (stronk7) -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodle HQ Imagen de Moodlers de gran ayuda Imagen de Testers
Hola Jose Luis,

gran investigación! guay

La función clam_log_upload() efectivamente lo que hace es "apuntar" todos los archivos que se copian en el proceso de backup para que, si está el antivirus activado, estos sean comprobados...

Hace unos minutos he creado, por comentario de otro moodler, el bug 3508. Entiendo que sería interesante si escribés allí tu experiencia con esa función para hacer un poco de "presión"... guiño

Ciao sonrisa
En respuesta a Eloy Lafuente (stronk7)

Re: Problema grave en el backup (resuelto)

de Jose Luis Diaz -
Gracias por el piropo!

Pues aún he investigado un poco más y he dado ya con la causa última y definitiva. Se trata de un bug de php 4.3.1 (justo la versión que yo tengo instalada, aunque me sorprende que nadie más la tenga...) El bug está documentado. Consiste en que al invocar a la función html_entity_decode() pasándole una cadena vacía, se produce un segfault.

En moodle, la rutina clam_log_upload termina llamando a add_to_log(), función implementada en /moodle/lib/datalib.php, pasándole en un parámetro llamado $url una cadena vacía. Y ya que a su vez add_to_log() llama a html_entity_decode() pasándole este $url, se produce el segfault.

La solución es simple, donde pone en la línea 2712:
	$url = html_entity_decode($url);
basta poner:
     if ($url) $url = html_entity_decode($url);
En todo caso, teniendo en cuenta lo que reportas en el bug, casi prefiero dejar comentada la línea que llama a clam_log_upload(). Es verdad que poluciona demasiado el fichero de log.

En respuesta a Jose Luis Diaz

Re: Problema grave en el backup (resuelto)

de Eloy Lafuente (stronk7) -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodle HQ Imagen de Moodlers de gran ayuda Imagen de Testers
Hola José Luis,

gracias por la info, así da gusto! guay

Penny Leach ya ha resuelto el bug 3508 y la solución debería estar incorporada en la próxima versión diaria de la 1.5+. Ya contarás.

Ciao sonrisa