From: Evgeniy Khramtsov Date: Fri, 23 Jan 2009 07:28:49 +0000 (+0000) Subject: * src/eldap/eldap.erl: Close a connection on tcp_error. X-Git-Tag: v2.1.0~18^2~458 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e2fa195e20be4a8ec9260f4bfda9a549cfb3e848;p=ejabberd * src/eldap/eldap.erl: Close a connection on tcp_error. SVN Revision: 1851 --- diff --git a/ChangeLog b/ChangeLog index 6d2f2b9a4..d62e1ad2f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2009-01-23 Evgeniy Khramtsov + + * src/eldap/eldap.erl: Close a connection on tcp_error. + 2009-01-23 Badlop * src/odbc/mysql.sql: Fix complain about comment syntax diff --git a/src/eldap/eldap.erl b/src/eldap/eldap.erl index 6384c87b7..799012fc5 100644 --- a/src/eldap/eldap.erl +++ b/src/eldap/eldap.erl @@ -517,22 +517,13 @@ handle_info({tcp, _Socket, Data}, StateName, S) handle_info({tcp_closed, _Socket}, Fsm_state, S) -> ?WARNING_MSG("LDAP server closed the connection: ~s:~p~nIn State: ~p", [S#eldap.host, S#eldap.port ,Fsm_state]), - F = fun(_Id, [{Timer, From, _Name}|_]) -> - gen_fsm:reply(From, {error, tcp_closed}), - cancel_timer(Timer) - end, - dict:map(F, S#eldap.dict), - {ok, NextState, NewS} = connect_bind(S#eldap{fd = null, - dict = dict:new(), - bind_q=queue:new()}), + {ok, NextState, NewS} = close_and_rebind(S, tcp_closed), {next_state, NextState, NewS}; handle_info({tcp_error, _Socket, Reason}, Fsm_state, S) -> ?DEBUG("eldap received tcp_error: ~p~nIn State: ~p", [Reason, Fsm_state]), - %% XXX wouldn't it be safer to try reconnect ? - %% if we were waiting a result, we may mait forever - %% cause request is probably lost.... - {next_state, Fsm_state, S}; + {ok, NextState, NewS} = close_and_rebind(S, tcp_error), + {next_state, NextState, NewS}; %% %% Timers @@ -1006,3 +997,13 @@ bump_id(#eldap{id = Id}) when Id > ?MAX_TRANSACTION_ID -> ?MIN_TRANSACTION_ID; bump_id(#eldap{id = Id}) -> Id + 1. + +close_and_rebind(State, Err) -> + F = fun(_Id, [{Timer, From, _Name}|_]) -> + gen_fsm:reply(From, {error, Err}), + cancel_timer(Timer) + end, + dict:map(F, State#eldap.dict), + connect_bind(State#eldap{fd = null, + dict = dict:new(), + bind_q=queue:new()}).