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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3dd5351ecddcebbc6fbc7f89e1102c06b02dcb21
4
- data.tar.gz: 33b7df062b10d6f6d9099372c931d85663bb68bc
3
+ metadata.gz: 130e42b6ea51f45c286e7c21fe8aae49014eef81
4
+ data.tar.gz: 1563ac90134f3837f0c705a6cce802c6b854c478
5
5
  SHA512:
6
- metadata.gz: c5bd9cf986be28aa07d504e771a2be2fef1260c7e0a76f9e6bf91b405c81331b51f0d5c7ca551b9080b4383d22de9391c7551e8343b03c8392a75130e7bb204b
7
- data.tar.gz: b85287965ddcf34ee7f64e1dc857bc2106257fac8b927ea2bd1862249a5f935473a4bfe7a690aa013ab9d435b4272e4177e4da626e187790b61423b5403ef9a3
6
+ metadata.gz: 8cccda69622490863225f289edb743f1182ded6beb1e32cad0b2aaefe0b3dd7ea65070254496c78b9a71eccc8bb6e3191be9f356af68393c2594fe44ba7bcc00
7
+ data.tar.gz: bde828da11f815a64fed9de13cfee92cdd9a5b6c0357d905caafe01140ff7f441ca133f417d4b6f3ff6576ae53a058a532749735cb15312188fd4bf59736346f
@@ -10,4 +10,5 @@ require 'rrrspec/server/json_constructor'
10
10
  require 'rrrspec/server/log_file_persister'
11
11
  require 'rrrspec/server/persistent_models'
12
12
  require 'rrrspec/server/persister'
13
+ require 'rrrspec/server/statistics_updater'
13
14
  require 'rrrspec/server/worker_runner'
@@ -30,6 +30,7 @@ module RRRSpec
30
30
  Thread.fork { Dispatcher.work_loop }
31
31
  Thread.fork { Arbiter.work_loop }
32
32
  Thread.fork { Persister.work_loop }
33
+ Thread.fork { StatisticsUpdater.work_loop }
33
34
  Kernel.sleep
34
35
  end
35
36
  end
@@ -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
@@ -1,5 +1,5 @@
1
1
  module RRRSpec
2
2
  module Server
3
- VERSION = "0.2.1"
3
+ VERSION = "0.2.2"
4
4
  end
5
5
  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.queue_empty?).to be_true
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.empty?).to be_false
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.empty?).to be_false
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.empty?).to be_false
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.empty?).to be_true
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.empty?).to be_false
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.empty?).to be_false
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.queue_empty?).to be_true
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.empty?).to be_false
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.empty?).to be_false
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.queue_empty?).to be_true
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.queue_empty?).to be_true
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.queue_empty?).to be_true
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.queue_empty?).to be_true
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.queue_empty?).to be_true
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.queue_empty?).to be_true
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.queue_empty?).to be_true
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.1
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-04-22 00:00:00.000000000 Z
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