aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/eldap/eldap.erl27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/eldap/eldap.erl b/src/eldap/eldap.erl
index 5d7652fcc..6a16b9b54 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;