2010-08-13 13 views
5

Me he encontrado con un problema donde no puedo detener a mnesia dentro de mi programa sin hacer que la aplicación se cuelgue.La detención de la aplicación Erlang se bloquea cuando mnesia se detuvo desde el programa

Actualmente estoy haciendo prototipos de mnesia dentro de mi aplicación Erlang.

En mi jaus_app.erl presentar el inicio() llama:

{atomic, ok} = mnesia:load_textfile("priv/mnesia_prototype.txt") 

Mi función stop() llama:

mnesia:dump_to_textfile("priv/mnesia_prototype_res.txt"), 
mnesia:stop(), 

Cuando comento hacia fuera estas líneas e iniciar y detener mnesia de la prompt de erlang, puedo detener mi aplicación limpiamente.

¿No debería utilizar estas funciones de prototipo dentro de una aplicación erlang completa?

Ken.

+5

Esto ocurre porque la función 'stop' se llama desde el controlador de la aplicación, que es' gen_server', pero 'mnesia: stop' llama' aplicación: stop (mnesia) 'y espera una respuesta del controlador de la aplicación - y tienes un punto muerto Entonces, la respuesta simple es "no use' mnesia: stop' en esa función de devolución de llamada "; Aunque no tengo una sugerencia mucho mejor :) – legoscia

Respuesta

2

Al usar systools para crear un archivo de inicio mnesia se inicia antes de mi aplicación y se detiene después de que mi aplicación se apaga. Esto soluciona el problema colgante al que se hace referencia por legoscia arriba. La idea del archivo de arranque fue sugerida por Mazen de la consultoría Erlang. Muchas gracias a él por esa sugerencia.

1

A partir de los documentos de Erlang:

dump_to_textfile (Nombre): Vuelca todas las tablas locales de un sistema mnesia en un archivo de texto que puede entonces ser editados (mediante un editor de texto normal ) y luego se vuelve a cargar con mnesia: load_textfile/1. Solo use esta función para propósitos educativos . Utilice otras funciones para tratar con copias de seguridad reales.

Cuestiones relacionadas