# SystemTimer failing

**URL:** <https://www.ruby-forum.com/t/systemtimer-failing/186372>\
**Category:** Rails\
**Created:** [April 6, 2010, 12:08am UTC](https://www.ruby-forum.com/t/systemtimer-failing/186372 "2010-04-06T00:08:12Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![mhfs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b2d939/32.png) [@mhfs](https://www.ruby-forum.com/u/mhfs)\
**Post date:** [April 6, 2010, 12:08am UTC](https://www.ruby-forum.com/t/systemtimer-failing/186372/1 "2010-04-06T00:08:12Z")

</div>

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:  
removed\_email\_address@domain.invalid,  
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](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.

---

<div class="post-metadata">

**Author:** ![mhfs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b2d939/32.png) [@mhfs](https://www.ruby-forum.com/u/mhfs)\
**Post date:** [April 6, 2010, 12:22am UTC](https://www.ruby-forum.com/t/systemtimer-failing/186372/2 "2010-04-06T00:22:50Z")

</div>

Forgot to include other relevant information:

Rails 2.3.5, SystemTimer 1.2, ruby-ldap 0.9.11 all on Mac OSX Snow  
Leopard.

Cheers,

Marcelo.

On Mon, Apr 5, 2010 at 5:06 PM, Marcelo de Moraes S.  
\<removed\_email\_address@domain.invalid

---

<div class="post-metadata">

**Author:** ![mhfs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b2d939/32.png) [@mhfs](https://www.ruby-forum.com/u/mhfs)\
**Post date:** [April 6, 2010, 1:20am UTC](https://www.ruby-forum.com/t/systemtimer-failing/186372/3 "2010-04-06T01:20:12Z")

</div>

Hi Marcelo,

Not to avoid your specific SystemTimer and ldap timeout issue,  
but … Have you thought about trying the pure-ruby ldap lib  
Net::LDAP ([http://net-ldap.rubyforge.org/](http://net-ldap.rubyforge.org/)) instead of the c-based Ruby/  
LDAP lib you’re currently using ([http://sourceforge.net/projects/ruby-](http://sourceforge.net/projects/ruby-)  
ldap/)?

I’ve always just used Net::LDAP whenever an app needed to auth against  
and/or query an ldap db, and have never had any problems with timing  
out un-responsive/too-long-running ldap connections using the regular  
old ruby Timeout ([http://ruby-doc.org/core/classes/Timeout.html](http://ruby-doc.org/core/classes/Timeout.html)). If  
you can, I’d give Net::LDAP a chance to see if that doesn’t solve your  
problems.

Jeff

On Apr 5, 3:21 pm, Marcelo de Moraes S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![mhfs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b2d939/32.png) [@mhfs](https://www.ruby-forum.com/u/mhfs)\
**Post date:** [April 6, 2010, 2:22am UTC](https://www.ruby-forum.com/t/systemtimer-failing/186372/4 "2010-04-06T02:22:50Z")

</div>

Thanks, Jeff. This could be an alternative. However, we are lucky that  
the  
SystemTimer is working fine on Ubuntu. It’s just failing on my local dev  
box  
(An OSX Snow Leopard one) and I’m intrigued…

Marcelo.

---

<div class="post-metadata">

**Author:** ![mhfs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b2d939/32.png) [@mhfs](https://www.ruby-forum.com/u/mhfs)\
**Post date:** [April 6, 2010, 8:18pm UTC](https://www.ruby-forum.com/t/systemtimer-failing/186372/5 "2010-04-06T20:18:12Z")

</div>

No, I can’t tell you. First, because it has nothing to do with the topic  
of  
this message, seconds, because it is obvious it is GoogleGroups, and it  
is  
simple enough to cancel the subscription, and third, because a simple  
google  
search is enough to get very clear instructions.

Gee, this list needs some moderation.

Marcelo.

---

<div class="post-metadata">

**Author:** ![mhfs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b2d939/32.png) [@mhfs](https://www.ruby-forum.com/u/mhfs)\
**Post date:** [April 6, 2010, 10:20am UTC](https://www.ruby-forum.com/t/systemtimer-failing/186372/6 "2010-04-06T10:20:27Z")

</div>

Hello… Can anyone tell me how to get off this mailing list?

* * *

From: Marcelo de Moraes S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
To: removed\_email\_address@domain.invalid  
Sent: Mon, April 5, 2010 5:06:50 PM  
Subject: [Rails] SystemTimer failing

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:  
removed\_email\_address@domain.invalid, 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](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.

You received this message because you are subscribed to the Google  
Groups “Ruby on Rails: Talk” group.  
To post to this group, send email to removed\_email\_address@domain.invalid.  
To unsubscribe from this group, send email to  
removed\_email\_address@domain.invalid.  
For more options, visit this group at  
[http://groups.google.com/group/rubyonrails-talk?hl=en](http://groups.google.com/group/rubyonrails-talk?hl=en).
