diff --git a/apps/roster/src/roster_oam.erl b/apps/roster/src/roster_oam.erl index b09625e6a3db5baa58fec09f9e60bec3efcb68ac..8af1aebe21f3ba67d711001f477db618b10c5b88 100644 --- a/apps/roster/src/roster_oam.erl +++ b/apps/roster/src/roster_oam.erl @@ -8,6 +8,7 @@ , rename_node/1 , commit_rename/0 , undo_db_clone/0 + , load_apps/0 , close_down/1 , remove_replicas/1 , src_code/1 ]). @@ -61,13 +62,45 @@ undo_db_clone(DelNode) -> mnesia:set_master_nodes([]), % resets master_nodes setting ok. +load_apps() -> + Apps = applist(), + io:fwrite("loading applications ~p~n", [Apps]), + lists:foreach(fun(A) -> + io:fwrite("Loaded ~p ~p~n", [A, application:load(A)]) + end, Apps). + +applist() -> + [kernel,stdlib,prometheus,bert,fs,gproc,gen_logger,n2o,metrics,mimerl,unicode_util_compat,base64url, + jsx,tools,certifi,ibrowse,asn1,sasl,compiler,xmerl,counters,ctx,inets,wts,syntax_tools,qdate_localtime, + crypto,mnesia] ++ stoplist(). + +stoplist() -> + [libphonenumber_erlang,syn,cowlib,kvs,jiffy,idna,parse_trans,goldrush,esockd,public_key, + bpe,lager,ssl,ranch,mochiweb,ssl_verify_fun,locus,emqttd,hackney,roster,service,active,cowboy, + emq_dashboard,emqttc,enenra,envy,uuid,erlydtl,forms,gen_smtp,json_rec,jwt,mad,migresia,mini_s3,nitro, + opencensus,qdate,rest,rfc3339,sh,stacktrace_compat]. + %% This is supposed to be run as %% `erl -name NewName -setcookie OldCookie -eval 'roster_oam:rename_node(OldNode)' rename_node(OldNode) -> io:fwrite("Wohoo!!! OldNode = ~p~n", [OldNode]), mnesia:start([{extra_db_nodes, [OldNode]}]), ?LOG("Syncing the database", []), - clone_mnesia_db(OldNode). + clone_mnesia_db(OldNode), + wait_for_commit_loop(). + +wait_for_commit_loop() -> + mnesia:info(), + case io:fread("1=info, 2=commit, 3=quit: ", "~d") of + {ok, [2]} -> + ?LOG("Committing to this DB", []), + commit_rename(); + {ok, [3]} -> + io:fwrite("Make sure to run mnesia:del_table_copy(schema, '~p') on old node~n", [node()]), + stopped; + _ -> + wait_for_commit_loop() + end. %% Run this in the shell of the new node once you are ready to switch over %% It will stop the old node, rewrite the node name in the vm.args @@ -75,7 +108,6 @@ rename_node(OldNode) -> %% Start it again using `make start` commit_rename() -> [OldNode] = mnesia:system_info(db_nodes) -- [node()], - ok = modify_vm_args(OldNode), ?LOG("Stopping applications on ~p: ~p", [OldNode, apps_to_stop()]), ok = rpc:call(OldNode, ?MODULE, disable, []), %% Now there should not be any traffic any more, both parts may disconnect @@ -84,8 +116,8 @@ commit_rename() -> ?LOG("Run ~p:close_down(~p) on ~p manually", [?MODULE, node(), OldNode]), receive {nodedown, OldNode} -> ok - after 120000 -> - ?LOG("No nodedown after 2 minutes", []), + after 10*60*1000 -> + ?LOG("No nodedown after 10 minutes", []), error(<<"Node does not disconnect">>) end, continue_commit_rename(OldNode). @@ -93,7 +125,7 @@ commit_rename() -> %% Run this when old node did not stop, but has now been stopped continue_commit_rename(OldNode) -> ?LOG("nodes ~p", [nodes()]), - ?LOG("In a moment type 'make start-new' to start the new node ~p", [node()]), + ?LOG("In a moment type 'bin/server start' to start the new node ~p", [node()]), ?LOG("Now removing old node from new database", []), remove_replicas(OldNode), ?LOG("Rewriting mqtt_route", []), @@ -106,6 +138,7 @@ continue_commit_rename(OldNode) -> [ mnesia:write({A, B, NewNode}) || {A, B, _} <- OldObjects ], ok end), + mnesia:dump_log(), ?LOG("Ready to start new node", []), mnesia:stop(), init:stop(). @@ -125,10 +158,10 @@ close_down(NewNode) -> ?LOG("Database info ~p\n", [mnesia:info()]), init:stop(). -modify_vm_args(OldNode) -> - {ok, Bin} = file:read_file("vm.args"), - NewBin = binary:replace(Bin, atom_to_binary(OldNode, latin1), atom_to_binary(node(), latin1)), - file:write_file("new.vm.args", NewBin). +%% modify_vm_args(OldNode) -> +%% {ok, Bin} = file:read_file("vm.args"), +%% NewBin = binary:replace(Bin, atom_to_binary(OldNode, latin1), atom_to_binary(node(), latin1)), +%% file:write_file("new.vm.args", NewBin). clone_mnesia_db(Node) -> @@ -137,8 +170,7 @@ clone_mnesia_db(Node) -> Tabs = tabs(), add_me_to_tabs(Tabs, Node), ensure_tables_loaded(), - ?LOG("Wait until in sync and then call ~p:commit_rename().", [?MODULE]), - mnesia:info(). + ?LOG("Wait until in sync and then commit rename", []). ensure_table_copy_type(Tab, Type) -> case mnesia_lib:storage_type_at_node(node(), Tab) of @@ -182,7 +214,7 @@ stop_app(A) -> apps_to_stop() -> Apps = lists:takewhile(fun(A) -> A =/= mnesia - end, lists:reverse(applist())), + end, lists:reverse(stoplist())), no_dups(Apps ++ lists:reverse(extra_apps())). apps_to_restart() -> @@ -200,13 +232,6 @@ no_dups([]) -> extra_apps() -> [n2o, ibrowse, prometheus, fs, bert]. -applist() -> - TopDir = filename:dirname(mnesia:system_info(directory)), - {ok, Bin} = file:read_file(filename:join(TopDir, ".applist")), - {ok, Ts,_} = erl_scan:string(binary_to_list(Bin)), - {ok, Apps} = erl_parse:parse_term(Ts ++ [{dot,1}]), - Apps. - ensure_tables_loaded() -> ensure_tables_loaded(5000, 12*30). %% retry for ca 30 minutes diff --git a/rebar.config b/rebar.config index f95b39c13489e18e4cedf2ac7dce4a4f7073d8aa..0fc0d0947bf615a6e7411ee0850e0dfa828eba9a 100644 --- a/rebar.config +++ b/rebar.config @@ -34,7 +34,7 @@ {cowboy, {git, "git://github.com/ninenines/cowboy", {tag,"2.7.0"}}}, {jose, {git, "https://github.com/NYNJA-MC/jose-erlang.git", {ref, "7094018"}}}, {uuid, {git, "https://github.com/avtobiff/erlang-uuid.git",{branch,"master"}}}, - {enenra, {git, "https://github.com/nlfiedler/enenra", {tag, "0.3.0"}}}, + {enenra, {git, "https://github.com/nlfiedler/enenra", {branch, "master"}}}, {'qdate', {git, "https://github.com/enterprizing/qdate.git", {ref,"fba988fc54214bb37a3ce11d5c5a3cc68752c3ce"}}}, {redbug, {git, "https://github.com/massemanet/redbug.git", {tag, "2.0.1"}}} ]}. diff --git a/rebar.lock b/rebar.lock index e9a99f0c735e803e9143890e79aa6f8695743483..ed58a31cb0f28f3d180605fe46a8d3cf45701e7e 100644 --- a/rebar.lock +++ b/rebar.lock @@ -47,7 +47,7 @@ 0}, {<<"enenra">>, {git,"https://github.com/nlfiedler/enenra", - {ref,"ccc2553b8df5a188cdc77aeec7b856a1e5250e67"}}, + {ref,"fc253037cb5913700bb83cddafdd835bdbd6992c"}}, 0}, {<<"envy">>, {git,"https://github.com/markan/envy.git", @@ -88,7 +88,7 @@ 0}, {<<"hackney">>, {git,"https://github.com/benoitc/hackney", - {ref,"f2ac65700ef7918eb4e827892f1a7bb01e826026"}}, + {ref,"3c32f04ff0783479992a5d11ec0f4a2d09ba922a"}}, 1}, {<<"ibrowse">>, {git,"git://github.com/cmullaparthi/ibrowse.git", @@ -136,7 +136,7 @@ {git,"https://github.com/yoonka/migresia.git", {ref,"40e11825e01502d045e87bf8b5d7dc5a9d6e3f73"}}, 0}, - {<<"mimerl">>,{pkg,<<"mimerl">>,<<"1.0.2">>},2}, + {<<"mimerl">>,{pkg,<<"mimerl">>,<<"1.2.0">>},2}, {<<"mini_s3">>, {git,"https://github.com/chef/mini_s3.git", {ref,"73c1be787dfe590113419091c531564e58592478"}}, @@ -173,7 +173,7 @@ 1}, {<<"redbug">>, {git,"https://github.com/massemanet/redbug.git", - {ref,"4cdfd2106432579502da535e390466fe9ca0d41f"}}, + {ref,"3abf294a919ce2221b937bbb13e6152829fd977c"}}, 0}, {<<"rest">>, {git,"git://github.com/synrc/rest", @@ -209,7 +209,7 @@ {<<"erlware_commons">>, <<"0CE192AD69BC6FD0880246D852D0ECE17631E234878011D1586E053641ED4C04">>}, {<<"idna">>, <<"689C46CBCDF3524C44D5F3DDE8001F364CD7608A99556D8FBD8239A5798D4C10">>}, {<<"metrics">>, <<"25F094DEA2CDA98213CECC3AEFF09E940299D950904393B2A29D191C346A8486">>}, - {<<"mimerl">>, <<"993F9B0E084083405ED8252B99460C4F0563E41729AB42D9074FD5E52439BE88">>}, + {<<"mimerl">>, <<"67E2D3F571088D5CFD3E550C383094B47159F3EEE8FFA08E64106CDF5E981BE3">>}, {<<"parse_trans">>, <<"09765507A3C7590A784615CFD421D101AEC25098D50B89D7AA1D66646BC571C1">>}, {<<"qdate_localtime">>, <<"5F6C3ACF10ECC5A7E2EFA3DCD2C863102B962188DBD9E086EC01D29FE029DA29">>}, {<<"ssl_verify_fun">>, <<"F0EAFFF810D2041E93F915EF59899C923F4568F4585904D010387ED74988E77B">>}, diff --git a/vm.args b/vm.args index 33be6d35061060310fb304abb6a75e2dfe20bc4e..4bea209fa1eae1150f266281870a7e9579f8996d 100644 --- a/vm.args +++ b/vm.args @@ -8,7 +8,5 @@ +K true -smp auto -setcookie emq_dist_cookie --name mq@127.0.0.1 +-name mq2 +zdbbl 32768 - -