2010-08-13 3 views
5

У меня возникла проблема, когда я не могу остановить mnesia внутри своей программы, не заставляя приложение зависать.Остановка приложения Erlang зависает, когда mnesia остановилась из программы

В настоящее время я делаю прототипирование mnesia в своем приложении erlang.

В моем jaus_app.erl подать начало() вызывает:

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

Моя остановка() функция

называет:

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

Когда я закомментируйте эти строки и запускать и останавливать Mnesia от erlang prompt, я могу полностью прекратить мое приложение.

Должен ли я использовать эти прототипы в полноценном приложении erlang?

Ken.

+5

Это происходит потому, что функция 'stop' вызывается из контроллера приложения, который является« gen_server », но« mnesia: stop »вызывает« приложение: stop (mnesia) »и ожидает ответа от контроллера приложения - и у вас есть тупик. Итак, простой ответ: «не используйте« mnesia: stop »в этой функции обратного вызова»; У меня нет лучшего предложения, хотя :) – legoscia

ответ

2

С помощью systools для создания загрузочного файла mnesia запускается перед моим приложением и останавливается после моего приложения при выключении. Это фиксирует проблему подвески, на которую ссылается вышеописанная legoscia. Идея загрузочного файла была предложена Мазеном из консалтинга erlang. Большое спасибо ему за это предложение.

1

Из Erlang документации:

dump_to_textfile (Имя файла): Сплин все локальные таблицы системы Mnesia в текстовый файл, который затем может быть отредактирован (с помощью обычного текстового редактора) а затем перезагружается с mnesia: load_textfile/1. Использовать только Эта функция для образовательных целей . Используйте другие функции для обработки с реальными резервными копиями.

Смежные вопросы