]> granicus.if.org Git - ejabberd/commitdiff
Merge 1856 from trunk.
authorBadlop <badlop@process-one.net>
Fri, 6 Mar 2009 11:50:23 +0000 (11:50 +0000)
committerBadlop <badlop@process-one.net>
Fri, 6 Mar 2009 11:50:23 +0000 (11:50 +0000)
* 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
src/eldap/eldap.erl

index ff3490c77f66d92fadfc4a31225b44244891a269..f75734c2df271be2eba9f1e1b5114c6d9f25eb11 100644 (file)
--- 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)
 
index 24e234cf70677228a5d66f1a2570a290ff2ddf37..412a66862e0befd2f6dd3e43b15cd9371a68a3c2 100644 (file)
@@ -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),