zold 0.17.3 → 0.17.4
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 +2 -2
- data/lib/zold/node/farm.rb +15 -13
- data/lib/zold/version.rb +1 -1
- data/test/node/test_farm.rb +17 -17
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 622a8738f318299d195dd0efbe8cdb8bc41aac3432a964b775a31a1b78cc592f
|
4
|
+
data.tar.gz: 06ed79ff0550b5e4f66eb28af66051b14b3d840caf4ea936cfd40b36e6693124
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0e4e8282e87e826b31e3662f0139aa4e0634c4d5e7d2cdb13b48a8958bb48557c007605a4f07d79f50b678acf7beab1860ddb1283b2819b00b66f208ab3b850
|
7
|
+
data.tar.gz: 9a4fb162a36f9db69b3c5916ffca1658c75ea3450b975e05d29054a6b6da991e46e4bdb6c201394a724dcf1461284e1d1a101a000a09bdfebec2420a5c9957f5
|
data/lib/zold/commands/node.rb
CHANGED
@@ -251,8 +251,8 @@ module Zold
|
|
251
251
|
).start do |entrance|
|
252
252
|
Front.set(:entrance, entrance)
|
253
253
|
farmer = opts['no-spawn'] ? Farmers::Plain.new : Farmers::Fork.new(log: @log)
|
254
|
-
Farm.new(invoice, File.join(home, 'farm'), log: @log, farmer: farmer)
|
255
|
-
.start(host, opts[:port], threads: opts[:threads]
|
254
|
+
Farm.new(invoice, File.join(home, 'farm'), log: @log, farmer: farmer, strength: opts[:strength])
|
255
|
+
.start(host, opts[:port], threads: opts[:threads]) do |farm|
|
256
256
|
Front.set(:farm, farm)
|
257
257
|
metronome(farm, opts).start do |metronome|
|
258
258
|
Front.set(:metronome, metronome)
|
data/lib/zold/node/farm.rb
CHANGED
@@ -58,7 +58,7 @@ module Zold
|
|
58
58
|
# it's the entire day, since the Score expires in 24 hours; can be decreased for the
|
59
59
|
# purpose of unit testing.
|
60
60
|
def initialize(invoice, cache = File.join(Dir.pwd, 'farm'), log: Log::NULL,
|
61
|
-
farmer: Farmers::Plain.new, lifetime: 24 * 60 * 60)
|
61
|
+
farmer: Farmers::Plain.new, lifetime: 24 * 60 * 60, strength: Score::STRENGTH)
|
62
62
|
@log = log
|
63
63
|
@cache = File.expand_path(cache)
|
64
64
|
@invoice = invoice
|
@@ -66,6 +66,7 @@ module Zold
|
|
66
66
|
@farmer = farmer
|
67
67
|
@threads = []
|
68
68
|
@lifetime = lifetime
|
69
|
+
@strength = strength
|
69
70
|
end
|
70
71
|
|
71
72
|
# Returns the list of best scores the farm managed to find up to now. The
|
@@ -112,7 +113,7 @@ module Zold
|
|
112
113
|
#
|
113
114
|
# The farm will stop all its threads and close all resources safely
|
114
115
|
# right after the block provided exists.
|
115
|
-
def start(host, port,
|
116
|
+
def start(host, port, threads: Concurrent.processor_count)
|
116
117
|
raise 'Block is required for the farm to start' unless block_given?
|
117
118
|
@log.info('Zero-threads farm won\'t score anything!') if threads.zero?
|
118
119
|
if best.empty?
|
@@ -124,7 +125,7 @@ module Zold
|
|
124
125
|
Thread.new do
|
125
126
|
Thread.current.thread_variable_set(:tid, t.to_s)
|
126
127
|
Endless.new("f#{t}", log: @log).run do
|
127
|
-
cycle(host, port,
|
128
|
+
cycle(host, port, threads)
|
128
129
|
end
|
129
130
|
end
|
130
131
|
end
|
@@ -132,7 +133,7 @@ module Zold
|
|
132
133
|
ready = false
|
133
134
|
@threads << Thread.new do
|
134
135
|
Endless.new('cleanup', log: @log).run do
|
135
|
-
cleanup(host, port,
|
136
|
+
cleanup(host, port, threads)
|
136
137
|
ready = true
|
137
138
|
sleep(1)
|
138
139
|
end
|
@@ -140,26 +141,26 @@ module Zold
|
|
140
141
|
loop { break if ready }
|
141
142
|
end
|
142
143
|
if @threads.empty?
|
143
|
-
cleanup(host, port,
|
144
|
+
cleanup(host, port, threads)
|
144
145
|
@log.info("Farm started with no threads (there will be no score) at #{host}:#{port}")
|
145
146
|
else
|
146
147
|
@log.info("Farm started with #{@threads.count} threads (one for cleanup) \
|
147
|
-
at #{host}:#{port}, strength is #{strength}")
|
148
|
+
at #{host}:#{port}, strength is #{@strength}")
|
148
149
|
end
|
149
150
|
begin
|
150
151
|
yield(self)
|
151
152
|
ensure
|
152
153
|
@threads.each(&:kill)
|
153
|
-
@log.info("Farm stopped (threads=#{threads}, strength=#{strength})")
|
154
|
+
@log.info("Farm stopped (threads=#{threads}, strength=#{@strength})")
|
154
155
|
end
|
155
156
|
end
|
156
157
|
|
157
158
|
private
|
158
159
|
|
159
|
-
def cleanup(host, port,
|
160
|
+
def cleanup(host, port, threads)
|
160
161
|
scores = load
|
161
162
|
before = scores.map(&:value).max.to_i
|
162
|
-
save(threads, [Score.new(host: host, port: port, invoice: @invoice, strength: strength)])
|
163
|
+
save(threads, [Score.new(host: host, port: port, invoice: @invoice, strength: @strength)])
|
163
164
|
scores = load
|
164
165
|
free = scores.reject { |s| @threads.find { |t| t.name == s.to_mnemo } }
|
165
166
|
@pipeline << free[0] if @pipeline.size.zero? && !free.empty?
|
@@ -168,7 +169,7 @@ at #{host}:#{port}, strength is #{strength}")
|
|
168
169
|
@log.debug("#{Thread.current.name}: best score of #{scores.count} is #{scores[0]}")
|
169
170
|
end
|
170
171
|
|
171
|
-
def cycle(host, port,
|
172
|
+
def cycle(host, port, threads)
|
172
173
|
s = []
|
173
174
|
loop do
|
174
175
|
begin
|
@@ -183,13 +184,13 @@ at #{host}:#{port}, strength is #{strength}")
|
|
183
184
|
return unless s.valid?
|
184
185
|
return unless s.host == host
|
185
186
|
return unless s.port == port
|
186
|
-
return unless s.strength >= strength
|
187
|
+
return unless s.strength >= @strength
|
187
188
|
Thread.current.name = s.to_mnemo
|
188
189
|
Thread.current.thread_variable_set(:start, Time.now.utc.iso8601)
|
189
190
|
score = @farmer.up(s)
|
190
|
-
@log.debug("New score discovered: #{score}") if strength > 4
|
191
|
+
@log.debug("New score discovered: #{score}") if @strength > 4
|
191
192
|
save(threads, [score])
|
192
|
-
cleanup(host, port,
|
193
|
+
cleanup(host, port, threads)
|
193
194
|
end
|
194
195
|
|
195
196
|
def save(threads, list = [])
|
@@ -200,6 +201,7 @@ at #{host}:#{port}, strength is #{strength}")
|
|
200
201
|
f,
|
201
202
|
scores.select(&:valid?)
|
202
203
|
.reject(&:expired?)
|
204
|
+
.reject { |s| s.strength < @strength }
|
203
205
|
.sort_by(&:value)
|
204
206
|
.reverse
|
205
207
|
.uniq(&:time)
|
data/lib/zold/version.rb
CHANGED
data/test/node/test_farm.rb
CHANGED
@@ -30,8 +30,8 @@ require_relative '../../lib/zold/node/farm'
|
|
30
30
|
class FarmTest < Zold::Test
|
31
31
|
def test_renders_in_json
|
32
32
|
Dir.mktmpdir do |dir|
|
33
|
-
farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'), log: test_log)
|
34
|
-
farm.start('localhost', 80, threads: 2
|
33
|
+
farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'), log: test_log, strength: 2)
|
34
|
+
farm.start('localhost', 80, threads: 2) do
|
35
35
|
assert_wait { !farm.best.empty? && !farm.best[0].value.zero? }
|
36
36
|
count = 0
|
37
37
|
100.times { count += farm.to_json[:best].length }
|
@@ -42,8 +42,8 @@ class FarmTest < Zold::Test
|
|
42
42
|
|
43
43
|
def test_renders_in_text
|
44
44
|
Dir.mktmpdir do |dir|
|
45
|
-
farm = Zold::Farm.new('NOPREFIX7@ffffffffffffffff', File.join(dir, 'f'), log: test_log)
|
46
|
-
farm.start('localhost', 80, threads: 2
|
45
|
+
farm = Zold::Farm.new('NOPREFIX7@ffffffffffffffff', File.join(dir, 'f'), log: test_log, strength: 1)
|
46
|
+
farm.start('localhost', 80, threads: 2) do
|
47
47
|
assert(!farm.to_text.nil?)
|
48
48
|
end
|
49
49
|
end
|
@@ -52,8 +52,8 @@ class FarmTest < Zold::Test
|
|
52
52
|
def test_makes_many_scores
|
53
53
|
Dir.mktmpdir do |dir|
|
54
54
|
farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'),
|
55
|
-
log: test_log, lifetime: 10, farmer: Zold::Farmers::Plain.new)
|
56
|
-
farm.start('localhost', 80, threads: 4
|
55
|
+
log: test_log, lifetime: 10, farmer: Zold::Farmers::Plain.new, strength: 1)
|
56
|
+
farm.start('localhost', 80, threads: 4) do
|
57
57
|
assert_wait { farm.best.length == 4 }
|
58
58
|
end
|
59
59
|
end
|
@@ -67,8 +67,8 @@ class FarmTest < Zold::Test
|
|
67
67
|
# that it's usually a few microseconds, but sometimes over 200ms.
|
68
68
|
def test_reads_scores_at_high_speed
|
69
69
|
Dir.mktmpdir do |dir|
|
70
|
-
farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'), log: test_log)
|
71
|
-
farm.start('localhost', 80, threads: 4
|
70
|
+
farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'), log: test_log, strength: 4)
|
71
|
+
farm.start('localhost', 80, threads: 4) do
|
72
72
|
assert_wait { !farm.best.empty? && !farm.best[0].value.zero? }
|
73
73
|
cycles = 100
|
74
74
|
speed = (0..cycles - 1).map do
|
@@ -83,8 +83,8 @@ class FarmTest < Zold::Test
|
|
83
83
|
|
84
84
|
def test_makes_best_score_in_background
|
85
85
|
Dir.mktmpdir do |dir|
|
86
|
-
farm = Zold::Farm.new('NOPREFIX1@ffffffffffffffff', File.join(dir, 'f'), log: test_log)
|
87
|
-
farm.start('localhost', 80, threads: 1
|
86
|
+
farm = Zold::Farm.new('NOPREFIX1@ffffffffffffffff', File.join(dir, 'f'), log: test_log, strength: 3)
|
87
|
+
farm.start('localhost', 80, threads: 1) do
|
88
88
|
assert_wait { !farm.best.empty? && farm.best[0].value >= 3 }
|
89
89
|
score = farm.best[0]
|
90
90
|
assert(!score.expired?)
|
@@ -95,8 +95,8 @@ class FarmTest < Zold::Test
|
|
95
95
|
|
96
96
|
def test_correct_score_from_empty_farm
|
97
97
|
Dir.mktmpdir do |dir|
|
98
|
-
farm = Zold::Farm.new('NOPREFIX2@cccccccccccccccc', File.join(dir, 'f'), log: test_log)
|
99
|
-
farm.start('example.com', 8080, threads: 0
|
98
|
+
farm = Zold::Farm.new('NOPREFIX2@cccccccccccccccc', File.join(dir, 'f'), log: test_log, strength: 1)
|
99
|
+
farm.start('example.com', 8080, threads: 0) do
|
100
100
|
score = farm.best[0]
|
101
101
|
assert(!score.expired?)
|
102
102
|
assert_equal(0, score.value)
|
@@ -109,8 +109,8 @@ class FarmTest < Zold::Test
|
|
109
109
|
def test_pre_loads_history
|
110
110
|
Dir.mktmpdir do |dir|
|
111
111
|
cache = File.join(dir, 'a/b/c/cache')
|
112
|
-
farm = Zold::Farm.new('NOPREFIX3@cccccccccccccccc', cache, log: test_log)
|
113
|
-
farm.start('example.com', 8080, threads: 0
|
112
|
+
farm = Zold::Farm.new('NOPREFIX3@cccccccccccccccc', cache, log: test_log, strength: 1)
|
113
|
+
farm.start('example.com', 8080, threads: 0) do
|
114
114
|
score = farm.best[0]
|
115
115
|
assert(!score.nil?, 'The list of best scores can\'t be empty!')
|
116
116
|
assert(File.exist?(cache), 'The cache file has to be created!')
|
@@ -132,8 +132,8 @@ class FarmTest < Zold::Test
|
|
132
132
|
strength: 6
|
133
133
|
)
|
134
134
|
IO.write(cache, score.to_s)
|
135
|
-
farm = Zold::Farm.new('NOPREFIX4@ffffffffffffffff', cache, log: test_log)
|
136
|
-
farm.start(score.host, score.port, threads: 1
|
135
|
+
farm = Zold::Farm.new('NOPREFIX4@ffffffffffffffff', cache, log: test_log, strength: score.strength)
|
136
|
+
farm.start(score.host, score.port, threads: 1) do
|
137
137
|
100.times do
|
138
138
|
sleep(0.1)
|
139
139
|
b = farm.best[0]
|
@@ -170,7 +170,7 @@ class FarmTest < Zold::Test
|
|
170
170
|
end
|
171
171
|
|
172
172
|
def test_terminates_farm_entirely
|
173
|
-
Zold::Farm.new('NOPREFIX4@ffffffffffffffff', log: test_log).start('localhost', 4096, threads: 1
|
173
|
+
Zold::Farm.new('NOPREFIX4@ffffffffffffffff', log: test_log, strength: 10).start('localhost', 4096, threads: 1) do
|
174
174
|
sleep 1
|
175
175
|
end
|
176
176
|
end
|
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.17.
|
4
|
+
version: 0.17.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
@@ -711,7 +711,7 @@ licenses:
|
|
711
711
|
- MIT
|
712
712
|
metadata: {}
|
713
713
|
post_install_message: |-
|
714
|
-
Thanks for installing Zold 0.17.
|
714
|
+
Thanks for installing Zold 0.17.4!
|
715
715
|
Study our White Paper: https://papers.zold.io/wp.pdf
|
716
716
|
Read our blog posts: https://blog.zold.io
|
717
717
|
Try online wallet at: https://wts.zold.io
|