25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-11-22 16:20:52 +01:00

Fix send_last_published_item issue when running on clustered table (EJAB-793)

SVN Revision: 1741
This commit is contained in:
Christophe Romain 2008-12-20 00:01:26 +00:00
parent e6535dcc67
commit 978adbbd94
2 changed files with 31 additions and 9 deletions

View File

@ -1,3 +1,8 @@
2008-12-19 Christophe Romain <christophe.romain@process-one.net>
* src/mod_pubsub/mod_pubsub.erl: Fix send_last_published_item issue
when running on clustered table (thanks to Vincent Barat)(EJAB-793)
2008-12-18 Christophe Romain <christophe.romain@process-one.net> 2008-12-18 Christophe Romain <christophe.romain@process-one.net>
* src/mod_pubsub/mod_pubsub.erl: Check option of the nodetree instead * src/mod_pubsub/mod_pubsub.erl: Check option of the nodetree instead

View File

@ -1750,24 +1750,41 @@ get_items(Host, Node, From) ->
%% Host = host() %% Host = host()
%% Node = pubsubNode() %% Node = pubsubNode()
%% LJID = {U, S, []} %% LJID = {U, S, []}
%% @doc <p>Resend the items of a node to the user.</p> %% @doc <p>Resend the last item of a node to the user.</p>
%send_all_items(Host, Node, LJID) ->
% send_items(Host, Node, LJID, all).
send_last_item(Host, Node, LJID) -> send_last_item(Host, Node, LJID) ->
send_items(Host, Node, LJID, last). send_items(Host, Node, LJID, last).
%% TODO use cache-last-item feature %% @spec (Host, Node, LJID) -> any()
%% Host = host()
%% Node = pubsubNode()
%% LJID = {U, S, []}
%% @doc <p>Resend the items of a node to the user.</p>
%% @todo use cache-last-item feature
send_items(Host, Node, {LU, LS, LR} = LJID, Number) -> send_items(Host, Node, {LU, LS, LR} = LJID, Number) ->
ToSend = case get_items(Host, Node, LJID) of ToSend = case get_items(Host, Node, LJID) of
[] -> [] ->
[]; [];
Items -> Items ->
case Number of case Number of
last -> [lists:last(Items)]; last ->
all -> Items; %%% [lists:last(Items)] does not work on clustered table
N when N > 0 -> lists:nthtail(length(Items)-N, Items); [First|Tail] = Items,
_ -> Items [lists:foldl(
fun(CurItem, LastItem) ->
{_, {LMS, LS, LmS}} = LastItem#pubsub_item.creation,
{_, {CMS, CS, CmS}} = CurItem#pubsub_item.creation,
LTimestamp = LMS * 1000000 + LS * 1000 + LmS,
CTimestamp = CMS * 1000000 + CS * 1000 + CmS,
if
CTimestamp > LTimestamp -> CurItem;
true -> LastItem
end
end, First, Tail)];
N when N > 0 ->
%%% This case is buggy on clustered table due to lake of order
lists:nthtail(length(Items)-N, Items);
_ ->
Items
end end
end, end,
ItemsEls = lists:map( ItemsEls = lists:map(