[#75687] [Ruby trunk Bug#12416] struct rb_id_table lacks mark function — shyouhei@...
Issue #12416 has been reported by Shyouhei Urabe.
3 messages
2016/05/23
[#75763] [Ruby trunk Feature#12435] Using connect_nonblock to open TCP connections in Net::HTTP#connect — mohamed.m.m.hafez@...
Issue #12435 has been reported by Mohamed Hafez.
3 messages
2016/05/28
[#75774] Errno::EAGAIN thrown by OpenSSL::SSL::SSLSocket#connect_nonblock — Mohamed Hafez <mohamed.m.m.hafez@...>
Hi all, every now and then in my production server, I'm
4 messages
2016/05/30
[#75775] Re: Errno::EAGAIN thrown by OpenSSL::SSL::SSLSocket#connect_nonblock
— Mohamed Hafez <mohamed.m.m.hafez@...>
2016/05/30
Or does MRI's OpenSSL::SSL::SSLSocket#connect_nonblock just return
[#75782] Important: Somewhat backwards-incompatible change (Fwd: [ruby-cvs:62388] duerst:r55225 (trunk): * string.c: Activate full Unicode case mapping for UTF-8) — Martin J. Dürst <duerst@...>
V2l0aCB0aGUgY2hhbmdlIGJlbG93LCBJIGhhdmUgYWN0aXZhdGVkIGZ1bGwgVW5pY29kZSBjYXNl
4 messages
2016/05/31
[ruby-core:75386] [Ruby trunk Bug#12342] DRb.stop_service doesn't kill sleeping TimerIdConv threads
From:
jrafanie@...
Date:
2016-05-06 14:08:33 UTC
List:
ruby-core #75386
Issue #12342 has been updated by Joe Rafaniello.
I have opened a pull request to expose an API for killing the timer thread. This PR should be enough to workaround this issue for me, although it would be nice if DRb.start_service could be responsible for creating/starting the timer and stop_service could then automatically stop any timer thread created by the service:
https://github.com/ruby/ruby/pull/1342
----------------------------------------
Bug #12342: DRb.stop_service doesn't kill sleeping TimerIdConv threads
https://bugs.ruby-lang.org/issues/12342#change-58511
* Author: Joe Rafaniello
* Status: Open
* Priority: Normal
* Assignee:
* ruby -v: ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
* Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
According to this commit[1], it's a good idea for DRb.stop_service to kill threads it creates.
My problem is I have a workflow that creates a new DRb server and provides it a TimerIdConv for keeping drb objects alive until it's not accessed for X seconds. It then stops the service.
This workflow can happen many times.
The TimerIdConv.new(5) call creates a new thread each time that never exits.
There isn't a public interface to kill these threads so I have to use instance variables to get the thread so it can be killed.
Also, you can't reuse the TimerIdConv because you don't know how long it has been sleeping and there is not a way to reset it to ensure it sleeps the full timeout.
I would prefer if I could tell DRb.start_service to use a :timer_idconv => 5, have it create the TimerIdConv and be responsible for killing it when I call stop_service.
See code below. I have tested with ruby 2.3.1 and the code below slowly continues to grow in thread count.
[1] Commit: c474ecb0dfe0dd0d5e6b2b41f09eaf251d0c7079 or https://github.com/ruby/ruby/commit/c474ecb0dfe0dd0d5e6b2b41f09eaf251d0c7079#diff-140ee364bff64098bb12e0e96fadb402
[2] https://github.com/ruby/ruby/blob/8ef6dacb248876b444595a26ea78c35eb07a188b/lib/drb/timeridconv.rb#L28
~~~
require 'drb'
require 'drb/timeridconv'
100.times do
# setup the drb server with a one second timer
# creates a new thread that never dies
timer = DRb::TimerIdConv.new(5)
service = DRb.start_service("druby://127.0.0.1:0", nil, :idconv => timer)
# ... some code that uses the DRb service
# stop the drb server now that we're done with it
service.stop_service
# Below is ugly code that kills the timer thread. Without the code below, the
# thread stays alive forever. This should have a public API.
# It would be nice if DRb.start_service
# accepted a :timer_idconv => 5 option that would create the timer thread itself
# and was responsible for killing this thread when calling stop_service.
# holder = timer.instance_variable_get(:@holder)
# keeper = holder.instance_variable_get(:@keeper) if holder
# keeper.kill if keeper
puts Thread.list.length
sleep 2
end
~~~
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>