diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index 43cf49f76..615f1d3fa 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -445,8 +445,6 @@ send_loop(State) -> send_loop(State); {presence, User, Server, Resources, JID} -> %% get resources caps and check if processing is needed - %% get_caps may be blocked few seconds, get_caps as well - %% so we spawn the whole process not to block other queries spawn(fun() -> {HasCaps, ResourcesCaps} = lists:foldl(fun(Resource, {R, L}) -> case mod_caps:get_caps({User, Server, Resource}) of @@ -1985,29 +1983,16 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIDs) -> %% Number = last | integer() %% @doc

Resend the items of a node to the user.

%% @todo use cache-last-item feature +send_items(Host, Node, NodeId, Type, LJID, last) -> + send_items(Host, Node, NodeId, Type, LJID, 1); send_items(Host, Node, NodeId, Type, {LU, LS, LR} = LJID, Number) -> ToSend = case node_action(Host, Type, get_items, [NodeId, LJID]) of {result, []} -> []; {result, Items} -> case Number of - last -> - %%% [lists:last(Items)] does not work on clustered table - [First|Tail] = Items, - [lists:foldl( - fun(CurItem, LastItem) -> - {LTimeStamp, _} = LastItem#pubsub_item.creation, - {CTimeStamp, _} = CurItem#pubsub_item.creation, - if - CTimeStamp > LTimeStamp -> CurItem; - true -> LastItem - end - end, First, Tail)]; - N when N > 0 -> - %%% This case is buggy on clustered table due to lack of order - lists:nthtail(length(Items)-N, Items); - _ -> - Items + N when N > 0 -> lists:sublist(Items, N); + _ -> Items end; _ -> [] diff --git a/src/mod_pubsub/node_default.erl b/src/mod_pubsub/node_default.erl index 013b5c211..663a508c2 100644 --- a/src/mod_pubsub/node_default.erl +++ b/src/mod_pubsub/node_default.erl @@ -699,9 +699,8 @@ del_state(NodeId, JID) -> %% ```get_items(NodeId, From) -> %% node_default:get_items(NodeId, From).'''

get_items(NodeId, _From) -> - Items = mnesia:match_object( - #pubsub_item{itemid = {'_', NodeId}, _ = '_'}), - {result, Items}. + Items = mnesia:match_object(#pubsub_item{itemid = {'_', NodeId}, _ = '_'}), + {result, lists:reverse(lists:keysort(#pubsub_item.modification, Items))}. get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId) -> GenKey = jlib:short_prepd_bare_jid(JID), GenState = get_state(NodeId, GenKey),