]> granicus.if.org Git - ejabberd/commitdiff
Enforce pubsub node removal, revert previous commit (#1320)
authorChristophe Romain <christophe.romain@process-one.net>
Fri, 9 Dec 2016 11:01:42 +0000 (12:01 +0100)
committerChristophe Romain <christophe.romain@process-one.net>
Fri, 9 Dec 2016 11:51:08 +0000 (12:51 +0100)
This reverts commit 2976c2d921fcc4eb0c55abb54842351cc0adfb86.
and enforce node purge/removal instead

include/pubsub.hrl
src/node_flat.erl
src/node_flat_sql.erl

index a058072474576dde24f8e9af9088b5efa5148daf..17a7f3abfdffbb2c2d68145bd5c6df053e299635 100644 (file)
     creation ,% :: {erlang:timestamp(), jlib:ljid()},
     payload  % :: mod_pubsub:payload()
 }).
+
+-record(pubsub_orphan,
+{
+    nodeid    ,% :: mod_pubsub:nodeIdx(),
+    items = [] % :: list()
+}).
index f44f251e055bcbfb9d576f82f1c6c73b5b85fbf0..7c7d344a69446f00b1dc7f17653e10a3187409ff 100644 (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.
 
index 2372b5357060790b462deea9dfd8520a7e864ab0..7e5ce788f1d5f039fb06bda6210a48d9d0e9b651 100644 (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")),