From 367002f89a985b0981075276dd7917f64812b5f2 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 6 Mar 2009 11:50:23 +0000 Subject: [PATCH] Merge 1856 from trunk. * src/eldap/eldap.erl: moves waiting for response queries to pending queue on an LDAP connection failure (thanks to Evgeniy Khramtsov) SVN Revision: 1974 --- ChangeLog | 4 ++++ src/eldap/eldap.erl | 15 +++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index ff3490c77..f75734c2d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2009-03-06 Badlop + * src/eldap/eldap.erl: moves waiting for response queries to + pending queue on an LDAP connection failure (thanks to Evgeniy + Khramtsov) + * src/eldap/eldap.erl: implemented queue for pending queries (thanks to Evgeniy Khramtsov) diff --git a/src/eldap/eldap.erl b/src/eldap/eldap.erl index 24e234cf7..412a66862 100644 --- a/src/eldap/eldap.erl +++ b/src/eldap/eldap.erl @@ -595,7 +595,7 @@ send_command(Command, From, S) -> case gen_tcp:send(S#eldap.fd, Bytes) of ok -> Timer = erlang:start_timer(?CMD_TIMEOUT, self(), {cmd_timeout, Id}), - New_dict = dict:store(Id, [{Timer, From, Name}], S#eldap.dict), + New_dict = dict:store(Id, [{Timer, Command, From, Name}], S#eldap.dict), {ok, S#eldap{id = Id, dict = New_dict}}; Error -> Error @@ -730,7 +730,7 @@ check_bind_reply(Other, _From) -> get_op_rec(Id, Dict) -> case dict:find(Id, Dict) of - {ok, [{Timer, From, Name}|Res]} -> + {ok, [{Timer, _Command, From, Name}|Res]} -> {Timer, From, Name, Res}; error -> throw({error, unkown_id}) @@ -792,8 +792,15 @@ check_tag(Data) -> close_and_retry(S) -> catch gen_tcp:close(S#eldap.fd), + Queue = dict:fold( + fun(_Id, [{Timer, Command, From, _Name}|_], Q) -> + cancel_timer(Timer), + queue:in_r({Command, From}, Q); + (_, _, Q) -> + Q + end, S#eldap.req_q, S#eldap.dict), erlang:send_after(?RETRY_TIMEOUT, self(), {timeout, retry_connect}), - S#eldap{fd = null}. + S#eldap{fd=null, req_q=Queue, dict=dict:new()}. %%----------------------------------------------------------------------- %% Sort out timed out commands @@ -801,7 +808,7 @@ close_and_retry(S) -> cmd_timeout(Timer, Id, S) -> Dict = S#eldap.dict, case dict:find(Id, Dict) of - {ok, [{Timer, From, Name}|Res]} -> + {ok, [{Timer, _Command, From, Name}|Res]} -> case Name of searchRequest -> {Res1, Ref1} = polish(Res),