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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5ecca17ec572da83d30874c74ad40b383e22855e
4
- data.tar.gz: 501cc2ef09710e3bd6d578d3f8cae99895ae25e8
3
+ metadata.gz: c3cb68abdacd80f8b216e8d10a1294daf4fab097
4
+ data.tar.gz: 6aa61f6f6a664b45b423880116ca5c6a462bfe26
5
5
  SHA512:
6
- metadata.gz: 584cfab45f2f97b6d5bccaee7e285d1637ca546357bb9b08e7a7e30f85789a31ca69e59ec96e72177b6c64568284e0ab982248bc25c0ada8a13ad86580c9496b
7
- data.tar.gz: '09553f0034eee231dbba5c6d1eccd3c2d4e8e120bb70505f741d1b20f21cd7d103baeca54259c0e5bfad66b97e4b64b62ea3fb536b5eef411b9344faf83fbbfa'
6
+ metadata.gz: ca68efb7ea0bd921feace2646bd5e032f785565b120eac070a7aa35af700fcabaf21a5af7dfd3607a6edd2d6e26e118397823b0ef198eb2a4efb90d203c99543
7
+ data.tar.gz: 94773aa9d97a09ac728f3d893c8009deafccdc3bfcc8d2bf349574b2a1d841b916f8a576e5e542b0fc2a92b574d3ba4bed4d1d1052056ca83029d46e71fa1ce9
@@ -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']
@@ -99,7 +99,7 @@ Available options:"
99
99
 
100
100
  private
101
101
 
102
- def pay(wallet, _)
102
+ def pay(wallet, opts)
103
103
  raise 'The wallet is absent' unless wallet.exists?
104
104
  tax = Tax.new(wallet)
105
105
  debt = tax.debt
@@ -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.exit
117
- @log.info("Thread #{t.name} terminated in #{(Time.now - tstart).round(2)}s")
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
- save(threads, [s.next])
148
- # score = Score.parse(`ruby #{File.join(File.dirname(__FILE__), '../../../bin/zold')} next "#{s}"`)
149
- # @log.debug("New score discovered: #{score}")
150
- # save(threads, [score])
151
- cleanup(host, port, strength, threads)
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, 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
@@ -25,6 +25,6 @@
25
25
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Zold
28
- VERSION = '0.14.18'
28
+ VERSION = '0.14.19'
29
29
  PROTOCOL = 2
30
30
  end
@@ -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('NOPREFIX@ffffffffffffffff', File.join(dir, 'f'), log: test_log)
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('NOPREFIX@ffffffffffffffff', File.join(dir, 'f'), log: test_log)
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('NOPREFIX@ffffffffffffffff', File.join(dir, 'f'), log: test_log)
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('NOPREFIX@cccccccccccccccc', File.join(dir, 'f'), log: test_log)
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('NOPREFIX@cccccccccccccccc', cache, log: test_log)
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: 'NOPREFIX@ffffffffffffffff', suffixes: %w[13f7f01 b2b32b 4ade7e],
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('NOPREFIX@ffffffffffffffff', cache, log: test_log)
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: 'NOPREFIX@ffffffffffffffff',
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('NOPREFIX@ffffffffffffffff', file, log: log)
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
@@ -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
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.14.18
4
+ version: 0.14.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko