zold 0.17.6 → 0.17.7
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 +15 -7
- data/lib/zold/node/farmers.rb +59 -0
- data/lib/zold/remotes.rb +5 -5
- data/lib/zold/version.rb +1 -1
- data/test/node/test_farmers.rb +10 -3
- data/test/node/test_front.rb +1 -1
- data/zold.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fe6c89e0f94aab5d15fc27cbd8cd8b25ae870341eb056e442a568430c97b1fa
|
4
|
+
data.tar.gz: 55b3c18e4f6c223c521265b4ae1c7cb9c46b5e915df6dbe47f3c176ec0ad00d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66998849bf25873d1814fee29109744bffddc9c19f39c179388a605b55f6414ec6bb9df72455c3e83439c85475268d752731cf74f574c5aab6e1fdf3505d0aa3
|
7
|
+
data.tar.gz: ecd1a71750d26762749ab24c931307713f7b8586ba09d865e324b209d441d3740ddb65df97c59d3409b19b88e22c6a8698881ccbe7d203c2ac9e91563f262edb
|
data/lib/zold/commands/node.rb
CHANGED
@@ -159,9 +159,9 @@ module Zold
|
|
159
159
|
default: false
|
160
160
|
o.string '--alias',
|
161
161
|
'The alias of the node (default: host:port)'
|
162
|
-
o.
|
163
|
-
'
|
164
|
-
default:
|
162
|
+
o.string '--farmer',
|
163
|
+
'The name of the farmer, e.g. "plain", "spawn", "fork" (default: "plain")',
|
164
|
+
default: 'plain'
|
165
165
|
o.bool '--help', 'Print instructions'
|
166
166
|
end
|
167
167
|
if opts.help?
|
@@ -276,11 +276,19 @@ module Zold
|
|
276
276
|
private
|
277
277
|
|
278
278
|
def farmer(opts)
|
279
|
-
|
280
|
-
|
281
|
-
|
279
|
+
case opts['farmer'].downcase.strip
|
280
|
+
when 'plain'
|
281
|
+
@log.debug('"Plain" farmer is used, only one CPU will be utilized')
|
282
|
+
Farmers::Plain.new
|
283
|
+
when 'fork'
|
284
|
+
@log.debug('"Fork" farmer is used')
|
285
|
+
Farmers::Fork.new(log: @log)
|
286
|
+
when 'spawn'
|
287
|
+
@log.debug('"Spawn" farmer is used')
|
288
|
+
Farmers::Spawn.new(log: @log)
|
289
|
+
else
|
290
|
+
raise "Farmer name is not recognized: #{opts['farmer']}"
|
282
291
|
end
|
283
|
-
Farmers::Fork.new(log: @log)
|
284
292
|
end
|
285
293
|
|
286
294
|
# Returns exit code
|
data/lib/zold/node/farmers.rb
CHANGED
@@ -77,5 +77,64 @@ for #{after.host}:#{after.port} in #{Age.new(start)}: #{after.suffixes}")
|
|
77
77
|
after
|
78
78
|
end
|
79
79
|
end
|
80
|
+
|
81
|
+
# In a child process
|
82
|
+
class Spawn
|
83
|
+
def initialize(log: Log::NULL)
|
84
|
+
@log = log
|
85
|
+
end
|
86
|
+
|
87
|
+
def up(score)
|
88
|
+
start = Time.now
|
89
|
+
bin = File.expand_path(File.join(File.dirname(__FILE__), '../../../bin/zold'))
|
90
|
+
raise "Zold binary not found at #{bin}" unless File.exist?(bin)
|
91
|
+
cmd = [
|
92
|
+
'ruby',
|
93
|
+
Shellwords.escape(bin),
|
94
|
+
'--skip-upgrades',
|
95
|
+
"--info-tid=#{Thread.current.thread_variable_get(:tid)}",
|
96
|
+
"--info-thread=#{Shellwords.escape(Thread.current.name)}",
|
97
|
+
"--info-start=#{Time.now.utc.iso8601}",
|
98
|
+
'--low-priority',
|
99
|
+
'next',
|
100
|
+
Shellwords.escape(score)
|
101
|
+
].join(' ')
|
102
|
+
Open3.popen2e(cmd) do |stdin, stdout, thr|
|
103
|
+
Thread.current.thread_variable_set(:pid, thr.pid.to_s)
|
104
|
+
at_exit { Farmers.kill(@log, thr.pid, start) }
|
105
|
+
@log.debug("Scoring started in proc ##{thr.pid} \
|
106
|
+
for #{score.value}/#{score.strength} at #{score.host}:#{score.port}")
|
107
|
+
begin
|
108
|
+
stdin.close
|
109
|
+
buffer = +''
|
110
|
+
loop do
|
111
|
+
begin
|
112
|
+
buffer << stdout.read_nonblock(16 * 1024)
|
113
|
+
# rubocop:disable Lint/HandleExceptions
|
114
|
+
rescue IO::WaitReadable => _
|
115
|
+
# rubocop:enable Lint/HandleExceptions
|
116
|
+
# nothing to do here
|
117
|
+
rescue StandardError => e
|
118
|
+
@log.error(buffer)
|
119
|
+
raise e
|
120
|
+
end
|
121
|
+
break if buffer.end_with?("\n") && thr.value.to_i.zero?
|
122
|
+
if stdout.closed?
|
123
|
+
raise "Failed to calculate the score (##{thr.value}): #{buffer}" unless thr.value.to_i.zero?
|
124
|
+
break
|
125
|
+
end
|
126
|
+
sleep(1)
|
127
|
+
Thread.current.thread_variable_set(:buffer, buffer.length.to_s)
|
128
|
+
end
|
129
|
+
after = Score.parse(buffer.strip)
|
130
|
+
@log.debug("Next score #{after.value}/#{after.strength} found in proc ##{thr.pid} \
|
131
|
+
for #{after.host}:#{after.port} in #{Age.new(start)}: #{after.suffixes}")
|
132
|
+
after
|
133
|
+
ensure
|
134
|
+
Farmers.kill(@log, thr.pid, start)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
80
139
|
end
|
81
140
|
end
|
data/lib/zold/remotes.rb
CHANGED
@@ -104,21 +104,21 @@ module Zold
|
|
104
104
|
|
105
105
|
def assert_valid_score(score)
|
106
106
|
raise "Invalid score #{score}" unless score.valid?
|
107
|
-
raise "Expired score (#{Age.new(score.time)}) #{score.
|
107
|
+
raise "Expired score (#{Age.new(score.time)}) #{score.reduced(4)}" if score.expired?
|
108
108
|
end
|
109
109
|
|
110
110
|
def assert_score_ownership(score)
|
111
|
-
raise "Masqueraded host #{@host} as #{score.host}: #{score.
|
112
|
-
raise "Masqueraded port #{@port} as #{score.port}: #{score.
|
111
|
+
raise "Masqueraded host #{@host} as #{score.host}: #{score.reduced(4)}" if @host != score.host
|
112
|
+
raise "Masqueraded port #{@port} as #{score.port}: #{score.reduced(4)}" if @port != score.port
|
113
113
|
end
|
114
114
|
|
115
115
|
def assert_score_strength(score)
|
116
116
|
return if score.strength >= Score::STRENGTH
|
117
|
-
raise "Score #{score.strength} is too weak (<#{Score::STRENGTH}): #{score.
|
117
|
+
raise "Score #{score.strength} is too weak (<#{Score::STRENGTH}): #{score.reduced(4)}"
|
118
118
|
end
|
119
119
|
|
120
120
|
def assert_score_value(score, min)
|
121
|
-
raise "Score #{score.value} is too small (<#{min}): #{score.
|
121
|
+
raise "Score #{score.value} is too small (<#{min}): #{score.reduced(4)}" if score.value < min
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
data/lib/zold/version.rb
CHANGED
data/test/node/test_farmers.rb
CHANGED
@@ -28,9 +28,16 @@ require_relative '../../lib/zold/node/farmers'
|
|
28
28
|
require_relative '../../lib/zold/verbose_thread'
|
29
29
|
|
30
30
|
class FarmersTest < Zold::Test
|
31
|
+
# Types to test
|
32
|
+
TYPES = [
|
33
|
+
Zold::Farmers::Plain,
|
34
|
+
Zold::Farmers::Spawn,
|
35
|
+
Zold::Farmers::Fork
|
36
|
+
].freeze
|
37
|
+
|
31
38
|
def test_calculates_next_score
|
32
39
|
before = Zold::Score.new(host: 'some-host', port: 9999, invoice: 'NOPREFIX4@ffffffffffffffff', strength: 3)
|
33
|
-
|
40
|
+
TYPES.each do |farmer_class|
|
34
41
|
farmer = farmer_class.new(log: test_log)
|
35
42
|
after = farmer.up(before)
|
36
43
|
assert_equal(1, after.value)
|
@@ -41,7 +48,7 @@ class FarmersTest < Zold::Test
|
|
41
48
|
end
|
42
49
|
|
43
50
|
def test_calculates_large_score
|
44
|
-
|
51
|
+
TYPES.each do |type|
|
45
52
|
log = TestLogger.new(test_log)
|
46
53
|
thread = Thread.start do
|
47
54
|
farmer = type.new(log: log)
|
@@ -54,7 +61,7 @@ class FarmersTest < Zold::Test
|
|
54
61
|
end
|
55
62
|
|
56
63
|
def test_kills_farmer
|
57
|
-
|
64
|
+
TYPES.each do |type|
|
58
65
|
farmer = type.new(log: test_log)
|
59
66
|
thread = Thread.start do
|
60
67
|
Zold::VerboseThread.new(test_log).run do
|
data/test/node/test_front.rb
CHANGED
@@ -283,7 +283,7 @@ class FrontTest < Zold::Test
|
|
283
283
|
# HTTP request. This value is enough to identify a valueable node, and filter
|
284
284
|
# out those that are too weak.
|
285
285
|
def test_score_is_reduced
|
286
|
-
FakeNode.new(log: test_log).run(['--threads=1', '--strength=1', '--no-metronome', '--
|
286
|
+
FakeNode.new(log: test_log).run(['--threads=1', '--strength=1', '--no-metronome', '--farmer=plain']) do |port|
|
287
287
|
res = Zold::Http.new(uri: URI("http://localhost:#{port}/")).get
|
288
288
|
assert_wait { Zold::Score.parse(res.headers[Zold::Http::SCORE_HEADER]).value > Zold::Front::MIN_SCORE - 1 }
|
289
289
|
sleep(1)
|
data/zold.gemspec
CHANGED
@@ -65,7 +65,7 @@ and suggests a different architecture for digital wallet maintenance.'
|
|
65
65
|
s.add_runtime_dependency 'concurrent-ruby', '1.1.3'
|
66
66
|
s.add_runtime_dependency 'cucumber', '3.1.2' # has to stay here for Heroku
|
67
67
|
s.add_runtime_dependency 'diffy', '3.2.1'
|
68
|
-
s.add_runtime_dependency 'futex', '0.6.
|
68
|
+
s.add_runtime_dependency 'futex', '0.6.2'
|
69
69
|
s.add_runtime_dependency 'get_process_mem', '0.2.3'
|
70
70
|
s.add_runtime_dependency 'json', '2.1.0'
|
71
71
|
s.add_runtime_dependency 'memory_profiler', '0.9.12'
|
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.17.
|
4
|
+
version: 0.17.7
|
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-12-
|
11
|
+
date: 2018-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backtrace
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - '='
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.6.
|
75
|
+
version: 0.6.2
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - '='
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.6.
|
82
|
+
version: 0.6.2
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: get_process_mem
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -700,7 +700,7 @@ licenses:
|
|
700
700
|
- MIT
|
701
701
|
metadata: {}
|
702
702
|
post_install_message: |-
|
703
|
-
Thanks for installing Zold 0.17.
|
703
|
+
Thanks for installing Zold 0.17.7!
|
704
704
|
Study our White Paper: https://papers.zold.io/wp.pdf
|
705
705
|
Read our blog posts: https://blog.zold.io
|
706
706
|
Try online wallet at: https://wts.zold.io
|