Skip to content

Commit 744f3f4

Browse files
committed
Use max_select_wait_time to limit IO#select sleep
Instead of duplicating keepalive interval logic from Net::SSH, we can ask each session for its max_select_wait_time and use the shortest one.
1 parent 58851c5 commit 744f3f4

File tree

4 files changed

+33
-11
lines changed

4 files changed

+33
-11
lines changed

lib/net/ssh/multi/server.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,5 +229,9 @@ def postprocess(readers, writers) #:nodoc:
229229
listeners = session.listeners.keys
230230
session.postprocess(listeners & readers, listeners & writers)
231231
end
232+
233+
def max_select_wait_time
234+
session.max_select_wait_time if session
235+
end
232236
end
233237
end; end; end

lib/net/ssh/multi/session.rb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -442,12 +442,11 @@ def process(wait=nil, &block)
442442
end
443443

444444
def io_select_wait(wait)
445-
[wait, keepalive_interval].compact.min
445+
[wait, max_select_wait_time].compact.min
446446
end
447447

448-
def keepalive_interval
449-
servers = server_list.select { |s| s.options[:keepalive] }
450-
servers.map { |s| s.options[:keepalive_interval] }.compact.min
448+
def max_select_wait_time
449+
server_list.map(&:max_select_wait_time).compact.min
451450
end
452451

453452
# Runs the preprocess stage on all servers. Returns false if the block

test/server_test.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,19 @@ def test_postprocess_should_call_session_postprocess_with_ios_belonging_to_sessi
211211
assert_equal :result, srv.postprocess([1,11,3], [18,14,7,12])
212212
end
213213

214+
def test_max_select_wait_time_should_call_session_max_select_wait_time_when_session_is_open
215+
srv = server('host')
216+
session = expect_connection_to(srv)
217+
session.expects(:max_select_wait_time).returns(:result)
218+
srv.session(true)
219+
assert_equal :result, srv.max_select_wait_time
220+
end
221+
222+
def test_max_select_wait_time_should_return_nil_when_session_is_not_open
223+
srv = server('host')
224+
assert_nil srv.max_select_wait_time
225+
end
226+
214227
private
215228

216229
class MockIO

test/session_test.rb

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -200,22 +200,28 @@ def test_process_should_call_select_on_combined_readers_and_writers_from_all_ser
200200
end
201201

202202
def test_process_should_pass_minimum_keepalive_interval_as_io_select_timeout
203-
@session.use('h1', :keepalive => true)
204-
@session.use('h2', :keepalive_interval => 1)
205-
@session.use('h3', :keepalive => true, :keepalive_interval => 2)
206-
@session.use('h4', :keepalive => true, :keepalive_interval => 3)
203+
s1 = @session.use('h1', :keepalive => true)
204+
s1.expects(:max_select_wait_time).returns(300)
205+
s2 = @session.use('h2', :keepalive_interval => 1)
206+
s2.expects(:max_select_wait_time).returns(nil)
207+
s3 = @session.use('h3', :keepalive => true, :keepalive_interval => 2)
208+
s3.expects(:max_select_wait_time).returns(2)
209+
s4 = @session.use('h4', :keepalive => true, :keepalive_interval => 3)
210+
s4.expects(:max_select_wait_time).returns(3)
207211
IO.expects(:select).with([], [], nil, 2)
208212
@session.process
209213
end
210214

211215
def test_process_should_pass_wait_as_io_select_timeout_if_provided_and_minimum
212-
@session.use('h1', :keepalive => true, :keepalive_interval => 1)
216+
s1 = @session.use('h1', :keepalive => true, :keepalive_interval => 2)
217+
s1.expects(:max_select_wait_time).returns(2)
213218
IO.expects(:select).with([], [], nil, 1)
214-
@session.process(2)
219+
@session.process(1)
215220
end
216221

217222
def test_process_should_pass_nil_as_io_select_timeout_by_default
218-
@session.use('h1')
223+
s1 = @session.use('h1')
224+
s1.expects(:max_select_wait_time).returns(nil)
219225
IO.expects(:select).with([], [], nil, nil)
220226
@session.process
221227
end

0 commit comments

Comments
 (0)