zold 0.13.33 → 0.13.34
Sign up to get free protection for your applications and to get access to all the features.
- 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
|