Hello list,
I have searched everywhere else, tesed extensively and came to a point
where
I do not have a clue on what is happening.
I am using SystemTimer and Ruby/LDAP in my Rails application. Ruby/LDAP
to
authenticate against a LDAP server and SystemTimer in an effort to avoid
potential long hangs.
Fact #1: SystemTimer works fine with the LDAP::Conn#bind method. It does
cut
at the right time if it fails. However, for some unknowing mystic
reason, it
just will not work with LDAP::Conn#search2.
The code I am using:
begin
arr = SystemTimer.timeout_after(5.seconds) do
connection.bind(self.bind_dn,self.password)
connection.search2(self.base_dn,1,“(& (userPassword=#{password})
(mail=#{email}))”,nil,false,5,5000)
end
rescue Exception => e
msg = ‘LDAP server error.’
logger.error(logger_msg_template.call(“#{msg} - Exception:
#{e.message}”))
raise Timeout::Error.new(msg)
end
So, if bind takes more than 5 seconds, timeout will throw the correctly
after 5 seconds. Good. If bind works, we then proceed to the search2
call.
Things get sensitive here. If for any reason the search2 delays too
much,
the process is bound to just hang and wait for it’s return. Often it
happens
because the query is wrong (an attribute doesn’t exist in the LDAP
entry,
which might happen given the context of this code).
SystemTimer does throw the Timeout::Error (“time’s up!”), but it just
doesn’t kill the Thread after the seconds specfied in the
timeout_after’s param. Check out this request that I just made:
ERROR: LDAP server error. - Exception: time’s up! - USER:
[email protected],
ACCOUNT: MyAccount, LDAP HOST: 89.150.80.164, PORT: 389.
SQL (0.3ms) ROLLBACK
Rendering template within layouts/application
Rendering directory/index
Completed in 34212ms (View: 19, DB: 7) | 200 OK [http://localhost/ldap]
Check the first line, it is from Rails’ logger. I also print the
exception
message, you can see that it was a “Time’s up!” (from SystemTimer), but
look
at how long it took: almost 35 seconds.
It is risky, since if many users are trying to setup a LDAP at the same
time, our service could just hang completely.
I’m really lost and really need some enlightenment here, any suggestion
appreciated!
Cheers,
Marcelo.