diff --git a/apps/roster/src/roster_oam.erl b/apps/roster/src/roster_oam.erl index b2cba638adddbbaa6642b5780437d0fb8eb03237..9ba81e731afb4b0fab447a68394e9494ab0d6e33 100644 --- a/apps/roster/src/roster_oam.erl +++ b/apps/roster/src/roster_oam.erl @@ -11,7 +11,7 @@ node_running() -> lists:keymember(roster, 1, application:which_applications()). disable() -> - [application:stop(A) || A <- apps_to_stop()], + [stop_app(A) || A <- apps_to_stop()], ok. revert_db_sync(DelNode) -> @@ -23,7 +23,7 @@ revert_db_sync(DelNode) -> {error, {still_running, DelNode}}; false -> mnesia:set_master_nodes(mnesia:system_info(db_nodes) -- [DelNode]), - [application:stop(A) || A <- lists:reverse(apps_to_restart())], + [stop_app(A) || A <- lists:reverse(apps_to_restart())], remove_replicas(DelNode), application:start(mnesia, permanent), ok = ensure_tables_loaded(), @@ -32,16 +32,32 @@ revert_db_sync(DelNode) -> ok end. +stop_app(n2o) -> + catch roster:stop_vnodes(), + application:stop(n2o); +stop_app(A) -> + application:stop(A). + apps_to_stop() -> - lists:takewhile(fun(A) -> - A =/= mnesia - end, lists:reverse(applist())). + Apps = lists:takewhile(fun(A) -> + A =/= mnesia + end, lists:reverse(applist())), + no_dups(Apps ++ lists:reverse(extra_apps())). apps_to_restart() -> - [mnesia|Rest] = lists:dropwhile(fun(A) -> - A =/= mnesia - end, applist()), - Rest. + [Rest] = lists:dropwhile(fun(A) -> + A =/= mnesia + end, applist()), + no_dups(extra_apps() ++ Rest). + +no_dups([H | T]) -> + [H | no_dups([A || A <- T, + A =/= H])]; +no_dups([]) -> + []. + +extra_apps() -> + [n2o, ibrowse, prometheus, fs, bert]. applist() -> TopDir = filename:dirname(mnesia:system_info(directory)), @@ -80,4 +96,3 @@ remove_replicas(DelNode) -> tabs() -> mnesia:system_info(tables) -- [schema]. -