zold 0.13.33 → 0.13.34

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: a7fc6c26e23e3a3d056b786a847f4ea01b4f8763
4
- data.tar.gz: f43869756f2b8eb4a7d63e22c6392ee297483246
3
+ metadata.gz: b72e9cbc1d475ad37e79d6f26dd0826702162b0a
4
+ data.tar.gz: 1a423d084caf176481696a30e800c30910681775
5
5
  SHA512:
6
- metadata.gz: 896be48716e75a94ff60de18c026ca36eeba4a558d2fbad47a7aa934dab4543724d23df676e778a20f28c19a2aa93a8504a1a099832f04013626adc4f3568534
7
- data.tar.gz: 34aed103cece3a518ea2d9d17a8f5c03e2ee7ba495341a0e8a50ae85c32115a3717811eba5118661d6e35424032736f7a0f26f37e7fdd2f25a80fe93a28332a3
6
+ metadata.gz: 017c6255d34f34f137acfb403a8e9123aba9442579b0824d50c63ab45f4aa739e120a629d1f39c72386e644c0b3861476a013acd851738e62f18a26c3c77f435
7
+ data.tar.gz: 8dd19ab2329b2c78abbe39ffb9f06e8d2cc0d37b2b675887627970368082137f2cdd9438dbfa3707321ad593d54688796fbf86d95b6ab223484f825eb7ac40bd
@@ -20,7 +20,7 @@ low=$(reserve_port)
20
20
  secondary=$(start_node ${low} 1.1.1)
21
21
  zold remote add localhost ${high} --home=${low}
22
22
 
23
- trap "kill -9 ${primary}; kill -9 ${secondary}" EXIT
23
+ trap "kill -9 ${primary} ${secondary}" EXIT
24
24
 
25
25
  wait_for_file ${low}/restarted
26
26
 
@@ -157,14 +157,11 @@ module Zold
157
157
  farm = Farm.new(invoice, File.join(Dir.pwd, 'farm'), log: @log)
158
158
  farm.start(host, opts[:port], threads: opts[:threads], strength: opts[:strength]) do
159
159
  Front.set(:farm, farm)
160
- metronome = metronome(farm, entrance, opts)
161
- Front.set(:metronome, metronome)
162
- begin
160
+ metronome(farm, entrance, opts).start do |metronome|
161
+ Front.set(:metronome, metronome)
163
162
  @log.info("Starting up the web front at http://#{host}:#{opts[:port]}...")
164
163
  Front.run!
165
164
  @log.info("The web front stopped at http://#{host}:#{opts[:port]}")
166
- ensure
167
- metronome.stop
168
165
  end
169
166
  end
170
167
  end
@@ -20,6 +20,7 @@
20
20
 
21
21
  require_relative 'log'
22
22
  require_relative 'verbose_thread'
23
+ require_relative 'backtrace'
23
24
 
24
25
  # Background routines.
25
26
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -30,33 +31,50 @@ module Zold
30
31
  class Metronome
31
32
  def initialize(log = Log::Quiet.new)
32
33
  @log = log
34
+ @routines = []
33
35
  @threads = []
36
+ @failures = {}
34
37
  end
35
38
 
36
39
  def to_text
37
40
  @threads.map do |t|
38
41
  "#{t.name}: status=#{t.status}; alive=#{t.alive?};\n #{t.backtrace.join("\n ")}"
39
- end.join("\n")
42
+ end.join("\n") + "\n\n" + @failures.map { |r, f| "#{r}\n#{f}\n" }.join("\n")
40
43
  end
41
44
 
42
45
  def add(routine)
43
- @threads << Thread.start do
44
- Thread.current.name = routine.class.name
45
- step = 0
46
- loop do
47
- start = Time.now
48
- VerboseThread.new(@log).run(true) do
49
- routine.exec(step)
50
- end
51
- step += 1
52
- @log.info("Routine #{routine.class.name} ##{step} done in #{(Time.now - start).round(2)}s: \
46
+ @routines << routine
47
+ @log.info("Added #{routine.class.name} to the metronome")
48
+ end
49
+
50
+ def start
51
+ @routines.each do |r|
52
+ @threads << Thread.start do
53
+ Thread.current.name = r.class.name
54
+ step = 0
55
+ loop do
56
+ start = Time.now
57
+ begin
58
+ r.exec(step)
59
+ rescue StandardError => e
60
+ @failures[r.class.name] = Backtrace.new(e).to_s
61
+ end
62
+ step += 1
63
+ @log.info("Routine #{r.class.name} ##{step} done in #{(Time.now - start).round(2)}s: \
53
64
  #{@threads.map { |t| "#{t.name}/#{t.status}" }.join(',')}")
54
- sleep(1)
65
+ sleep(1)
66
+ end
55
67
  end
56
68
  end
57
- @log.info("Added #{routine.class.name} to the metronome")
69
+ begin
70
+ yield(self)
71
+ ensure
72
+ stop
73
+ end
58
74
  end
59
75
 
76
+ private
77
+
60
78
  def stop
61
79
  @log.info("Terminating the metronome with #{@threads.count} threads...")
62
80
  start = Time.now
@@ -65,7 +83,7 @@ module Zold
65
83
  t.exit
66
84
  @log.info("Thread #{t.name} terminated in #{(Time.now - tstart).round(2)}s")
67
85
  end
68
- @log.info("Metronome stopped in #{(Time.now - start).round(2)}s")
86
+ @log.info("Metronome stopped in #{(Time.now - start).round(2)}s, #{@failures.count} failures")
69
87
  end
70
88
  end
71
89
  end
data/lib/zold/version.rb CHANGED
@@ -23,5 +23,5 @@
23
23
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
24
24
  # License:: MIT
25
25
  module Zold
26
- VERSION = '0.13.33'.freeze
26
+ VERSION = '0.13.34'.freeze
27
27
  end
@@ -30,6 +30,10 @@ require_relative '../../lib/zold/verbose_thread'
30
30
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
31
31
  # License:: MIT
32
32
  class FakeNode
33
+ # rubocop:disable Style/ClassVars
34
+ @@ports = Set.new
35
+ # rubocop:enable Style/ClassVars
36
+
33
37
  def initialize(log: Zold::Log::Quiet.new)
34
38
  @log = log
35
39
  end
@@ -70,4 +74,15 @@ class FakeNode
70
74
  end
71
75
  end
72
76
  end
77
+
78
+ def self.port
79
+ loop do
80
+ server = TCPServer.new('127.0.0.1', 0)
81
+ port = server.addr[1]
82
+ server.close
83
+ next if @@ports.include?(port)
84
+ @@ports << port
85
+ port
86
+ end
87
+ end
73
88
  end
@@ -31,18 +31,28 @@ class TestMetronome < Minitest::Test
31
31
  metronome = Zold::Metronome.new(test_log)
32
32
  list = []
33
33
  metronome.add(FakeRoutine.new(list))
34
- sleep 0.1 while list.empty?
35
- metronome.stop
36
- assert_equal(1, list.count)
34
+ metronome.start do
35
+ sleep 0.1 while list.empty?
36
+ assert_equal(1, list.count)
37
+ end
38
+ end
39
+
40
+ def test_prints_to_text
41
+ metronome = Zold::Metronome.new(test_log)
42
+ metronome.add(FakeRoutine.new([]))
43
+ metronome.start do |m|
44
+ assert(!m.to_text.nil?)
45
+ end
37
46
  end
38
47
 
39
48
  def test_continues_even_after_error
40
49
  metronome = Zold::Metronome.new(test_log)
41
50
  routine = BrokenRoutine.new
42
51
  metronome.add(routine)
43
- sleep 0.1 while routine.count < 2
44
- metronome.stop
45
- assert(routine.count > 1)
52
+ metronome.start do
53
+ sleep 0.1 while routine.count < 2
54
+ assert(routine.count > 1)
55
+ end
46
56
  end
47
57
 
48
58
  class FakeRoutine
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zold
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.33
4
+ version: 0.13.34
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko