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 +4 -4
- data/fixtures/scripts/redeploy-on-upgrade.sh +1 -1
- data/lib/zold/commands/node.rb +2 -5
- data/lib/zold/metronome.rb +32 -14
- data/lib/zold/version.rb +1 -1
- data/test/node/fake_node.rb +15 -0
- data/test/test_metronome.rb +16 -6
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b72e9cbc1d475ad37e79d6f26dd0826702162b0a
|
4
|
+
data.tar.gz: 1a423d084caf176481696a30e800c30910681775
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 017c6255d34f34f137acfb403a8e9123aba9442579b0824d50c63ab45f4aa739e120a629d1f39c72386e644c0b3861476a013acd851738e62f18a26c3c77f435
|
7
|
+
data.tar.gz: 8dd19ab2329b2c78abbe39ffb9f06e8d2cc0d37b2b675887627970368082137f2cdd9438dbfa3707321ad593d54688796fbf86d95b6ab223484f825eb7ac40bd
|
data/lib/zold/commands/node.rb
CHANGED
@@ -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
|
161
|
-
|
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
|
data/lib/zold/metronome.rb
CHANGED
@@ -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
|
-
@
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
step
|
52
|
-
|
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
|
-
|
65
|
+
sleep(1)
|
66
|
+
end
|
55
67
|
end
|
56
68
|
end
|
57
|
-
|
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
data/test/node/fake_node.rb
CHANGED
@@ -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
|
data/test/test_metronome.rb
CHANGED
@@ -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
|
-
|
35
|
-
|
36
|
-
|
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
|
-
|
44
|
-
|
45
|
-
|
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
|