~ubuntu-branches/ubuntu/trusty/ejabberd/trusty-proposed

« back to all changes in this revision

Viewing changes to src/ejabberd_sm.erl

  • Committer: Bazaar Package Importer
  • Author(s): Konstantin Khomoutov, Konstantin Khomoutov, Gerfried Fuchs
  • Date: 2010-04-06 13:00:03 UTC
  • mfrom: (1.1.14 upstream) (13.1.1 sid)
  • Revision ID: james.westby@ubuntu.com-20100406130003-ub626hx26kgazp79
Tags: 2.1.3-1
[ Konstantin Khomoutov ]
* New upstream release.
* Remove obsolete c2s-p1-fsm.patch
* Remove obsolete ejabberdctl-help-dashes.patch
* Update mod_admin_extra to revision 1078
* Refresh shared_roster_recent.patch
* Refresh shared_roster_online.patch
* Clarify how to do mixed IPv4/IPv6 setup of ejabberd listeners
  as suggested by Marc Dequènes in the discussion of #573801.

[ Gerfried Fuchs ]
* Remove Torsten Werner from maintainer field on his own wish - thanks for
  your work so far! (closes: #578722)
* Promote Konstantin to Maintainer to best fit reality. Enjoy. :)

Show diffs side-by-side

added added

removed removed

Lines of Context:
92
92
 
93
93
open_session(SID, User, Server, Resource, Info) ->
94
94
    set_session(SID, User, Server, Resource, undefined, Info),
95
 
    inc_session_counter(jlib:nameprep(Server)),
 
95
    mnesia:dirty_update_counter(session_counter,
 
96
                                jlib:nameprep(Server), 1),
96
97
    check_for_sessions_to_replace(User, Server, Resource),
97
98
    JID = jlib:make_jid(User, Server, Resource),
98
99
    ejabberd_hooks:run(sm_register_connection_hook, JID#jid.lserver,
105
106
    end,
106
107
    F = fun() ->
107
108
                mnesia:delete({session, SID}),
108
 
                dec_session_counter(jlib:nameprep(Server))
 
109
                mnesia:dirty_update_counter(session_counter,
 
110
                                            jlib:nameprep(Server), -1)
109
111
        end,
110
112
    mnesia:sync_dirty(F),
111
113
    JID = jlib:make_jid(User, Server, Resource),
263
265
    mnesia:add_table_index(session, usr),
264
266
    mnesia:add_table_index(session, us),
265
267
    mnesia:add_table_copy(session, node(), ram_copies),
 
268
    mnesia:add_table_copy(session_counter, node(), ram_copies),
266
269
    mnesia:subscribe(system),
267
270
    ets:new(sm_iqtable, [named_table]),
268
271
    lists:foreach(
316
319
    end,
317
320
    {noreply, State};
318
321
handle_info({mnesia_system_event, {mnesia_down, Node}}, State) ->
319
 
    clean_table_from_bad_node(Node),
 
322
    recount_session_table(Node),
320
323
    {noreply, State};
321
324
handle_info({register_iq_handler, Host, XMLNS, Module, Function}, State) ->
322
325
    ets:insert(sm_iqtable, {{XMLNS, Host}, Module, Function}),
373
376
        end,
374
377
    mnesia:sync_dirty(F).
375
378
 
376
 
clean_table_from_bad_node(Node) ->
 
379
%% Recalculates alive sessions when Node goes down 
 
380
%% and updates session and session_counter tables 
 
381
recount_session_table(Node) ->
377
382
    F = fun() ->
378
383
                Es = mnesia:select(
379
384
                       session,
381
386
                         [{'==', {node, '$1'}, Node}],
382
387
                         ['$_']}]),
383
388
                lists:foreach(fun(E) ->
384
 
                                      {_, LServer} = E#session.us,
385
 
                                      dec_session_counter(LServer),
386
389
                                      mnesia:delete({session, E#session.sid})
387
 
                              end, Es)
 
390
                              end, Es),
 
391
                %% reset session_counter table with active sessions
 
392
                mnesia:clear_table(session_counter),
 
393
                lists:foreach(fun(Server) ->
 
394
                                LServer = jlib:nameprep(Server),
 
395
                                Hs = mnesia:select(session,
 
396
                                    [{#session{usr = '$1', _ = '_'},
 
397
                                    [{'==', {element, 2, '$1'}, LServer}],
 
398
                                    ['$1']}]),
 
399
                                mnesia:write(
 
400
                                    #session_counter{vhost = LServer, 
 
401
                                                     count = length(Hs)})
 
402
                              end, ?MYHOSTS)
388
403
        end,
389
 
    mnesia:sync_dirty(F).
 
404
    mnesia:async_dirty(F).
390
405
 
391
406
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
392
407
 
663
678
        _ -> ?MAX_USER_SESSIONS
664
679
    end.
665
680
 
666
 
inc_session_counter(LServer) ->
667
 
    F = fun() ->
668
 
                case mnesia:wread({session_counter, LServer}) of
669
 
                    [C] ->
670
 
                        Count = C#session_counter.count + 1,
671
 
                        C2 = C#session_counter{count = Count},
672
 
                        mnesia:write(C2);
673
 
                    _ ->
674
 
                        mnesia:write(#session_counter{vhost = LServer,
675
 
                                                      count = 1})
676
 
                end
677
 
        end,
678
 
    mnesia:sync_dirty(F).
679
 
 
680
 
dec_session_counter(LServer) ->
681
 
    F = fun() ->
682
 
                case mnesia:wread({session_counter, LServer}) of
683
 
                    [C] ->
684
 
                        Count = C#session_counter.count - 1,
685
 
                        C2 = C#session_counter{count = Count},
686
 
                        mnesia:write(C2);
687
 
                    _ ->
688
 
                        error
689
 
                end
690
 
        end,
691
 
    mnesia:sync_dirty(F).
692
 
 
693
 
 
694
681
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
695
682
 
696
683
process_iq(From, To, Packet) ->