@@ -417,28 +417,31 @@ def run_gc
417
417
# XXX this test is not deterministic (because Unix signal handling is not)
418
418
# and may fail on a loaded system
419
419
it "should run signal handlers while waiting for a response" do
420
+ kill_time = 0.1
421
+ query_time = 2 * kill_time
422
+
420
423
mark = { }
421
- trap ( :USR1 ) { mark [ :USR1 ] = Time . now }
424
+
422
425
begin
423
- mark [ :START ] = Time . now
426
+ trap ( :USR1 ) { mark . store ( :USR1 , Time . now ) }
424
427
pid = fork do
425
- sleep 0.1 # wait for client query to start
428
+ sleep kill_time # wait for client query to start
426
429
Process . kill ( :USR1 , Process . ppid )
427
430
sleep # wait for explicit kill to prevent GC disconnect
428
431
end
429
- @client . query ( 'SELECT SLEEP(0.2)' )
430
- mark [ :END ] = Time . now
431
- expect ( mark . include? ( :USR1 ) ) . to be true
432
- expect ( mark [ :USR1 ] - mark [ :START ] ) . to be >= 0.1
433
- expect ( mark [ :USR1 ] - mark [ :START ] ) . to be < 0.13
434
- expect ( mark [ :END ] - mark [ :USR1 ] ) . to be > 0.09
435
- expect ( mark [ :END ] - mark [ :START ] ) . to be >= 0.2
436
- expect ( mark [ :END ] - mark [ :START ] ) . to be < 0.23
432
+ mark . store ( :QUERY_START , Time . now )
433
+ @client . query ( "SELECT SLEEP(#{ query_time } )" )
434
+ mark . store ( :QUERY_END , Time . now )
435
+ ensure
437
436
Process . kill ( :TERM , pid )
438
437
Process . waitpid2 ( pid )
439
- ensure
440
438
trap ( :USR1 , 'DEFAULT' )
441
439
end
440
+
441
+ # the query ran uninterrupted
442
+ expect ( mark . fetch ( :QUERY_END ) - mark . fetch ( :QUERY_START ) ) . to be_within ( 0.02 ) . of ( query_time )
443
+ # signals fired while the query was running
444
+ expect ( mark . fetch ( :USR1 ) ) . to be_between ( mark . fetch ( :QUERY_START ) , mark . fetch ( :QUERY_END ) )
442
445
end
443
446
444
447
it "#socket should return a Fixnum (file descriptor from C)" do
0 commit comments