rrrspec-server 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rrrspec/server.rb +1 -0
- data/lib/rrrspec/server/cli.rb +1 -0
- data/lib/rrrspec/server/persister.rb +7 -24
- data/lib/rrrspec/server/statistics_updater.rb +62 -0
- data/lib/rrrspec/server/version.rb +1 -1
- data/spec/rrrspec/server/arbiter_spec.rb +16 -16
- data/spec/rrrspec/server/dispatcher_spec.rb +1 -1
- data/spec/rrrspec/server/persister_spec.rb +0 -12
- data/spec/rrrspec/server/statistics_updater_spec.rb +28 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 130e42b6ea51f45c286e7c21fe8aae49014eef81
|
4
|
+
data.tar.gz: 1563ac90134f3837f0c705a6cce802c6b854c478
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8cccda69622490863225f289edb743f1182ded6beb1e32cad0b2aaefe0b3dd7ea65070254496c78b9a71eccc8bb6e3191be9f356af68393c2594fe44ba7bcc00
|
7
|
+
data.tar.gz: bde828da11f815a64fed9de13cfee92cdd9a5b6c0357d905caafe01140ff7f441ca133f417d4b6f3ff6576ae53a058a532749735cb15312188fd4bf59736346f
|
data/lib/rrrspec/server.rb
CHANGED
data/lib/rrrspec/server/cli.rb
CHANGED
@@ -32,8 +32,9 @@ module RRRSpec
|
|
32
32
|
create_api_cache(taskset, RRRSpec.configuration.json_cache_path)
|
33
33
|
end
|
34
34
|
taskset.expire(PERSISTED_RESIDUE_SEC)
|
35
|
-
update_estimate_sec(taskset)
|
36
35
|
end
|
36
|
+
|
37
|
+
StatisticsUpdaterQueue.enqueue(taskset)
|
37
38
|
rescue
|
38
39
|
RRRSpec.logger.error($!)
|
39
40
|
end
|
@@ -45,6 +46,9 @@ module RRRSpec
|
|
45
46
|
taskset_finished_at = taskset.finished_at
|
46
47
|
return if taskset_finished_at.blank?
|
47
48
|
|
49
|
+
RRRSpec.logger.debug("Persisting taskset #{taskset.key}")
|
50
|
+
start = Time.now
|
51
|
+
|
48
52
|
p_taskset = ActiveRecord::Base.transaction do
|
49
53
|
h = taskset.to_h
|
50
54
|
h.delete('tasks')
|
@@ -115,6 +119,8 @@ module RRRSpec
|
|
115
119
|
Persistence::WorkerLog.import(p_worker_logs)
|
116
120
|
p_worker_logs.each { |p_worker_log| p_worker_log.run_callbacks(:save) {} }
|
117
121
|
end
|
122
|
+
|
123
|
+
RRRSpec.logger.info("Taskset #{taskset.key} persisted (#{Time.now - start} seconds taken)")
|
118
124
|
end
|
119
125
|
|
120
126
|
def create_api_cache(taskset, path)
|
@@ -126,29 +132,6 @@ module RRRSpec
|
|
126
132
|
IO.write(json_path, json)
|
127
133
|
Zlib::GzipWriter.open(json_path + ".gz") { |gz| gz.write(json) }
|
128
134
|
end
|
129
|
-
|
130
|
-
ESTIMATION_FIELDS = [
|
131
|
-
"`spec_file`",
|
132
|
-
"avg(UNIX_TIMESTAMP(`trials`.`finished_at`)-UNIX_TIMESTAMP(`trials`.`started_at`)) as `avg`",
|
133
|
-
# "avg(`trials`.`finished_at`-`trials`.`started_at`) as `avg`",
|
134
|
-
]
|
135
|
-
|
136
|
-
def update_estimate_sec(taskset)
|
137
|
-
p_obj = Persistence::Taskset.where(key: taskset.key).first
|
138
|
-
taskset_class = p_obj.taskset_class
|
139
|
-
query = Persistence::Task.joins(:trials).joins(:taskset).
|
140
|
-
select(ESTIMATION_FIELDS).
|
141
|
-
where('tasksets.taskset_class' => taskset_class).
|
142
|
-
where('trials.status' => ["passed", "pending"]).
|
143
|
-
group('spec_file')
|
144
|
-
estimation = {}
|
145
|
-
query.each do |row|
|
146
|
-
estimation[row.spec_file] = row.avg.to_i
|
147
|
-
end
|
148
|
-
unless estimation.empty?
|
149
|
-
TasksetEstimation.update_estimate_secs(taskset_class, estimation)
|
150
|
-
end
|
151
|
-
end
|
152
135
|
end
|
153
136
|
end
|
154
137
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module RRRSpec
|
2
|
+
module Server
|
3
|
+
module StatisticsUpdater
|
4
|
+
ESTIMATION_FIELDS = [
|
5
|
+
"`spec_file`",
|
6
|
+
"avg(UNIX_TIMESTAMP(`trials`.`finished_at`)-UNIX_TIMESTAMP(`trials`.`started_at`)) as `avg`",
|
7
|
+
# "avg(`trials`.`finished_at`-`trials`.`started_at`) as `avg`",
|
8
|
+
]
|
9
|
+
|
10
|
+
module_function
|
11
|
+
|
12
|
+
def work_loop
|
13
|
+
loop { work }
|
14
|
+
end
|
15
|
+
|
16
|
+
def work
|
17
|
+
taskset, recalculate = StatisticsUpdaterQueue.dequeue
|
18
|
+
recalculate = true
|
19
|
+
|
20
|
+
ActiveRecord::Base.connection_pool.with_connection do
|
21
|
+
unless Persistence::Taskset.where(key: taskset.key).exists?
|
22
|
+
RRRSpec.logger.warn("StatisticsUpdater: Ignoreing unpersisted taskset: #{taskset.key}")
|
23
|
+
end
|
24
|
+
|
25
|
+
if recalculate
|
26
|
+
recalculate_estimate_sec taskset
|
27
|
+
else
|
28
|
+
update_estimate_sec taskset
|
29
|
+
end
|
30
|
+
end
|
31
|
+
rescue
|
32
|
+
RRRSpec.logger.error($!)
|
33
|
+
end
|
34
|
+
|
35
|
+
def update_estimate_sec(taskset)
|
36
|
+
end
|
37
|
+
|
38
|
+
def recalculate_estimate_sec(taskset)
|
39
|
+
RRRSpec.logger.debug("Calculating estimate sec for taskset #{taskset.key}")
|
40
|
+
|
41
|
+
start = Time.now
|
42
|
+
|
43
|
+
p_obj = Persistence::Taskset.where(key: taskset.key).first
|
44
|
+
taskset_class = p_obj.taskset_class
|
45
|
+
query = Persistence::Task.joins(:trials).joins(:taskset).
|
46
|
+
select(ESTIMATION_FIELDS).
|
47
|
+
where('tasksets.taskset_class' => taskset_class).
|
48
|
+
where('trials.status' => ["passed", "pending"]).
|
49
|
+
group('spec_file')
|
50
|
+
estimation = {}
|
51
|
+
query.each do |row|
|
52
|
+
estimation[row.spec_file] = row.avg.to_i
|
53
|
+
end
|
54
|
+
unless estimation.empty?
|
55
|
+
TasksetEstimation.update_estimate_secs(taskset_class, estimation)
|
56
|
+
end
|
57
|
+
|
58
|
+
RRRSpec.logger.info("Recalculated estimate sec for taskset #{taskset.key} (total: #{Time.now - start} seconds)")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -29,10 +29,10 @@ module RRRSpec
|
|
29
29
|
it 'cancels the taskset' do
|
30
30
|
Arbiter.cancel(taskset)
|
31
31
|
expect(taskset.status).to eq('cancelled')
|
32
|
-
expect(taskset
|
32
|
+
expect(taskset).to be_queue_empty
|
33
33
|
expect(taskset.finished_at).not_to be_nil
|
34
34
|
expect(ActiveTaskset.list).not_to include(taskset)
|
35
|
-
expect(PersisterQueue
|
35
|
+
expect(PersisterQueue).not_to be_empty
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -43,7 +43,7 @@ module RRRSpec
|
|
43
43
|
Arbiter.cancel(taskset)
|
44
44
|
expect(taskset.status).not_to eq('cancelled')
|
45
45
|
expect(ActiveTaskset.list).not_to include(taskset)
|
46
|
-
expect(PersisterQueue
|
46
|
+
expect(PersisterQueue).not_to be_empty
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -59,7 +59,7 @@ module RRRSpec
|
|
59
59
|
it 'does nothing' do
|
60
60
|
Arbiter.check(taskset)
|
61
61
|
expect(ActiveTaskset.list).not_to include(taskset)
|
62
|
-
expect(PersisterQueue
|
62
|
+
expect(PersisterQueue).not_to be_empty
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -90,7 +90,7 @@ module RRRSpec
|
|
90
90
|
expect(taskset.status).to eq('running')
|
91
91
|
expect(taskset.finished_at).to be_blank
|
92
92
|
expect(ActiveTaskset.list).to include(taskset)
|
93
|
-
expect(PersisterQueue
|
93
|
+
expect(PersisterQueue).to be_empty
|
94
94
|
end
|
95
95
|
end
|
96
96
|
end
|
@@ -106,7 +106,7 @@ module RRRSpec
|
|
106
106
|
expect(taskset.status).to eq("succeeded")
|
107
107
|
expect(taskset.finished_at).not_to be_blank
|
108
108
|
expect(ActiveTaskset.list).not_to include(taskset)
|
109
|
-
expect(PersisterQueue
|
109
|
+
expect(PersisterQueue).not_to be_empty
|
110
110
|
end
|
111
111
|
end
|
112
112
|
|
@@ -118,7 +118,7 @@ module RRRSpec
|
|
118
118
|
expect(taskset.status).to eq("failed")
|
119
119
|
expect(taskset.finished_at).not_to be_nil
|
120
120
|
expect(ActiveTaskset.list).not_to include(taskset)
|
121
|
-
expect(PersisterQueue
|
121
|
+
expect(PersisterQueue).not_to be_empty
|
122
122
|
end
|
123
123
|
end
|
124
124
|
end
|
@@ -295,10 +295,10 @@ module RRRSpec
|
|
295
295
|
it 'fails the taskset' do
|
296
296
|
Arbiter.fail(taskset)
|
297
297
|
expect(taskset.status).to eq('failed')
|
298
|
-
expect(taskset
|
298
|
+
expect(taskset).to be_queue_empty
|
299
299
|
expect(taskset.finished_at).not_to be_nil
|
300
300
|
expect(ActiveTaskset.list).not_to include(taskset)
|
301
|
-
expect(PersisterQueue
|
301
|
+
expect(PersisterQueue).not_to be_empty
|
302
302
|
end
|
303
303
|
end
|
304
304
|
|
@@ -309,7 +309,7 @@ module RRRSpec
|
|
309
309
|
Arbiter.fail(taskset)
|
310
310
|
expect(taskset.status).not_to eq('failed')
|
311
311
|
expect(ActiveTaskset.list).not_to include(taskset)
|
312
|
-
expect(PersisterQueue
|
312
|
+
expect(PersisterQueue).not_to be_empty
|
313
313
|
end
|
314
314
|
end
|
315
315
|
end
|
@@ -352,7 +352,7 @@ module RRRSpec
|
|
352
352
|
expect(trial.status).to eq('error')
|
353
353
|
expect(task1.status).to eq('failed')
|
354
354
|
expect(taskset.tasks_left).not_to include(task1)
|
355
|
-
expect(taskset
|
355
|
+
expect(taskset).to be_queue_empty
|
356
356
|
expect(taskset.succeeded_count).to eq(0)
|
357
357
|
expect(taskset.failed_count).to eq(1)
|
358
358
|
end
|
@@ -380,7 +380,7 @@ module RRRSpec
|
|
380
380
|
Arbiter.trial(trial)
|
381
381
|
expect(task1.status).to eq('passed')
|
382
382
|
expect(taskset.tasks_left).not_to include(task1)
|
383
|
-
expect(taskset
|
383
|
+
expect(taskset).to be_queue_empty
|
384
384
|
expect(taskset.succeeded_count).to eq(1)
|
385
385
|
expect(taskset.failed_count).to eq(0)
|
386
386
|
end
|
@@ -393,7 +393,7 @@ module RRRSpec
|
|
393
393
|
Arbiter.trial(trial)
|
394
394
|
expect(task1.status).to eq('pending')
|
395
395
|
expect(taskset.tasks_left).not_to include(task1)
|
396
|
-
expect(taskset
|
396
|
+
expect(taskset).to be_queue_empty
|
397
397
|
expect(taskset.succeeded_count).to eq(1)
|
398
398
|
expect(taskset.failed_count).to eq(0)
|
399
399
|
end
|
@@ -427,7 +427,7 @@ module RRRSpec
|
|
427
427
|
expect(trial.status).to eq('failed')
|
428
428
|
expect(task1.status).to eq('failed')
|
429
429
|
expect(taskset.tasks_left).not_to include(task1)
|
430
|
-
expect(taskset
|
430
|
+
expect(taskset).to be_queue_empty
|
431
431
|
expect(taskset.succeeded_count).to eq(0)
|
432
432
|
expect(taskset.failed_count).to eq(1)
|
433
433
|
end
|
@@ -438,7 +438,7 @@ module RRRSpec
|
|
438
438
|
Arbiter.trial(trial)
|
439
439
|
expect(task1.status).to be_blank
|
440
440
|
expect(taskset.tasks_left).to include(task1)
|
441
|
-
expect(taskset
|
441
|
+
expect(taskset).to be_queue_empty
|
442
442
|
expect(taskset.succeeded_count).to eq(0)
|
443
443
|
expect(taskset.failed_count).to eq(0)
|
444
444
|
end
|
@@ -474,7 +474,7 @@ module RRRSpec
|
|
474
474
|
Arbiter.trial(trial)
|
475
475
|
expect(task1.status).to eq('failed')
|
476
476
|
expect(taskset.tasks_left).not_to include(task1)
|
477
|
-
expect(taskset
|
477
|
+
expect(taskset).to be_queue_empty
|
478
478
|
expect(taskset.succeeded_count).to eq(0)
|
479
479
|
expect(taskset.failed_count).to eq(1)
|
480
480
|
end
|
@@ -42,7 +42,7 @@ module RRRSpec
|
|
42
42
|
|
43
43
|
it 'assignes worker upto the max_workers' do
|
44
44
|
Dispatcher.work
|
45
|
-
expect(worker1
|
45
|
+
expect(worker1).to be_queue_empty
|
46
46
|
workers = [worker1, worker2, worker3, worker4]
|
47
47
|
expect(workers.count { |worker| worker.queue_empty? }).to eq(2)
|
48
48
|
end
|
@@ -141,18 +141,6 @@ module RRRSpec
|
|
141
141
|
end
|
142
142
|
end
|
143
143
|
end
|
144
|
-
|
145
|
-
describe '.update_estimate_sec' do
|
146
|
-
before { Persister.persist(@taskset) }
|
147
|
-
|
148
|
-
it 'udpates estimation of the time taken to finish the tasks' do
|
149
|
-
pending "sqlite3 doesn't have UNIT_TIMESTAMP function"
|
150
|
-
Persister.update_estimate_sec(@taskset)
|
151
|
-
expect(RRRSpec::TasksetEstimation.estimate_secs(@taskset.taskset_class)).to eq(
|
152
|
-
{"spec/test_spec.rb" => 0}
|
153
|
-
)
|
154
|
-
end
|
155
|
-
end
|
156
144
|
end
|
157
145
|
end
|
158
146
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RRRSpec
|
4
|
+
module Server
|
5
|
+
describe StatisticsUpdater do
|
6
|
+
before do
|
7
|
+
RRRSpec.configuration = ServerConfiguration.new
|
8
|
+
RRRSpec.configuration.redis = @redis
|
9
|
+
|
10
|
+
@worker, @taskset, @task, @worker_log, @slave, @trial =
|
11
|
+
RRRSpec.finished_fullset
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.update_estimate_sec' do
|
15
|
+
before { Persister.persist(@taskset) }
|
16
|
+
|
17
|
+
xit 'updates estimation of the time taken to finish the tasks' do
|
18
|
+
pending "sqlite3 doesn't have UNIT_TIMESTAMP function"
|
19
|
+
Persister.update_estimate_sec(@taskset)
|
20
|
+
expect(RRRSpec::TasksetEstimation.estimate_secs(@taskset.taskset_class)).to eq(
|
21
|
+
{"spec/test_spec.rb" => 0}
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rrrspec-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masaya Suzuki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: database_cleaner
|
@@ -232,6 +232,7 @@ files:
|
|
232
232
|
- lib/rrrspec/server/log_file_persister.rb
|
233
233
|
- lib/rrrspec/server/persistent_models.rb
|
234
234
|
- lib/rrrspec/server/persister.rb
|
235
|
+
- lib/rrrspec/server/statistics_updater.rb
|
235
236
|
- lib/rrrspec/server/version.rb
|
236
237
|
- lib/rrrspec/server/worker_runner.rb
|
237
238
|
- rrrspec-server.gemspec
|
@@ -241,6 +242,7 @@ files:
|
|
241
242
|
- spec/rrrspec/server/log_file_persister_spec.rb
|
242
243
|
- spec/rrrspec/server/persistent_models_spec.rb
|
243
244
|
- spec/rrrspec/server/persister_spec.rb
|
245
|
+
- spec/rrrspec/server/statistics_updater_spec.rb
|
244
246
|
- spec/spec_helper.rb
|
245
247
|
- tasks/db.rake
|
246
248
|
homepage: ''
|
@@ -274,4 +276,5 @@ test_files:
|
|
274
276
|
- spec/rrrspec/server/log_file_persister_spec.rb
|
275
277
|
- spec/rrrspec/server/persistent_models_spec.rb
|
276
278
|
- spec/rrrspec/server/persister_spec.rb
|
279
|
+
- spec/rrrspec/server/statistics_updater_spec.rb
|
277
280
|
- spec/spec_helper.rb
|