zold 0.13.22 → 0.13.23
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/README.md +2 -6
- data/lib/zold/node/farm.rb +48 -47
- data/lib/zold/score.rb +4 -4
- data/lib/zold/version.rb +1 -1
- data/test/node/test_farm.rb +10 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b063b1f42e4e318877c41c1281df5ece0c0a61c4
|
4
|
+
data.tar.gz: 8b42936d634c08e26c3b3381c296a9de9cd28ec3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4abf169be0eff5474adfa835e34d4035d2278b38ae8f56211b47a611d352f52048df27d75b557b1f4ac61d96ec44b2240eb3e0e4365b4bb32fffc9f577db35d
|
7
|
+
data.tar.gz: aabaf695df10333689e85d8499a8ba0066af11c08b40f62a330123db012b03e81de35f7b03f685ba989be8ec0099852dd9dd5a23a57a997e3e1b9263d61f266e
|
data/README.md
CHANGED
@@ -197,13 +197,9 @@ network. You can see the full list of nodes at `/remotes` URL of your node.
|
|
197
197
|
your CPUs. It is recommended to make this number equal to the
|
198
198
|
number of CPUs available.
|
199
199
|
|
200
|
-
* `
|
200
|
+
* `pipeline` is ... something not important to you.
|
201
201
|
|
202
|
-
* `best` is
|
203
|
-
|
204
|
-
* `history` is the amount of scores currently saved on the disc. The
|
205
|
-
farm keeps them there in case the node gets restarted. It will load
|
206
|
-
them back and reuse.
|
202
|
+
* `best` is the list of scores known to the farm at the moment (with their ages in minutes).
|
207
203
|
|
208
204
|
`entrance` is the place where all new wallets arive and get merged and pushed
|
209
205
|
further. The health of this point is critical to the entire node. Some
|
data/lib/zold/node/farm.rb
CHANGED
@@ -42,21 +42,18 @@ module Zold
|
|
42
42
|
@log = log
|
43
43
|
@cache = cache
|
44
44
|
@invoice = invoice
|
45
|
-
@
|
45
|
+
@pipeline = Queue.new
|
46
46
|
@threads = []
|
47
|
-
@best = []
|
48
47
|
@mutex = Mutex.new
|
49
48
|
end
|
50
49
|
|
51
50
|
def best
|
52
|
-
|
53
|
-
@best.to_a
|
54
|
-
end
|
51
|
+
load
|
55
52
|
end
|
56
53
|
|
57
54
|
def to_text
|
58
55
|
@threads.map do |t|
|
59
|
-
"#{t.name}: status=#{t.status}; alive=#{t.alive};\n #{t.backtrace.join("\n ")}"
|
56
|
+
"#{t.name}: status=#{t.status}; alive=#{t.alive?};\n #{t.backtrace.join("\n ")}"
|
60
57
|
end.join("\n")
|
61
58
|
end
|
62
59
|
|
@@ -65,18 +62,15 @@ module Zold
|
|
65
62
|
threads: @threads.map do |t|
|
66
63
|
"#{t.name}/#{t.status}/#{t.alive? ? 'A' : 'D'}"
|
67
64
|
end.join(', '),
|
68
|
-
|
69
|
-
best:
|
70
|
-
history: history.count
|
65
|
+
pipeline: @pipeline.size,
|
66
|
+
best: best.map { |s| "#{s.value}/#{(s.age / 60).round}m" }.join(', ')
|
71
67
|
}
|
72
68
|
end
|
73
69
|
|
74
70
|
def start(host, port, strength: 8, threads: 8)
|
75
|
-
@log.
|
76
|
-
|
77
|
-
@best
|
78
|
-
clean(host, port, strength, threads)
|
79
|
-
@log.info("#{@scores.size} scores pre-loaded, the best is: #{@best[0]}")
|
71
|
+
@log.info('Zero-threads farm won\'t score anything!') if threads.zero?
|
72
|
+
cleanup(host, port, strength, threads)
|
73
|
+
@log.info("#{@pipeline.size} scores pre-loaded, the best is: #{best[0]}")
|
80
74
|
@threads = (1..threads).map do |t|
|
81
75
|
Thread.new do
|
82
76
|
Thread.current.name = "f#{t}"
|
@@ -88,11 +82,11 @@ module Zold
|
|
88
82
|
end
|
89
83
|
end
|
90
84
|
@threads << Thread.new do
|
91
|
-
Thread.current.name = '
|
85
|
+
Thread.current.name = 'cleanup'
|
92
86
|
loop do
|
93
87
|
sleep(60) unless strength == 1 # which will only happen in tests
|
94
88
|
VerboseThread.new(@log).run do
|
95
|
-
|
89
|
+
cleanup(host, port, strength, threads)
|
96
90
|
end
|
97
91
|
end
|
98
92
|
end
|
@@ -118,49 +112,56 @@ module Zold
|
|
118
112
|
|
119
113
|
private
|
120
114
|
|
121
|
-
def
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
end
|
129
|
-
@best.sort_by(&:age_hours).each { |b| @scores << b }
|
130
|
-
after = @best.map(&:value).max
|
131
|
-
@log.debug("#{Thread.current.name}: best score is #{@best[0]}") if before != after && !after.zero?
|
115
|
+
def cleanup(host, port, strength, threads)
|
116
|
+
scores = load
|
117
|
+
before = scores.map(&:value).max.to_i
|
118
|
+
if scores.empty? || !threads.zero? && scores.map(&:age).min > 24 * 60 * 60 / threads
|
119
|
+
save([Score.new(Time.now, host, port, @invoice, strength: strength)])
|
120
|
+
else
|
121
|
+
save
|
132
122
|
end
|
123
|
+
scores = load
|
124
|
+
@pipeline << scores.min_by(&:age) if @pipeline.size < threads
|
125
|
+
after = scores.map(&:value).max.to_i
|
126
|
+
@log.debug("#{Thread.current.name}: best score is #{scores[0]}") if before != after && !after.zero?
|
133
127
|
end
|
134
128
|
|
135
129
|
def cycle(host, port, strength, threads)
|
136
|
-
s = @
|
130
|
+
s = @pipeline.pop
|
137
131
|
return unless s.valid?
|
138
132
|
return unless s.host == host
|
139
133
|
return unless s.port == port
|
140
134
|
return unless s.strength >= strength
|
141
|
-
|
142
|
-
|
143
|
-
save(n)
|
144
|
-
@best << n
|
145
|
-
end
|
146
|
-
clean(host, port, strength, threads)
|
147
|
-
@scores << n
|
135
|
+
save([s.next])
|
136
|
+
cleanup(host, port, strength, threads)
|
148
137
|
end
|
149
138
|
|
150
|
-
def save(
|
151
|
-
|
139
|
+
def save(list = [])
|
140
|
+
scores = load + list
|
141
|
+
@mutex.synchronize do
|
142
|
+
AtomicFile.new(@cache).write(
|
143
|
+
scores.select(&:valid?)
|
144
|
+
.reject(&:expired?)
|
145
|
+
.map(&:to_s)
|
146
|
+
.uniq
|
147
|
+
.join("\n")
|
148
|
+
)
|
149
|
+
end
|
152
150
|
end
|
153
151
|
|
154
|
-
def
|
155
|
-
|
156
|
-
|
157
|
-
.
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
152
|
+
def load
|
153
|
+
@mutex.synchronize do
|
154
|
+
if File.exist?(@cache)
|
155
|
+
AtomicFile.new(@cache).read
|
156
|
+
.split(/\n/)
|
157
|
+
.map { |t| Score.parse(t) }
|
158
|
+
.select(&:valid?)
|
159
|
+
.reject(&:expired?)
|
160
|
+
.sort_by(&:value)
|
161
|
+
.reverse
|
162
|
+
else
|
163
|
+
[]
|
164
|
+
end
|
164
165
|
end
|
165
166
|
end
|
166
167
|
end
|
data/lib/zold/score.rb
CHANGED
@@ -141,7 +141,7 @@ module Zold
|
|
141
141
|
hash: value.zero? ? nil : hash,
|
142
142
|
expired: expired?,
|
143
143
|
valid: valid?,
|
144
|
-
|
144
|
+
age: (age / 60).round,
|
145
145
|
created: @created.utc.iso8601
|
146
146
|
}
|
147
147
|
end
|
@@ -168,12 +168,12 @@ module Zold
|
|
168
168
|
end
|
169
169
|
end
|
170
170
|
|
171
|
-
def
|
172
|
-
|
171
|
+
def age
|
172
|
+
Time.now - @time
|
173
173
|
end
|
174
174
|
|
175
175
|
def expired?(hours = 24)
|
176
|
-
|
176
|
+
age > hours * 60 * 60
|
177
177
|
end
|
178
178
|
|
179
179
|
def prefix
|
data/lib/zold/version.rb
CHANGED
data/test/node/test_farm.rb
CHANGED
@@ -32,12 +32,21 @@ class FarmTest < Minitest::Test
|
|
32
32
|
farm.start('localhost', 80, threads: 4, strength: 2) do
|
33
33
|
sleep 0.1 while farm.best.empty? || farm.best[0].value.zero?
|
34
34
|
count = 0
|
35
|
-
100.times { count += farm.to_json[:
|
35
|
+
100.times { count += farm.to_json[:best].length }
|
36
36
|
assert(count > 0)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
+
def test_renders_in_text
|
42
|
+
Dir.mktmpdir 'test' do |dir|
|
43
|
+
farm = Zold::Farm.new('NOPREFIX@ffffffffffffffff', File.join(dir, 'f'), log: test_log)
|
44
|
+
farm.start('localhost', 80, threads: 2, strength: 1) do
|
45
|
+
assert(!farm.to_text.nil?)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
41
50
|
def test_makes_best_score_in_background
|
42
51
|
Dir.mktmpdir 'test' do |dir|
|
43
52
|
farm = Zold::Farm.new('NOPREFIX@ffffffffffffffff', File.join(dir, 'f'), log: test_log)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.13.
|
4
|
+
version: 0.13.23
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|