2010-08-13 14 views
5

Ho incontrato un problema in cui non riesco a fermare mnesia all'interno del mio programma senza causare l'interruzione dell'app.L'arresto di app Erlang si blocca quando mnesia si fermò all'interno del programma

Attualmente sto facendo la prototipazione di mnesia nella mia app di erlang.

Nel mio jaus_app.erl depositare l'inizio() chiama:

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

mio arresto() chiama:

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

Quando io commento queste righe avviare e arrestare mnesia dalla prompt di erlang, sono in grado di interrompere la mia domanda in modo pulito.

Non dovrei utilizzare queste funzioni di prototipo all'interno di un'app di erlang completa?

Ken.

+5

Ciò accade perché la funzione 'stop' viene chiamata dal controller dell'applicazione, che è un' gen_server', ma 'mnesia: stop' chiama' application: stop (mnesia) 'e attende una risposta dal controller dell'applicazione - e tu hai una situazione di stallo. Quindi, la semplice risposta è "non usare' mnesia: stop' in quella funzione di callback "; Non ho un suggerimento molto migliore, però :) – legoscia

risposta

2

Utilizzando systools per creare un file di avvio mnesia viene avviato prima della mia app e si interrompe dopo la mia app all'arresto. Questo risolve il problema di sospensione a cui allude la legoscia di cui sopra. L'idea del file di avvio è stata suggerita da Mazen da Erlang Consulting. Molte grazie a lui per questo suggerimento.

1

Dalla documentazione Erlang:

dump_to_textfile (Nome del file): Discariche tutte le tabelle locali di un sistema di mnesia in un file di testo che possono poi essere modificati (per mezzo di un normale editor di testo ) e successivamente ricaricato con mnesia: load_textfile/1. Utilizzare questa funzione solo per per scopi didattici . Utilizzare altre funzioni per gestire con backup reali.

Problemi correlati