25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-12-20 17:27:00 +01:00

Enforce pubsub node removal, revert previous commit (#1320)

This reverts commit 2976c2d921.
and enforce node purge/removal instead
This commit is contained in:
Christophe Romain 2016-12-09 12:01:42 +01:00
parent 2976c2d921
commit bcc04d93e1
3 changed files with 31 additions and 7 deletions

View File

@ -176,3 +176,9 @@
creation ,% :: {erlang:timestamp(), jlib:ljid()},
payload % :: mod_pubsub:payload()
}).
-record(pubsub_orphan,
{
nodeid ,% :: mod_pubsub:nodeIdx(),
items = [] % :: list()
}).

View File

@ -58,6 +58,9 @@ init(_Host, _ServerHost, _Opts) ->
ejabberd_mnesia:create(?MODULE, pubsub_item,
[{disc_only_copies, [node()]},
{attributes, record_info(fields, pubsub_item)}]),
ejabberd_mnesia:create(?MODULE, pubsub_orphan,
[{disc_copies, [node()]},
{attributes, record_info(fields, pubsub_orphan)}]),
ItemsFields = record_info(fields, pubsub_item),
case mnesia:table_info(pubsub_item, attributes) of
ItemsFields -> ok;
@ -138,8 +141,10 @@ delete_node(Nodes) ->
Reply = lists:map(fun (#pubsub_node{id = Nidx} = PubsubNode) ->
{result, States} = get_states(Nidx),
lists:foreach(fun (State) ->
del_state(State)
del_items(Nidx, State#pubsub_state.items),
del_state(State#pubsub_state{items = []})
end, States),
del_orphan_items(Nidx),
{PubsubNode, lists:flatmap(Tr, States)}
end, Nodes),
{result, {default, broadcast, Reply}}.
@ -472,6 +477,7 @@ purge_node(Nidx, Owner) ->
set_state(S#pubsub_state{items = []})
end,
States),
del_orphan_items(Nidx),
{result, {default, broadcast}};
_ ->
{error, xmpp:err_forbidden()}
@ -696,9 +702,15 @@ set_state(State) when is_record(State, pubsub_state) ->
%set_state(_) -> {error, ?ERR_INTERNAL_SERVER_ERROR}.
%% @doc <p>Delete a state from database.</p>
del_state(#pubsub_state{stateid = {LJID, Nidx}, items = Items}) ->
del_items(Nidx, Items),
mnesia:delete({pubsub_state, {LJID, Nidx}}).
del_state(#pubsub_state{stateid = {Key, Nidx}, items = Items}) ->
case Items of
[] ->
ok;
_ ->
Orphan = #pubsub_orphan{nodeid = Nidx, items = Items},
mnesia:write(Orphan)
end,
mnesia:delete({pubsub_state, {Key, Nidx}}).
%% @doc Returns the list of stored items for a given node.
%% <p>For the default PubSub module, items are stored in Mnesia database.</p>
@ -801,6 +813,15 @@ del_items(Nidx, ItemIds) ->
end,
ItemIds).
del_orphan_items(Nidx) ->
case mnesia:read({pubsub_orphan, Nidx}) of
[#pubsub_orphan{items = ItemIds}] ->
del_items(Nidx, ItemIds),
mnesia:delete({pubsub_orphan, Nidx});
_ ->
ok
end.
get_item_name(_Host, _Node, Id) ->
Id.

View File

@ -641,9 +641,6 @@ set_state(Nidx, State) ->
del_state(Nidx, JID) ->
J = encode_jid(JID),
catch ejabberd_sql:sql_query_t(
?SQL("delete from pubsub_item where publisher=%(J)s"
" and nodeid=%(Nidx)d")),
catch ejabberd_sql:sql_query_t(
?SQL("delete from pubsub_state"
" where jid=%(J)s and nodeid=%(Nidx)d")),