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