Skip to content

Commit

Permalink
Enforce pubsub node removal, revert previous commit (#1320)
Browse files Browse the repository at this point in the history
This reverts commit 2976c2d.
and enforce node purge/removal instead
  • Loading branch information
Christophe Romain committed Dec 9, 2016
1 parent 2976c2d commit bcc04d9
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 7 deletions.
6 changes: 6 additions & 0 deletions include/pubsub.hrl
Expand Up @@ -176,3 +176,9 @@
creation ,% :: {erlang:timestamp(), jlib:ljid()},
payload % :: mod_pubsub:payload()
}).

-record(pubsub_orphan,
{
nodeid ,% :: mod_pubsub:nodeIdx(),
items = [] % :: list()
}).
29 changes: 25 additions & 4 deletions src/node_flat.erl
Expand Up @@ -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;
Expand Down Expand Up @@ -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}}.
Expand Down Expand Up @@ -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()}
Expand Down Expand Up @@ -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>
Expand Down Expand Up @@ -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.

Expand Down
3 changes: 0 additions & 3 deletions src/node_flat_sql.erl
Expand Up @@ -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")),
Expand Down

0 comments on commit bcc04d9

Please sign in to comment.