zold 0.14.18 → 0.14.19
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/zold/commands/node.rb +6 -0
- data/lib/zold/commands/taxes.rb +1 -1
- data/lib/zold/node/farm.rb +44 -10
- data/lib/zold/remotes.rb +2 -1
- data/lib/zold/version.rb +1 -1
- data/test/node/test_farm.rb +10 -9
- data/test/node/test_front.rb +12 -0
- 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: c3cb68abdacd80f8b216e8d10a1294daf4fab097
|
4
|
+
data.tar.gz: 6aa61f6f6a664b45b423880116ca5c6a462bfe26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca68efb7ea0bd921feace2646bd5e032f785565b120eac070a7aa35af700fcabaf21a5af7dfd3607a6edd2d6e26e118397823b0ef198eb2a4efb90d203c99543
|
7
|
+
data.tar.gz: 94773aa9d97a09ac728f3d893c8009deafccdc3bfcc8d2bf349574b2a1d841b916f8a576e5e542b0fc2a92b574d3ba4bed4d1d1052056ca83029d46e71fa1ce9
|
data/lib/zold/commands/node.rb
CHANGED
@@ -20,6 +20,7 @@
|
|
20
20
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
21
|
# SOFTWARE.
|
22
22
|
|
23
|
+
require 'open3'
|
23
24
|
require 'slop'
|
24
25
|
require_relative '../version'
|
25
26
|
require_relative '../score'
|
@@ -118,6 +119,10 @@ module Zold
|
|
118
119
|
'Maximum amount of nohup re-starts (-1 by default, which means forever)',
|
119
120
|
require: true,
|
120
121
|
default: -1
|
122
|
+
o.bool '--no-metronome',
|
123
|
+
'Don\'t run the metronome',
|
124
|
+
required: true,
|
125
|
+
default: false
|
121
126
|
o.bool '--help', 'Print instructions'
|
122
127
|
end
|
123
128
|
if opts.help?
|
@@ -274,6 +279,7 @@ module Zold
|
|
274
279
|
|
275
280
|
def metronome(farm, opts)
|
276
281
|
metronome = Metronome.new(@log)
|
282
|
+
return metronome if opts['no-metronome']
|
277
283
|
require_relative 'routines/spread'
|
278
284
|
metronome.add(Routines::Spread.new(opts, @wallets, @remotes, log: @log))
|
279
285
|
unless opts['standalone']
|
data/lib/zold/commands/taxes.rb
CHANGED
data/lib/zold/node/farm.rb
CHANGED
@@ -21,9 +21,11 @@
|
|
21
21
|
# SOFTWARE.
|
22
22
|
|
23
23
|
require 'time'
|
24
|
+
require 'open3'
|
24
25
|
require_relative '../log'
|
25
26
|
require_relative '../score'
|
26
27
|
require_relative '../verbose_thread'
|
28
|
+
require_relative '../backtrace'
|
27
29
|
require_relative '../atomic_file'
|
28
30
|
|
29
31
|
# The farm of scores.
|
@@ -82,14 +84,15 @@ module Zold
|
|
82
84
|
VerboseThread.new(@log).run do
|
83
85
|
cycle(host, port, strength, threads)
|
84
86
|
end
|
87
|
+
break unless @alive
|
85
88
|
end
|
86
89
|
end
|
87
90
|
end
|
88
|
-
alive = true
|
91
|
+
@alive = true
|
89
92
|
@cleanup = Thread.new do
|
90
93
|
Thread.current.abort_on_exception = true
|
91
94
|
Thread.current.name = 'cleanup'
|
92
|
-
while alive
|
95
|
+
while @alive
|
93
96
|
sleep(60) unless strength == 1 # which will only happen in tests
|
94
97
|
VerboseThread.new(@log).run do
|
95
98
|
cleanup(host, port, strength, threads)
|
@@ -103,7 +106,7 @@ module Zold
|
|
103
106
|
ensure
|
104
107
|
@log.info("Terminating the farm with #{@threads.count} threads...")
|
105
108
|
start = Time.now
|
106
|
-
alive = false
|
109
|
+
@alive = false
|
107
110
|
if strength == 1
|
108
111
|
@cleanup.join
|
109
112
|
@log.info("Cleanup thread finished in #{(Time.now - start).round(2)}s")
|
@@ -113,8 +116,8 @@ module Zold
|
|
113
116
|
end
|
114
117
|
@threads.each do |t|
|
115
118
|
tstart = Time.now
|
116
|
-
t.
|
117
|
-
@log.info("Thread #{t.name}
|
119
|
+
t.join(0.1)
|
120
|
+
@log.info("Thread #{t.name} finished in #{(Time.now - tstart).round(2)}s")
|
118
121
|
end
|
119
122
|
@log.info("Farm stopped in #{(Time.now - start).round(2)}s")
|
120
123
|
end
|
@@ -144,11 +147,42 @@ module Zold
|
|
144
147
|
return unless s.port == port
|
145
148
|
return unless s.strength >= strength
|
146
149
|
Thread.current.name = s.to_mnemo
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
150
|
+
cmd = "ruby #{File.join(File.dirname(__FILE__), '../../../bin/zold')} next \"#{s}\""
|
151
|
+
Open3.popen2e(cmd) do |stdin, stdout, thr|
|
152
|
+
@log.debug("Score counting started in process ##{thr.pid}")
|
153
|
+
begin
|
154
|
+
stdin.close
|
155
|
+
buffer = +''
|
156
|
+
loop do
|
157
|
+
begin
|
158
|
+
buffer << stdout.read_nonblock(1024)
|
159
|
+
rescue IO::WaitReadable => e
|
160
|
+
@log.debug("Still waiting for data from the score provider: #{e.message}")
|
161
|
+
end
|
162
|
+
if buffer.end_with?("\n")
|
163
|
+
score = Score.parse(buffer.strip)
|
164
|
+
@log.debug("New score discovered: #{score}")
|
165
|
+
save(threads, [score])
|
166
|
+
cleanup(host, port, strength, threads)
|
167
|
+
break
|
168
|
+
end
|
169
|
+
break if stdout.eof?
|
170
|
+
break unless @alive
|
171
|
+
sleep 0.1
|
172
|
+
end
|
173
|
+
rescue StandardError => e
|
174
|
+
@log.error(Backtrace.new(e).to_s)
|
175
|
+
ensure
|
176
|
+
kill(thr.pid)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def kill(pid)
|
182
|
+
Process.kill('TERM', pid)
|
183
|
+
@log.debug("Process ##{pid} killed")
|
184
|
+
rescue StandardError => e
|
185
|
+
@log.debug("No need to kill process ##{pid} since it's dead already: #{e.message}")
|
152
186
|
end
|
153
187
|
|
154
188
|
def save(threads, list = [])
|
data/lib/zold/remotes.rb
CHANGED
@@ -26,6 +26,7 @@ require 'uri'
|
|
26
26
|
require 'time'
|
27
27
|
require 'fileutils'
|
28
28
|
require_relative 'backtrace'
|
29
|
+
require_relative 'score'
|
29
30
|
require_relative 'node/farm'
|
30
31
|
require_relative 'atomic_file'
|
31
32
|
require_relative 'type'
|
@@ -61,7 +62,7 @@ module Zold
|
|
61
62
|
class Remote < Dry::Struct
|
62
63
|
attribute :host, Types::Strict::String
|
63
64
|
attribute :port, Types::Strict::Integer.constrained(gteq: 0, lt: 65_535)
|
64
|
-
attribute :score,
|
65
|
+
attribute :score, Object
|
65
66
|
attribute :idx, Types::Strict::Integer
|
66
67
|
attribute :network, Types::Strict::String.optional.default('test')
|
67
68
|
attribute :log, (Types::Class.constructor do |value|
|
data/lib/zold/version.rb
CHANGED
data/test/node/test_farm.rb
CHANGED
@@ -39,7 +39,7 @@ class FarmTest < Minitest::Test
|
|
39
39
|
|
40
40
|
def test_renders_in_json
|
41
41
|
Dir.mktmpdir do |dir|
|
42
|
-
farm = Zold::Farm.new('
|
42
|
+
farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'), log: test_log)
|
43
43
|
farm.start('localhost', 80, threads: 4, strength: 2) do
|
44
44
|
sleep 0.1 while farm.best.empty? || farm.best[0].value.zero?
|
45
45
|
count = 0
|
@@ -51,7 +51,7 @@ class FarmTest < Minitest::Test
|
|
51
51
|
|
52
52
|
def test_renders_in_text
|
53
53
|
Dir.mktmpdir do |dir|
|
54
|
-
farm = Zold::Farm.new('
|
54
|
+
farm = Zold::Farm.new('NOPREFIX7@ffffffffffffffff', File.join(dir, 'f'), log: test_log)
|
55
55
|
farm.start('localhost', 80, threads: 2, strength: 1) do
|
56
56
|
assert(!farm.to_text.nil?)
|
57
57
|
end
|
@@ -60,7 +60,7 @@ class FarmTest < Minitest::Test
|
|
60
60
|
|
61
61
|
def test_makes_best_score_in_background
|
62
62
|
Dir.mktmpdir do |dir|
|
63
|
-
farm = Zold::Farm.new('
|
63
|
+
farm = Zold::Farm.new('NOPREFIX1@ffffffffffffffff', File.join(dir, 'f'), log: test_log)
|
64
64
|
farm.start('localhost', 80, threads: 4, strength: 3) do
|
65
65
|
sleep 0.1 while farm.best.empty? || farm.best[0].value < 3
|
66
66
|
score = farm.best[0]
|
@@ -72,7 +72,7 @@ class FarmTest < Minitest::Test
|
|
72
72
|
|
73
73
|
def test_correct_score_from_empty_farm
|
74
74
|
Dir.mktmpdir do |dir|
|
75
|
-
farm = Zold::Farm.new('
|
75
|
+
farm = Zold::Farm.new('NOPREFIX2@cccccccccccccccc', File.join(dir, 'f'), log: test_log)
|
76
76
|
farm.start('example.com', 8080, threads: 0, strength: 1) do
|
77
77
|
score = farm.best[0]
|
78
78
|
assert(!score.expired?)
|
@@ -86,7 +86,7 @@ class FarmTest < Minitest::Test
|
|
86
86
|
def test_pre_loads_history
|
87
87
|
Dir.mktmpdir do |dir|
|
88
88
|
cache = File.join(dir, 'cache')
|
89
|
-
farm = Zold::Farm.new('
|
89
|
+
farm = Zold::Farm.new('NOPREFIX3@cccccccccccccccc', cache, log: test_log)
|
90
90
|
farm.start('example.com', 8080, threads: 0, strength: 1) do
|
91
91
|
score = farm.best[0]
|
92
92
|
assert_equal(0, score.value)
|
@@ -102,11 +102,12 @@ class FarmTest < Minitest::Test
|
|
102
102
|
cache = File.join(dir, 'cache')
|
103
103
|
score = Zold::Score.new(
|
104
104
|
time: Time.parse('2017-07-19T21:24:51Z'),
|
105
|
-
host: 'some-host', port: 9999, invoice: '
|
105
|
+
host: 'some-host', port: 9999, invoice: 'NOPREFIX4@ffffffffffffffff',
|
106
|
+
suffixes: %w[13f7f01 b2b32b 4ade7e],
|
106
107
|
strength: 6
|
107
108
|
)
|
108
109
|
File.write(cache, score.to_s)
|
109
|
-
farm = Zold::Farm.new('
|
110
|
+
farm = Zold::Farm.new('NOPREFIX4@ffffffffffffffff', cache, log: test_log)
|
110
111
|
farm.start(score.host, score.port, threads: 1, strength: score.strength) do
|
111
112
|
100.times do
|
112
113
|
sleep(0.1)
|
@@ -129,14 +130,14 @@ class FarmTest < Minitest::Test
|
|
129
130
|
].each do |score_garbage_line|
|
130
131
|
valid_score = Zold::Score.new(
|
131
132
|
time: Time.parse('2017-07-19T21:24:51Z'),
|
132
|
-
host: 'some-host', port: 9999, invoice: '
|
133
|
+
host: 'some-host', port: 9999, invoice: 'NOPREFIX5@ffffffffffffffff',
|
133
134
|
suffixes: %w[13f7f01 b2b32b 4ade7e], strength: 6
|
134
135
|
)
|
135
136
|
File.open(file, 'w') do |f|
|
136
137
|
f.puts(score_garbage_line)
|
137
138
|
f.puts(valid_score)
|
138
139
|
end
|
139
|
-
farm = Zold::Farm.new('
|
140
|
+
farm = Zold::Farm.new('NOPREFIX5@ffffffffffffffff', file, log: log)
|
140
141
|
assert_equal(1, farm.best.count)
|
141
142
|
assert(log.msg.include?('Invalid score'))
|
142
143
|
end
|
data/test/node/test_front.rb
CHANGED
@@ -166,4 +166,16 @@ class FrontTest < Minitest::Test
|
|
166
166
|
)
|
167
167
|
end
|
168
168
|
end
|
169
|
+
|
170
|
+
def test_performance
|
171
|
+
start = Time.now
|
172
|
+
total = 50
|
173
|
+
FakeNode.new(log: test_log).run(['--threads=4', '--strength=6', '--no-metronome']) do |port|
|
174
|
+
total.times do
|
175
|
+
Zold::Http.new(uri: URI("http://localhost:#{port}/"), score: nil).get
|
176
|
+
end
|
177
|
+
end
|
178
|
+
sec = (Time.now - start) / total
|
179
|
+
test_log.info("Average response time is #{sec.round(2)}s")
|
180
|
+
end
|
169
181
|
end
|