diff options
author | Evgeniy Khramtsov <xramtsov@gmail.com> | 2009-10-07 14:24:09 +0000 |
---|---|---|
committer | Evgeniy Khramtsov <xramtsov@gmail.com> | 2009-10-07 14:24:09 +0000 |
commit | 14232df14c4fda26680d3d305b70471d569012ec (patch) | |
tree | ff0227e4bc56eba5f61f25da5f9cd63737a90b95 /src | |
parent | use queue to reduced quadratic time effort on selective receive (thanks to Al... (diff) |
new option added: max_fsm_queue. removed hardcoded FSMLIMITS
SVN Revision: 2645
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_config.erl | 2 | ||||
-rw-r--r-- | src/ejabberd_s2s_out.erl | 15 | ||||
-rw-r--r-- | src/ejabberd_service.erl | 21 |
3 files changed, 27 insertions, 11 deletions
diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl index 1f583114..4e4f776a 100644 --- a/src/ejabberd_config.erl +++ b/src/ejabberd_config.erl @@ -386,6 +386,8 @@ process_term(Term, State) -> {loglevel, Loglevel} -> ejabberd_loglevel:set(Loglevel), State; + {max_fsm_queue, N} -> + add_option(max_fsm_queue, N, State); {_Opt, _Val} -> lists:foldl(fun(Host, S) -> process_host_term(Term, Host, S) end, State, State#state.hosts) diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index 455a6416..618bd6b4 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -84,15 +84,12 @@ %% Module start with or without supervisor: -ifdef(NO_TRANSIENT_SUPERVISORS). -define(SUPERVISOR_START, p1_fsm:start(ejabberd_s2s_out, [From, Host, Type], - ?FSMLIMITS ++ ?FSMOPTS)). + fsm_limit_opts() ++ ?FSMOPTS)). -else. -define(SUPERVISOR_START, supervisor:start_child(ejabberd_s2s_out_sup, [From, Host, Type])). -endif. -%% Only change this value if you now what your are doing: --define(FSMLIMITS,[]). -%% -define(FSMLIMITS, [{max_queue, 2000}]). -define(FSMTIMEOUT, 30000). %% We do not block on send anymore. @@ -132,7 +129,7 @@ start(From, Host, Type) -> start_link(From, Host, Type) -> p1_fsm:start_link(ejabberd_s2s_out, [From, Host, Type], - ?FSMLIMITS ++ ?FSMOPTS). + fsm_limit_opts() ++ ?FSMOPTS). start_connection(Pid) -> p1_fsm:send_event(Pid, init). @@ -1194,3 +1191,11 @@ terminate_if_waiting_delay(From, To) -> Pid ! terminate_if_waiting_before_retry end, Pids). + +fsm_limit_opts() -> + case ejabberd_config:get_local_option(max_fsm_queue) of + N when is_integer(N) -> + [{max_queue, N}]; + _ -> + [] + end. diff --git a/src/ejabberd_service.erl b/src/ejabberd_service.erl index 2305407b..09b19c9b 100644 --- a/src/ejabberd_service.erl +++ b/src/ejabberd_service.erl @@ -64,10 +64,6 @@ -define(FSMOPTS, []). -endif. -%% Only change this value if you now what your are doing: --define(FSMLIMITS,[]). -%% -define(FSMLIMITS, [{max_queue, 2000}]). - -define(STREAM_HEADER, "<?xml version='1.0'?>" "<stream:stream " @@ -106,8 +102,8 @@ start(SockData, Opts) -> supervisor:start_child(ejabberd_service_sup, [SockData, Opts]). start_link(SockData, Opts) -> - ?GEN_FSM:start_link( - ejabberd_service, [SockData, Opts], ?FSMLIMITS ++ ?FSMOPTS). + ?GEN_FSM:start_link(ejabberd_service, [SockData, Opts], + fsm_limit_opts(Opts) ++ ?FSMOPTS). socket_type() -> xml_stream. @@ -390,3 +386,16 @@ send_element(StateData, El) -> new_id() -> randoms:get_string(). + +fsm_limit_opts(Opts) -> + case lists:keysearch(max_fsm_queue, 1, Opts) of + {value, {_, N}} when is_integer(N) -> + [{max_queue, N}]; + _ -> + case ejabberd_config:get_local_option(max_fsm_queue) of + N when is_integer(N) -> + [{max_queue, N}]; + _ -> + [] + end + end. |