diff options
author | Evgeniy Khramtsov <xramtsov@gmail.com> | 2009-05-16 13:18:15 +0000 |
---|---|---|
committer | Evgeniy Khramtsov <xramtsov@gmail.com> | 2009-05-16 13:18:15 +0000 |
commit | 5f67072e06abb8fa7ca978363dbc25b9ad2b8298 (patch) | |
tree | 97e544d78c86e46edb0484986923531bf5ec1aa2 /src | |
parent | Document how to convert Mnesia node name (diff) |
* src/eldap/eldap.erl: log warnings on unsuccessful LDAP bind attempts. Increase timeout before the next LDAP bind attempt up to five seconds if the last bind attempt was rejected by the LDAP server ("soft" error). Thanks to Konstantin Khomoutov.
SVN Revision: 2086
Diffstat (limited to 'src')
-rw-r--r-- | src/eldap/eldap.erl | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/src/eldap/eldap.erl b/src/eldap/eldap.erl index 5d7652fc..6a16b9b5 100644 --- a/src/eldap/eldap.erl +++ b/src/eldap/eldap.erl @@ -91,6 +91,8 @@ -define(SEND_TIMEOUT, 30000). -define(MAX_TRANSACTION_ID, 65535). -define(MIN_TRANSACTION_ID, 0). +%% Grace period after "soft" LDAP bind errors: +-define(GRACEFUL_RETRY_TIMEOUT, 5000). -record(eldap, {version = ?LDAP_VERSION, hosts, % Possible hosts running LDAP servers @@ -474,11 +476,14 @@ handle_info({tcp, _Socket, Data}, wait_bind_response, S) -> case catch recvd_wait_bind_response(Data, S) of bound -> dequeue_commands(S); - {fail_bind, _Reason} -> + {fail_bind, Reason} -> + report_bind_failure(S#eldap.host, S#eldap.port, Reason), + {next_state, connecting, close_and_retry(S, ?GRACEFUL_RETRY_TIMEOUT)}; + {'EXIT', Reason} -> + report_bind_failure(S#eldap.host, S#eldap.port, Reason), {next_state, connecting, close_and_retry(S)}; - {'EXIT', _Reason} -> - {next_state, connecting, close_and_retry(S)}; - {error, _Reason} -> + {error, Reason} -> + report_bind_failure(S#eldap.host, S#eldap.port, Reason), {next_state, connecting, close_and_retry(S)} end; @@ -790,7 +795,7 @@ check_tag(Data) -> _ -> throw({error,decoded_tag}) end. -close_and_retry(S) -> +close_and_retry(S, Timeout) -> catch gen_tcp:close(S#eldap.fd), Queue = dict:fold( fun(_Id, [{Timer, Command, From, _Name}|_], Q) -> @@ -799,9 +804,16 @@ close_and_retry(S) -> (_, _, Q) -> Q end, S#eldap.req_q, S#eldap.dict), - erlang:send_after(?RETRY_TIMEOUT, self(), {timeout, retry_connect}), + erlang:send_after(Timeout, self(), {timeout, retry_connect}), S#eldap{fd=null, req_q=Queue, dict=dict:new()}. +close_and_retry(S) -> + close_and_retry(S, ?RETRY_TIMEOUT). + +report_bind_failure(Host, Port, Reason) -> + ?WARNING_MSG("LDAP bind failed on ~s:~p~nReason: ~p", + [Host, Port, Reason]). + %%----------------------------------------------------------------------- %% Sort out timed out commands %%----------------------------------------------------------------------- @@ -864,8 +876,7 @@ connect_bind(S) -> host = Host, bind_timer = Timer}}; {error, Reason} -> - ?ERROR_MSG("LDAP bind failed on ~s:~p~nReason: ~p", - [Host, S#eldap.port, Reason]), + report_bind_failure(Host, S#eldap.port, Reason), NewS = close_and_retry(S), {ok, connecting, NewS#eldap{host = Host}} end; |