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 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