aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2009-03-06 11:50:23 +0000
committerBadlop <badlop@process-one.net>2009-03-06 11:50:23 +0000
commit367002f89a985b0981075276dd7917f64812b5f2 (patch)
tree3f7980f845b01a1694671fe8ba696aa97effd84b
parentMerge 1855 from trunk. (diff)
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
-rw-r--r--ChangeLog4
-rw-r--r--src/eldap/eldap.erl15
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 <badlop@process-one.net>
+ * 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),