правильное завершение приложения с Mnesia

191 views
Skip to first unread message

Роман А.

unread,
Sep 3, 2012, 10:05:58 AM9/3/12
to erlang-...@googlegroups.com
Подскажите, пожалуйста, как правильно и безопасно надо завершить приложение, работающее с Mnesia, чтобы все таблицы, созданные в режиме disc_copies успели сохраниться на диск.

В модуле с поведением application делаю так:

stop() ->
    application:stop(mnesia),
    application:stop(myapp).

завершаю приложение не по kill -9, а через erl_call

    erl_call -n MYNODE, -a "init stop"

Но всё равно при перезапуске приложения получаю: 

=ERROR REPORT==== 3-Sep-2012::17:36:44 ===
Error in process <0.80.0> on node 'mynode@romka_silver' with exit value: {badarg,[{ets,insert,[my_table,[{my_table,... и т.д.

А может быть нужно как-то послать стоп-сигнал всем процессам, работающим с таблицами Mnesia?

Роман А.

unread,
Dec 3, 2012, 8:11:49 AM12/3/12
to
Печально, граждане, но эта проблема всё ещё актуальна, я её откладывал и вот вернулся к ней снова. В прошлый раз никто мне ничего не ответил, а гугление ничего не дало.

Может быть, в меня кинут правильной и точной ссылкой, как надо завершать приложения с Mnesia? 

Кстати, когда делаю mnesia:stop() или application:stop(mnesia) в коллбэке stop/1 главного модуля с поведением application - процесс завершения вешается. Может быть это потому, что стоп-сигнал уже послан Мнесии? Может это какие-то грабли, не?

понедельник, 3 сентября 2012 г., 18:05:58 UTC+4 пользователь Роман А. написал:

Yuri Zhloba

unread,
Dec 3, 2012, 8:15:17 AM12/3/12
to erlang-...@googlegroups.com
Может никто и не в курсе, как это делать, потому что никто не
использует mnesia )

Yuri Zhloba

unread,
Dec 3, 2012, 8:17:25 AM12/3/12
to erlang-...@googlegroups.com

Yuri Zhloba

unread,
Dec 3, 2012, 8:23:48 AM12/3/12
to erlang-...@googlegroups.com
А, ну да

> Кстати, когда делаю mnesia:stop() или application:stop(mnesia) в коллбэке stop/1
> главного модуля с поведением application - процесс завершения вешается.

This happens because your stop function is called from the application
controller, which is a gen_server, but mnesia:stop calls
application:stop(mnesia) and waits for a response from the application
controller - and you have a deadlock. So, the simple answer is "don't
use mnesia:stop in that callback function";

Роман А.

unread,
Dec 3, 2012, 8:28:09 AM12/3/12
to erlang-...@googlegroups.com
Юрий, спасибо за ответ

Получается, что останавливать mnesia вручную не нужно, она завершается сама, при этом складывает все таблицы на диск из памяти, как только всему приложению приходит стоп-сигнал?

понедельник, 3 декабря 2012 г., 17:23:48 UTC+4 пользователь Yuri Zhloba написал:

Yuri Zhloba

unread,
Dec 3, 2012, 8:34:38 AM12/3/12
to erlang-...@googlegroups.com
правильно ли я понял, что код у вас такой:

-module(myapp).

stop() ->
application:stop(myapp).

Ежели так, то mnesia тут ни при чем. У вас бесконечная рекурсия, ибо
myapp:stop() вызывает application:stop(myapp), а
application:stop(myapp) вызывает myapp:stop()

Роман А.

unread,
Dec 3, 2012, 8:41:44 AM12/3/12
to erlang-...@googlegroups.com
Юрий, виноват что не отразил изменения в комменте.

код коллбэка завершения теперь такой: 


stop
(_State) ->
    mnesia
:stop(),
    ok
.





понедельник, 3 декабря 2012 г., 17:34:38 UTC+4 пользователь Yuri Zhloba написал:

Yuri Zhloba

unread,
Dec 3, 2012, 8:44:48 AM12/3/12
to erlang-...@googlegroups.com
3 декабря 2012 г., 16:41 пользователь Роман А.
<romkasi...@gmail.com> написал:

> Юрий, виноват что не отразил изменения в комменте.
>
> код коллбэка завершения теперь такой:
>
>
> stop(_State) ->
> mnesia:stop(),
> ok.

и что, зависает на mnesia:stop?

Роман А.

unread,
Dec 3, 2012, 8:48:16 AM12/3/12
to erlang-...@googlegroups.com
Именно так.
Почему-то мне кажется, что к этому моменту mnesia уже остановлена, но я не уверен. А возможно, я не в том коллбэке это делаю.

понедельник, 3 декабря 2012 г., 17:44:48 UTC+4 пользователь Yuri Zhloba написал:

Yuri Zhloba

unread,
Dec 3, 2012, 8:51:28 AM12/3/12
to erlang-...@googlegroups.com
ну тогда хз

appmon точно ответит, какие приложения работают, какие нет

Роман А.

unread,
Dec 3, 2012, 8:54:05 AM12/3/12
to erlang-...@googlegroups.com
ну вот я порылся на гитхабе, нашел первый попавшийся пример: https://github.com/dustin/environ/blob/master/src/environ.erl
там внутри модуля прилодения гасят mnesia внутри коллбэка stop/1 рискну предположить, что это реально рабочий код. 

Что касается appmon - он при завершении сам схлопывается, ругаясь при этом и на момент вызова mnesia:stop() его уже просто нет, Я проверял)

понедельник, 3 декабря 2012 г., 17:51:28 UTC+4 пользователь Yuri Zhloba написал:

Aleksey Kishkin

unread,
Dec 3, 2012, 9:06:37 AM12/3/12
to erlang-...@googlegroups.com
посмотреть работающие на данный момент applications можно с помощью application:which_application().
посмотреть состояние мнезии, даже если она не запущена (или остановлена) можно с помощью mnesia:info()


Alexey Kishkin



2012/12/3 Роман А. <romkasi...@gmail.com>

--
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Новости: http://erlanger.ru
Чат: xmpp://erl...@conference.jabber.ru
Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
Правила, действующие в чате и рассылке: http://erlanger.ru/ru/erlang-at-conference-jabber-ru
 
Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com
 
 

Anton Konovalov

unread,
Dec 10, 2012, 1:32:02 AM12/10/12
to erlang-...@googlegroups.com
Пожалуй, вам надо повнимательнее почитать про утилиту erl_call:
http://www.erlang.org/doc/man/erl_call.html

И в довесок - про функцию init:stop()
http://erlang.org/doc/man/init.html#stop-0

Эта функция остановит и выгрузит Эрланг-приложение.

А насчет выгрузки Mnesia - мне почему-то кажется что у вас путаница с коллбэками приложения и вызываемой снаружи (через erl_call) функцией.



понедельник, 3 сентября 2012 г., 18:05:58 UTC+4 пользователь Роман А. написал:
Подскажите, пожалуйста, как правильно и безопасно надо завершить приложение, работающее с Mnesia, чтобы все таблицы, созданные в режиме disc_copies успели сохраниться на диск.

sleepwalker

unread,
Dec 10, 2012, 4:31:22 AM12/10/12
to erlang-...@googlegroups.com
Тоже кажется что со стартом проблемы. При завершении ни разу не было проблем чтоб мнезия чего-то там не записала. Даже если убить приложение по kill -9, по временным файлам (DCL которые) таблица восстановится до корректного состояния при следующем старте.


понедельник, 3 сентября 2012 г., 21:05:58 UTC+7 пользователь Роман А. написал:

Yuri Zhloba

unread,
Dec 10, 2012, 4:45:34 AM12/10/12
to erlang-...@googlegroups.com
10 декабря 2012 г., 12:31 пользователь sleepwalker
<andrey.m...@gmail.com> написал:

> таблица восстановится до корректного состояния при следующем старте
во-во, вся фишка в том, сколько времени занимает этот процесс :)

--
Yuri Zhloba

skype: yzh44yzh
jabber: yzh4...@gmail.com
phone: +375 44 793 33 73
site: http://yzh44yzh.com

Роман А.

unread,
Dec 10, 2012, 5:35:49 AM12/10/12
to erlang-...@googlegroups.com
Ура, всё получилось.

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

Посмотрел, как сделано в больших и серьезных проектах. А там делают два модуля. Один для старта и стопа, а второй с поведением application, типа myproject.erl и myproject_app.erl, 
В myproject стартуют Mnesia и прочее, включая модуль приложения myproject_app.erl (не забываем правильно описать файл myproject.app.src)
Проблема была не сколько в Mnesia, сколько в понимании этой логики. Теперь всё работает, стартует и гасится.

Спасибо всем, кто навёл меня на эту мысль.


понедельник, 3 сентября 2012 г., 18:05:58 UTC+4 пользователь Роман А. написал:
Подскажите, пожалуйста, как правильно и безопасно надо завершить приложение, работающее с Mnesia, чтобы все таблицы, созданные в режиме disc_copies успели сохраниться на диск.

Andrew Gopienko

unread,
Dec 10, 2012, 7:32:25 AM12/10/12
to erlang-...@googlegroups.com
Я часто помещаю application и supervisor в один модуль. Проблема не должна быть в этом.


10 декабря 2012 г., 17:35 пользователь Роман А. <romkasi...@gmail.com> написал:
Reply all
Reply to author
Forward
0 new messages