|
23 | 23 | ret = double('ret') |
24 | 24 | tm.instance_variable_set(:@task, task) |
25 | 25 | expect(tm.external_task_heartbeat(task){ret}).to eq(ret) |
26 | | - expect(tm.instance_variable_get(:@last_task_heartbeat)).to eq(epoch) |
27 | 26 | end |
28 | 27 | end |
29 | 28 |
|
|
44 | 43 | let (:tm){ PerfectQueue::TaskMonitor.new(logger: double('logger').as_null_object, task_heartbeat_interval: 1) } |
45 | 44 | let (:err){ StandardError.new('heartbeat preempted') } |
46 | 45 | let (:now){ Time.now.to_i } |
47 | | - let (:task){ double('task', timeout: now) } |
| 46 | + let (:task){ double('task', attributes: {}, last_heartbeat: now) } |
| 47 | + let (:runner){ double('runner') } |
48 | 48 | before do |
49 | 49 | tm.set_task(task, double('runner')) |
50 | 50 | end |
|
66 | 66 | it 'update timeout' do |
67 | 67 | tasks = client.acquire(now: now-80) |
68 | 68 | task = tasks[0] |
69 | | - expect(task.timeout.to_i).to eq(now-80+config[:alive_time]) |
70 | | - tm.set_task(task, double('runner')) |
| 69 | + expect(task.last_heartbeat).to eq(now-80+config[:alive_time]) |
71 | 70 | allow(Time).to receive(:now).and_return(now-50) |
72 | | - Timeout.timeout(5) do |
73 | | - sleep 0.5 until tm.instance_variable_get(:@last_task_heartbeat) == now-50 |
74 | | - end |
75 | | - expect(task.timeout.to_i).to eq(now-50+config[:alive_time]) |
| 71 | + tm.set_task(task, runner) |
| 72 | + expect(task.last_heartbeat).to eq(now-50+config[:alive_time]) |
76 | 73 | end |
77 | 74 | end |
78 | 75 | context 'stolen' do |
|
94 | 91 | task2 = tasks[0] |
95 | 92 | expect(task2.timeout.to_i).to eq(now-60+config[:alive_time]) |
96 | 93 |
|
97 | | - tm.set_task(task1, double('runner')) |
98 | 94 | allow(Time).to receive(:now).and_return(now-50) |
| 95 | + expect(runner).to receive(:kill) |
| 96 | + tm.set_task(task1, runner) |
| 97 | + end |
| 98 | + end |
| 99 | + context 'timeout but can acquire' do |
| 100 | + before do |
| 101 | + client.backend.db.tap{|s| s.tables.each{|t| s.drop_table(t) } } |
| 102 | + client.init_database |
| 103 | + client.submit('key', 'test1', {'foo' => 1}, {now: now-90,compression: 'gzip'}) |
| 104 | + tm.start |
| 105 | + end |
| 106 | + after do |
| 107 | + tm.stop |
| 108 | + end |
| 109 | + it 'raise error' do |
| 110 | + tasks = client.acquire(now: now-80) |
| 111 | + task1 = tasks[0] |
| 112 | + expect(task1.timeout.to_i).to eq(now-80+config[:alive_time]) |
| 113 | + |
| 114 | + allow(Time).to receive(:now).and_return(now-50) |
| 115 | + tm.set_task(task1, runner) |
99 | 116 |
|
100 | | - flag = false |
101 | | - expect(task1.runner).to receive(:kill){flag = true} |
102 | | - Timeout.timeout(5){ sleep 0.5 until flag } |
| 117 | + expect(task1.runner).to eq(runner) |
103 | 118 | end |
104 | 119 | end |
105 | 120 | end |
106 | 121 | end |
107 | 122 |
|
108 | 123 | describe PerfectQueue::TaskMonitorHook do |
109 | 124 | let (:task) do |
110 | | - obj = AcquiredTask.new(double(:client).as_null_object, 'key', {}, double) |
| 125 | + obj = AcquiredTask.new(double(:client).as_null_object, 'key', {timeout: Time.now.to_i}, double) |
111 | 126 | tm = TaskMonitor.new(logger: double('logger').as_null_object) |
112 | 127 | tm.set_task(obj, double('runner')) |
113 | 128 | obj |
|
0 commit comments