diff --git a/src/expat_erl.c b/src/expat_erl.c index e38420f5f..d32189813 100644 --- a/src/expat_erl.c +++ b/src/expat_erl.c @@ -169,6 +169,8 @@ static ErlDrvData expat_erl_start(ErlDrvPort port, char *buff) d->parser, (XML_StartNamespaceDeclHandler) erlXML_StartNamespaceDeclHandler); XML_SetReturnNSTriplet(d->parser, 1); + XML_SetDefaultHandler(d->parser, NULL); + return (ErlDrvData)d; } diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index 42f8d7a79..42c0efadf 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -479,6 +479,55 @@ update_state_database(_Host, _ServerHost) -> ?ERROR_MSG("Problem updating Pubsub state tables:~n~p", [Reason]) end; + [stateid, items, affiliation, subscriptions] -> + ?INFO_MSG("upgrade state pubsub table", []), + F = fun ({pubsub_state, {JID, Nidx}, Items, Aff, Subs}, Acc) -> + NewState = #pubsub_state{stateid = {JID, Nidx}, + nodeidx = Nidx, + items = Items, + affiliation = Aff, + subscriptions = Subs}, + [NewState | Acc] + end, + {atomic, NewRecs} = mnesia:transaction(fun mnesia:foldl/3, + [F, [], pubsub_state]), + {atomic, ok} = mnesia:delete_table(pubsub_state), + {atomic, ok} = mnesia:create_table(pubsub_state, + [{disc_copies, [node()]}, + {attributes, record_info(fields, pubsub_state)}]), + FNew = fun () -> + lists:foreach(fun mnesia:write/1, NewRecs) + end, + case mnesia:transaction(FNew) of + {atomic, Res1} -> + ?INFO_MSG("Pubsub state tables updated correctly: ~p", [Res1]); + {aborted, Rea1} -> + ?ERROR_MSG("Problem updating Pubsub state table:~n~p", [Rea1]) + end, + ?INFO_MSG("upgrade item pubsub table", []), + F = fun ({pubsub_item, {ItemId, Nidx}, C, M, P}, Acc) -> + NewItem = #pubsub_item{itemid = {ItemId, Nidx}, + nodeidx = Nidx, + creation = C, + modification = M, + payload = P}, + [NewItem | Acc] + end, + {atomic, NewRecs} = mnesia:transaction(fun mnesia:foldl/3, + [F, [], pubsub_item]), + {atomic, ok} = mnesia:delete_table(pubsub_item), + {atomic, ok} = mnesia:create_table(pubsub_item, + [{disc_copies, [node()]}, + {attributes, record_info(fields, pubsub_item)}]), + FNew = fun () -> + lists:foreach(fun mnesia:write/1, NewRecs) + end, + case mnesia:transaction(FNew) of + {atomic, Res2} -> + ?INFO_MSG("Pubsub item tables updated correctly: ~p", [Res2]); + {aborted, Rea2} -> + ?ERROR_MSG("Problem updating Pubsub item table:~n~p", [Rea2]) + end; _ -> ok end. diff --git a/src/p1_fsm.erl b/src/p1_fsm.erl index 3fc6d90c4..4f2705782 100644 --- a/src/p1_fsm.erl +++ b/src/p1_fsm.erl @@ -395,7 +395,8 @@ loop(Parent, Name, StateName, StateData, Mod, Time, Debug, {process_limit, Limit} -> Reason = {process_limit, Limit}, Msg = {'EXIT', Parent, {error, {process_limit, Limit}}}, - terminate(Reason, Name, Msg, Mod, StateName, StateData, Debug) + terminate(Reason, Name, Msg, Mod, StateName, StateData, Debug, + queue:new()) end, process_message(Parent, Name, StateName, StateData, Mod, Time, Debug, Limits, Queue, QueueLen). @@ -451,7 +452,8 @@ decode_msg(Msg,Parent, Name, StateName, StateData, Mod, Time, Debug, [Name, StateName, StateData, Mod, Time, Limits, Queue, QueueLen], Hib); {'EXIT', Parent, Reason} -> - terminate(Reason, Name, Msg, Mod, StateName, StateData, Debug); + terminate(Reason, Name, Msg, Mod, StateName, StateData, Debug, + Queue); _Msg when Debug == [] -> handle_msg(Msg, Parent, Name, StateName, StateData, Mod, Time, Limits, Queue, QueueLen); @@ -471,8 +473,9 @@ system_continue(Parent, Debug, [Name, StateName, StateData, Limits, Queue, QueueLen). system_terminate(Reason, _Parent, Debug, - [Name, StateName, StateData, Mod, _Time, _Limits]) -> - terminate(Reason, Name, [], Mod, StateName, StateData, Debug). + [Name, StateName, StateData, Mod, _Time, + _Limits, Queue, _QueueLen]) -> + terminate(Reason, Name, [], Mod, StateName, StateData, Debug, Queue). system_code_change([Name, StateName, StateData, Mod, Time, Limits, Queue, QueueLen], @@ -574,19 +577,25 @@ handle_msg(Msg, Parent, Name, StateName, StateData, Mod, _Time, _ -> normal end, - terminate(Reason, Name, Msg, Mod, StateName, NStateData, []); + Queue1 = + case Reason of + normal -> Queue; + _ -> queue:new() + end, + terminate(Reason, Name, Msg, Mod, StateName, NStateData, [], + Queue1); {stop, Reason, NStateData} -> - terminate(Reason, Name, Msg, Mod, StateName, NStateData, []); + terminate(Reason, Name, Msg, Mod, StateName, NStateData, [], Queue); {stop, Reason, Reply, NStateData} when From =/= undefined -> {'EXIT', R} = (catch terminate(Reason, Name, Msg, Mod, - StateName, NStateData, [])), + StateName, NStateData, [], Queue)), reply(From, Reply), exit(R); {'EXIT', What} -> - terminate(What, Name, Msg, Mod, StateName, StateData, []); + terminate(What, Name, Msg, Mod, StateName, StateData, [], Queue); Reply -> terminate({bad_return_value, Reply}, - Name, Msg, Mod, StateName, StateData, []) + Name, Msg, Mod, StateName, StateData, [], Queue) end. handle_msg(Msg, Parent, Name, StateName, StateData, @@ -631,19 +640,27 @@ handle_msg(Msg, Parent, Name, StateName, StateData, _ -> normal end, - terminate(Reason, Name, Msg, Mod, StateName, NStateData, Debug); + Queue1 = + case Reason of + normal -> Queue; + _ -> queue:new() + end, + terminate(Reason, Name, Msg, Mod, StateName, NStateData, Debug, + Queue1); {stop, Reason, NStateData} -> - terminate(Reason, Name, Msg, Mod, StateName, NStateData, Debug); + terminate(Reason, Name, Msg, Mod, StateName, NStateData, Debug, + Queue); {stop, Reason, Reply, NStateData} when From =/= undefined -> {'EXIT', R} = (catch terminate(Reason, Name, Msg, Mod, - StateName, NStateData, Debug)), + StateName, NStateData, Debug, + Queue)), reply(Name, From, Reply, Debug, StateName), exit(R); {'EXIT', What} -> - terminate(What, Name, Msg, Mod, StateName, StateData, Debug); + terminate(What, Name, Msg, Mod, StateName, StateData, Debug, Queue); Reply -> terminate({bad_return_value, Reply}, - Name, Msg, Mod, StateName, StateData, Debug) + Name, Msg, Mod, StateName, StateData, Debug, Queue) end. dispatch({'$gen_event', Event}, Mod, StateName, StateData) -> @@ -679,7 +696,10 @@ reply(Name, {To, Tag}, Reply, Debug, StateName) -> %%% Terminate the server. %%% --------------------------------------------------- -terminate(Reason, Name, Msg, Mod, StateName, StateData, Debug) -> +terminate(Reason, Name, Msg, Mod, StateName, StateData, Debug, Queue) -> + lists:foreach( + fun(Message) -> self() ! Message end, + queue:to_list(Queue)), case catch Mod:terminate(Reason, StateName, StateData) of {'EXIT', R} -> error_info(Mod, R, Name, Msg, StateName, StateData, Debug), @@ -762,7 +782,8 @@ get_msg(Msg) -> Msg. %% Status information %%----------------------------------------------------------------- format_status(Opt, StatusData) -> - [PDict, SysState, Parent, Debug, [Name, StateName, StateData, Mod, _Time]] = + [PDict, SysState, Parent, Debug, + [Name, StateName, StateData, Mod, _Time, _Limits, _Queue, _QueueLen]] = StatusData, NameTag = if is_pid(Name) -> pid_to_list(Name); @@ -835,7 +856,7 @@ rpc_call(Node, Mod, Fun, Args, Timeout) -> {Ref, Result} -> erlang:demonitor(MRef, [flush]), Result; - {'DOWN', MRef, _, _, Reason} -> + {'DOWN', MRef, _, _, noconnection = Reason} -> {badrpc, Reason} after Timeout -> erlang:demonitor(MRef, [flush]),