From 55ea097bce2b41af3dadf67c3514b3c8674acf07 Mon Sep 17 00:00:00 2001 From: Christophe Romain Date: Mon, 3 Apr 2017 11:32:13 +0200 Subject: [PATCH 1/4] Remove obsolete mnesia migration calls Now that plugins directly use ejabberd_mnesia and can include their own transform handler, we don't need pubsub_migrate anymore. People upgrading from 2.1.1x version must upgrade to 17.01 first. pubsub_migrate module remains to support any manual process requiring it --- src/mod_pubsub.erl | 16 --------- src/pubsub_migrate.erl | 81 +++++++++++++++++++++--------------------- 2 files changed, 41 insertions(+), 56 deletions(-) diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 995388cc4..5dbd75859 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -256,10 +256,6 @@ init([ServerHost, Opts]) -> fun(A) when is_integer(A) andalso A >= 0 -> A end, ?MAXITEMS), MaxSubsNode = gen_mod:get_opt(max_subscriptions_node, Opts, fun(A) when is_integer(A) andalso A >= 0 -> A end, undefined), - case gen_mod:db_type(ServerHost, ?MODULE) of - mnesia -> init_mnesia(Host, ServerHost, Opts); - _ -> ok - end, {Plugins, NodeTree, PepMapping} = init_plugins(Host, ServerHost, Opts), DefaultModule = plugin(Host, hd(Plugins)), BaseOptions = DefaultModule:options(), @@ -374,18 +370,6 @@ depends(ServerHost, Opts) -> end end, Plugins). -init_mnesia(Host, ServerHost, Opts) -> - pubsub_index:init(Host, ServerHost, Opts), - spawn(fun() -> - %% maybe upgrade db. this can take time when upgrading existing - %% data from ejabberd 2.1.x, so we don't want this to block - %% calling gen_server:start - pubsub_migrate:update_node_database(Host, ServerHost), - pubsub_migrate:update_state_database(Host, ServerHost), - pubsub_migrate:update_item_database(Host, ServerHost), - pubsub_migrate:update_lastitem_database(Host, ServerHost) - end). - %% @doc Call the init/1 function for each plugin declared in the config file. %% The default plugin module is implicit. %%

The Erlang code for the plugin is located in a module called diff --git a/src/pubsub_migrate.erl b/src/pubsub_migrate.erl index 4d66ea06e..17bdb2368 100644 --- a/src/pubsub_migrate.erl +++ b/src/pubsub_migrate.erl @@ -300,46 +300,47 @@ rename_default_nodeplugin() -> _ = '_'})). update_state_database(_Host, _ServerHost) -> - case catch mnesia:table_info(pubsub_state, attributes) of - [stateid, nodeidx, items, affiliation, subscriptions] -> - ?INFO_MSG("Upgrading pubsub states table...", []), - F = fun ({pubsub_state, {{U,S,R}, NodeID}, _NodeIdx, Items, Aff, Sub}, Acc) -> - JID = {U,S,R}, - Subs = case Sub of - none -> - []; - [] -> - []; - _ -> - SubID = pubsub_subscription:make_subid(), - [{Sub, SubID}] - end, - NewState = #pubsub_state{stateid = {JID, NodeID}, - items = Items, - affiliation = Aff, - subscriptions = Subs}, - [NewState | Acc] - end, - {atomic, NewRecs} = mnesia:transaction(fun mnesia:foldl/3, - [F, [], pubsub_state]), - {atomic, ok} = mnesia:delete_table(pubsub_state), - {atomic, ok} = ejabberd_mnesia:create(?MODULE, pubsub_state, - [{disc_copies, [node()]}, - {attributes, record_info(fields, pubsub_state)}]), - FNew = fun () -> - lists:foreach(fun mnesia:write/1, NewRecs) - end, - case mnesia:transaction(FNew) of - {atomic, Result} -> - ?INFO_MSG("Pubsub states table upgraded: ~p", - [Result]); - {aborted, Reason} -> - ?ERROR_MSG("Problem upgrading Pubsub states table:~n~p", - [Reason]) - end; - _ -> - ok - end, +% useless starting from ejabberd 17.04 +% case catch mnesia:table_info(pubsub_state, attributes) of +% [stateid, nodeidx, items, affiliation, subscriptions] -> +% ?INFO_MSG("Upgrading pubsub states table...", []), +% F = fun ({pubsub_state, {{U,S,R}, NodeID}, _NodeIdx, Items, Aff, Sub}, Acc) -> +% JID = {U,S,R}, +% Subs = case Sub of +% none -> +% []; +% [] -> +% []; +% _ -> +% SubID = pubsub_subscription:make_subid(), +% [{Sub, SubID}] +% end, +% NewState = #pubsub_state{stateid = {JID, NodeID}, +% items = Items, +% affiliation = Aff, +% subscriptions = Subs}, +% [NewState | Acc] +% end, +% {atomic, NewRecs} = mnesia:transaction(fun mnesia:foldl/3, +% [F, [], pubsub_state]), +% {atomic, ok} = mnesia:delete_table(pubsub_state), +% {atomic, ok} = ejabberd_mnesia:create(?MODULE, pubsub_state, +% [{disc_copies, [node()]}, +% {attributes, record_info(fields, pubsub_state)}]), +% FNew = fun () -> +% lists:foreach(fun mnesia:write/1, NewRecs) +% end, +% case mnesia:transaction(FNew) of +% {atomic, Result} -> +% ?INFO_MSG("Pubsub states table upgraded: ~p", +% [Result]); +% {aborted, Reason} -> +% ?ERROR_MSG("Problem upgrading Pubsub states table:~n~p", +% [Reason]) +% end; +% _ -> +% ok +% end, convert_list_subscriptions(), convert_list_states(). From 19614678e975687ffc69ef17bfbb98952ddafd8e Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Mon, 3 Apr 2017 12:57:23 +0300 Subject: [PATCH 2/4] Change mnesia dir detection --- src/ejabberd_app.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index ea8a14dca..579696302 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -173,7 +173,7 @@ set_settings_from_config() -> file_queue_init() -> QueueDir = case ejabberd_config:queue_dir() of undefined -> - {ok, MnesiaDir} = application:get_env(mnesia, dir), + MnesiaDir = mnesia:system_info(directory), filename:join(MnesiaDir, "queue"); Path -> Path From b75780b9cd588d540545243e0ed11a81ce9b7db0 Mon Sep 17 00:00:00 2001 From: Christophe Romain Date: Mon, 3 Apr 2017 12:13:03 +0200 Subject: [PATCH 3/4] Always init pubsub_index when using mnesia --- src/mod_pubsub.erl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 5dbd75859..d530dc985 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -256,6 +256,10 @@ init([ServerHost, Opts]) -> fun(A) when is_integer(A) andalso A >= 0 -> A end, ?MAXITEMS), MaxSubsNode = gen_mod:get_opt(max_subscriptions_node, Opts, fun(A) when is_integer(A) andalso A >= 0 -> A end, undefined), + case gen_mod:db_type(ServerHost, ?MODULE) of + mnesia -> pubsub_index:init(Host, ServerHost, Opts); + _ -> ok + end, {Plugins, NodeTree, PepMapping} = init_plugins(Host, ServerHost, Opts), DefaultModule = plugin(Host, hd(Plugins)), BaseOptions = DefaultModule:options(), From f45dc468560fc9d4399e12e65c0ee3d6e10c53ae Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Mon, 3 Apr 2017 16:30:02 +0300 Subject: [PATCH 4/4] Forget prepared SQL queries on database connect (#1325) --- src/ejabberd_sql.erl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl index b9dbbe7ce..ed048a8c0 100644 --- a/src/ejabberd_sql.erl +++ b/src/ejabberd_sql.erl @@ -301,6 +301,12 @@ connecting(connect, #state{host = Host} = State) -> case ConnectRes of {ok, Ref} -> erlang:monitor(process, Ref), + lists:foreach( + fun({{?PREPARE_KEY, _} = Key, _}) -> + erase(Key); + (_) -> + ok + end, get()), PendingRequests = p1_queue:dropwhile( fun(Req) ->