zold 0.16.30 → 0.17.0
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/.rubocop.yml +1 -1
- data/.ruby-version +1 -1
- data/.rultor.yml +4 -1
- data/.travis.yml +0 -2
- data/README.md +1 -1
- data/appveyor.yml +15 -2
- data/bin/zold +2 -1
- data/fixtures/scripts/redeploy-on-upgrade.sh +1 -1
- data/lib/zold/commands/fetch.rb +7 -1
- data/lib/zold/commands/node.rb +1 -1
- data/lib/zold/commands/push.rb +7 -1
- data/lib/zold/commands/remote.rb +2 -2
- data/lib/zold/dir_items.rb +1 -1
- data/lib/zold/http.rb +32 -25
- data/lib/zold/json_page.rb +1 -1
- data/lib/zold/node/farm.rb +4 -6
- data/lib/zold/node/farmers.rb +29 -3
- data/lib/zold/sync_wallets.rb +3 -2
- data/lib/zold/version.rb +1 -1
- data/test/commands/test_fetch.rb +47 -0
- data/test/commands/test_push.rb +15 -0
- data/test/commands/test_remote.rb +9 -0
- data/test/node/test_async_entrance.rb +1 -1
- data/test/node/test_farmers.rb +34 -21
- data/test/node/test_front.rb +7 -7
- data/test/test_dir_items.rb +0 -4
- data/upgrades/rename_foreign_wallets.rb +3 -1
- data/zold.gemspec +4 -3
- metadata +23 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e102a5d92bc1bde5c3751cf9c7737f64b751b7240596028b5e3488c59fbd6e9f
|
4
|
+
data.tar.gz: 65ea0826b5dfe6a693142356174dd808525f1ba23668f643beb341add7edb2c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ffe60b65ba93cb1dd80c3257d7dabd9d808019b57b32fa51ebf97deca31d5f3ecfe6d5fd1a3af31a8ae64a39e3c90611c03d2f530e951951bcf2bb9629cc8826
|
7
|
+
data.tar.gz: d19ae042b08b72c357d23438f65fabebe4a46ee3fcf536a79e231f739809fb2c0589b885621473e4b53eee68c33b703df81a64e0882a19447d3b1ee0762a66b8
|
data/.rubocop.yml
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.5.1
|
data/.rultor.yml
CHANGED
@@ -12,7 +12,10 @@ release:
|
|
12
12
|
script: |-
|
13
13
|
export RUBYOPT="-W0"
|
14
14
|
[[ "${tag}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || exit -1
|
15
|
-
|
15
|
+
# gem build zold.gemspec
|
16
|
+
# gem install --local zold-0.0.0.gem
|
17
|
+
# zold --version | grep -vq '0.0.0' && exit 1
|
18
|
+
# zold remote update
|
16
19
|
sed -i "s/0\.0\.0/${tag}/g" lib/zold/version.rb
|
17
20
|
bundle install --no-color
|
18
21
|
rake --quiet
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
[](http://www.rultor.com/p/yegor256/zold)
|
8
8
|
[](https://www.jetbrains.com/ruby/)
|
9
9
|
|
10
|
-
[](https://travis-ci.org/zold-io/zold)
|
10
|
+
[](https://travis-ci.org/zold-io/zold)
|
11
11
|
[](https://ci.appveyor.com/project/yegor256/zold-wcn4o)
|
12
12
|
[](http://www.0pdd.com/p?name=zold-io/zold)
|
13
13
|
[](http://badge.fury.io/rb/zold)
|
data/appveyor.yml
CHANGED
@@ -9,8 +9,6 @@ branches:
|
|
9
9
|
os: Windows Server 2012
|
10
10
|
environment:
|
11
11
|
matrix:
|
12
|
-
- ruby_version: "23-x64"
|
13
|
-
- ruby_version: "24-x64"
|
14
12
|
- ruby_version: "25-x64"
|
15
13
|
install:
|
16
14
|
- ps: |
|
@@ -26,10 +24,25 @@ install:
|
|
26
24
|
$Env:openssl_dir = "C:\msys64\mingw64"
|
27
25
|
}
|
28
26
|
- bundle config --local path vendor/bundle
|
27
|
+
|
28
|
+
# Download & extract libcurl
|
29
|
+
# Copy libcurl.{dll,lib} and add to PATH, so that libcurl.dll is found during the tests
|
30
|
+
- ps: |
|
31
|
+
appveyor DownloadFile "https://dl.dropboxusercontent.com/s/jxwohqax4e2avyt/libcurl-7.48.0-WinSSL-zlib-x86-x64.zip?dl=0" -FileName libcurl.zip
|
32
|
+
7z x libcurl.zip
|
33
|
+
cp dmd2\windows\bin64\libcurl.dll C:\Ruby${Env:ruby_version}\bin
|
34
|
+
cp dmd2\windows\lib64\curl.lib C:\Ruby${Env:ruby_version}\bin
|
35
|
+
|
29
36
|
- bundle config build.openssl --with-openssl-dir=%openssl_dir%
|
37
|
+
- bundle config build.eventmachine --use-system-libraries --with-ssl-dir=%openssl_dir%
|
30
38
|
- ruby -v
|
31
39
|
- bundle -v
|
32
40
|
build_script:
|
41
|
+
# Support pure ruby eventmachine for windows
|
42
|
+
# https://github.com/eventmachine/eventmachine/issues/820
|
43
|
+
# https://github.com/eventmachine/eventmachine/issues/800
|
44
|
+
#
|
45
|
+
- gem install eventmachine --platform ruby
|
33
46
|
- bundle update
|
34
47
|
- bundle install
|
35
48
|
test_script:
|
data/bin/zold
CHANGED
@@ -181,7 +181,8 @@ wallets = Zold::SyncWallets.new(
|
|
181
181
|
Zold::CachedWallets.new(
|
182
182
|
command == 'node' ? Zold::TreeWallets.new(home) : Zold::Wallets.new(home)
|
183
183
|
),
|
184
|
-
log: log
|
184
|
+
log: log,
|
185
|
+
dir: File.join(zoldata, 'locks')
|
185
186
|
)
|
186
187
|
fremotes = File.join(zoldata, 'remotes')
|
187
188
|
remotes = Zold::Remotes.new(file: fremotes, network: opts['network'])
|
@@ -7,7 +7,7 @@ function start_node {
|
|
7
7
|
zold node $3 --nohup --nohup-command='touch restarted' --nohup-log=log --nohup-max-cycles=0 --nohup-log-truncate=10240 \
|
8
8
|
--expose-version=$2 --save-pid=pid --routine-immediately \
|
9
9
|
--verbose --trace --invoice=REDEPLOY@ffffffffffffffff \
|
10
|
-
--host=127.0.0.1 --port=$1 --bind-port=$1 --threads=1 --strength=20
|
10
|
+
--host=127.0.0.1 --port=$1 --bind-port=$1 --threads=1 --strength=20 > /dev/null 2>&1
|
11
11
|
wait_for_port $1
|
12
12
|
cat pid
|
13
13
|
cd ..
|
data/lib/zold/commands/fetch.rb
CHANGED
@@ -28,6 +28,8 @@ require 'slop'
|
|
28
28
|
require 'rainbow'
|
29
29
|
require 'concurrent/atomics'
|
30
30
|
require 'zold/score'
|
31
|
+
require 'concurrent'
|
32
|
+
require 'parallel'
|
31
33
|
require_relative 'thread_badge'
|
32
34
|
require_relative 'args'
|
33
35
|
require_relative '../log'
|
@@ -69,11 +71,15 @@ Available options:"
|
|
69
71
|
o.string '--network',
|
70
72
|
'The name of the network we work in',
|
71
73
|
default: 'test'
|
74
|
+
o.integer '--threads',
|
75
|
+
"How many threads to use for fetching wallets (default: #{[Concurrent.processor_count / 2, 2].max})",
|
76
|
+
default: [Concurrent.processor_count / 2, 2].max
|
72
77
|
o.bool '--help', 'Print instructions'
|
73
78
|
end
|
74
79
|
mine = Args.new(opts, @log).take || return
|
75
|
-
(mine.empty? ? @wallets.all : mine.map { |i| Id.new(i) })
|
80
|
+
Parallel.map((mine.empty? ? @wallets.all : mine.map { |i| Id.new(i) }), in_threads: opts[:threads]) do |id|
|
76
81
|
fetch(id, Copies.new(File.join(@copies, id)), opts)
|
82
|
+
@log.debug("Worker: #{Parallel.worker_number} has fetched wallet #{id}")
|
77
83
|
end
|
78
84
|
end
|
79
85
|
|
data/lib/zold/commands/node.rb
CHANGED
@@ -247,7 +247,7 @@ module Zold
|
|
247
247
|
network: opts['network']
|
248
248
|
).start do |entrance|
|
249
249
|
Front.set(:entrance, entrance)
|
250
|
-
farmer = opts['no-spawn'] ? Farmers::Plain.new : Farmers::
|
250
|
+
farmer = opts['no-spawn'] ? Farmers::Plain.new : Farmers::Fork.new(log: @log)
|
251
251
|
Farm.new(invoice, File.join(home, 'farm'), log: @log, farmer: farmer)
|
252
252
|
.start(host, opts[:port], threads: opts[:threads], strength: opts[:strength]) do |farm|
|
253
253
|
Front.set(:farm, farm)
|
data/lib/zold/commands/push.rb
CHANGED
@@ -24,6 +24,8 @@ require 'rainbow'
|
|
24
24
|
require 'slop'
|
25
25
|
require 'json'
|
26
26
|
require 'net/http'
|
27
|
+
require 'concurrent'
|
28
|
+
require 'parallel'
|
27
29
|
require_relative 'thread_badge'
|
28
30
|
require_relative 'args'
|
29
31
|
require_relative '../age'
|
@@ -58,11 +60,15 @@ Available options:"
|
|
58
60
|
o.array '--ignore-node',
|
59
61
|
'Ignore this node and don\'t push to it',
|
60
62
|
default: []
|
63
|
+
o.integer '--threads',
|
64
|
+
"How many threads to use for pushing wallets (default: #{[Concurrent.processor_count / 2, 2].max})",
|
65
|
+
default: [Concurrent.processor_count / 2, 2].max
|
61
66
|
o.bool '--help', 'Print instructions'
|
62
67
|
end
|
63
68
|
mine = Args.new(opts, @log).take || return
|
64
|
-
(mine.empty? ? @wallets.all : mine.map { |i| Id.new(i) })
|
69
|
+
Parallel.map((mine.empty? ? @wallets.all : mine.map { |i| Id.new(i) }), in_threads: opts[:threads]) do |id|
|
65
70
|
push(id, opts)
|
71
|
+
@log.debug("Worker: #{Parallel.worker_number} has pushed wallet #{id}")
|
66
72
|
end
|
67
73
|
end
|
68
74
|
|
data/lib/zold/commands/remote.rb
CHANGED
@@ -137,7 +137,7 @@ Available options:"
|
|
137
137
|
when 'reset'
|
138
138
|
reset
|
139
139
|
when 'defaults'
|
140
|
-
defaults
|
140
|
+
defaults(opts)
|
141
141
|
when 'add'
|
142
142
|
add(mine[1], mine[2] ? mine[2].to_i : Remotes::PORT, opts)
|
143
143
|
when 'remove'
|
@@ -175,7 +175,7 @@ Available options:"
|
|
175
175
|
defaults
|
176
176
|
end
|
177
177
|
|
178
|
-
def defaults
|
178
|
+
def defaults(opts)
|
179
179
|
@remotes.defaults do |host, port|
|
180
180
|
!opts['ignore-node'].include?("#{host}:#{port}")
|
181
181
|
end
|
data/lib/zold/dir_items.rb
CHANGED
@@ -42,7 +42,7 @@ module Zold
|
|
42
42
|
def fetch(recursive: true)
|
43
43
|
spawn = POSIX::Spawn::Child.new(
|
44
44
|
'find',
|
45
|
-
*([
|
45
|
+
*([@dir, '-type', 'f', '-print'] + (recursive ? [] : ['-maxdepth', '1']))
|
46
46
|
)
|
47
47
|
raise spawn.err unless spawn.status.success?
|
48
48
|
spawn.out
|
data/lib/zold/http.rb
CHANGED
@@ -23,8 +23,8 @@
|
|
23
23
|
require 'rainbow'
|
24
24
|
require 'uri'
|
25
25
|
require 'backtrace'
|
26
|
-
require 'patron'
|
27
26
|
require 'zold/score'
|
27
|
+
require 'typhoeus'
|
28
28
|
require_relative 'version'
|
29
29
|
|
30
30
|
# HTTP page.
|
@@ -68,49 +68,56 @@ module Zold
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def get(timeout: READ_TIMEOUT)
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
71
|
+
Response.new(
|
72
|
+
Typhoeus::Request.get(
|
73
|
+
@uri,
|
74
|
+
accept_encoding: 'gzip',
|
75
|
+
headers: headers,
|
76
|
+
connecttimeout: CONNECT_TIMEOUT,
|
77
|
+
timeout: timeout
|
78
|
+
)
|
77
79
|
)
|
78
|
-
path = @uri.path
|
79
|
-
path += '?' + @uri.query if @uri.query
|
80
|
-
session.get(path)
|
81
80
|
rescue StandardError => e
|
82
81
|
Error.new(e)
|
83
82
|
end
|
84
83
|
|
85
84
|
def put(body, timeout: READ_TIMEOUT)
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
85
|
+
Response.new(
|
86
|
+
Typhoeus::Request.put(
|
87
|
+
@uri,
|
88
|
+
accept_encoding: 'gzip',
|
89
|
+
body: body,
|
90
|
+
headers: headers.merge('Content-Type': 'text/plain'),
|
91
|
+
connecttimeout: CONNECT_TIMEOUT,
|
92
|
+
timeout: timeout
|
94
93
|
)
|
95
94
|
)
|
96
|
-
path = @uri.path
|
97
|
-
path += '?' + @uri.query if @uri.query
|
98
|
-
session.put(path, body)
|
99
95
|
rescue StandardError => e
|
100
96
|
Error.new(e)
|
101
97
|
end
|
102
98
|
|
103
99
|
private
|
104
100
|
|
105
|
-
#
|
106
|
-
class
|
107
|
-
def
|
108
|
-
|
101
|
+
# Some clients waits for status method in respons
|
102
|
+
class Response < SimpleDelegator
|
103
|
+
def status
|
104
|
+
code.zero? ? 599 : code
|
105
|
+
end
|
106
|
+
|
107
|
+
def status_line
|
108
|
+
status_message
|
109
109
|
end
|
110
110
|
|
111
111
|
def to_s
|
112
112
|
"#{status}: #{status_line}\n#{body}"
|
113
113
|
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# The error, if connection fails
|
117
|
+
class Error < Response
|
118
|
+
def initialize(ex)
|
119
|
+
@ex = ex
|
120
|
+
end
|
114
121
|
|
115
122
|
def body
|
116
123
|
Backtrace.new(@ex).to_s
|
data/lib/zold/json_page.rb
CHANGED
@@ -40,7 +40,7 @@ module Zold
|
|
40
40
|
raise 'JSON is empty, can\'t parse' + (@uri.empty? ? '' : " at #{@uri}") if @text.empty?
|
41
41
|
JSON.parse(@text)
|
42
42
|
rescue JSON::ParserError => e
|
43
|
-
raise "Failed to parse JSON #{@uri.empty? ? '' : "at #{@uri}"} (#{e.message}): #{@text}"
|
43
|
+
raise "Failed to parse JSON #{@uri.empty? ? '' : "at #{@uri}"} (#{e.message}): #{@text.inspect}"
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
data/lib/zold/node/farm.rb
CHANGED
@@ -215,12 +215,10 @@ at #{host}:#{port}, strength is #{strength}")
|
|
215
215
|
return [] unless File.exist?(@cache)
|
216
216
|
Futex.new(@cache).open do |f|
|
217
217
|
IO.read(f).split(/\n/).map do |t|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
nil
|
223
|
-
end
|
218
|
+
Score.parse(t)
|
219
|
+
rescue StandardError => e
|
220
|
+
@log.error(Backtrace.new(e).to_s)
|
221
|
+
nil
|
224
222
|
end.compact
|
225
223
|
end
|
226
224
|
end
|
data/lib/zold/node/farmers.rb
CHANGED
@@ -37,6 +37,10 @@ module Zold
|
|
37
37
|
module Farmers
|
38
38
|
# Plain and simple
|
39
39
|
class Plain
|
40
|
+
def initialize(log: Log::NULL)
|
41
|
+
@log = log
|
42
|
+
end
|
43
|
+
|
40
44
|
def up(score)
|
41
45
|
score.next
|
42
46
|
end
|
@@ -49,9 +53,8 @@ module Zold
|
|
49
53
|
end
|
50
54
|
|
51
55
|
def up(score)
|
52
|
-
|
53
|
-
|
54
|
-
end
|
56
|
+
raise "We are farming the score already: #{score}" if
|
57
|
+
POSIX::Spawn::Child.new('ps', 'ax').out.include?(score.to_s.split(' ').take(4).join(' '))
|
55
58
|
start = Time.now
|
56
59
|
bin = File.expand_path(File.join(File.dirname(__FILE__), '../../../bin/zold'))
|
57
60
|
raise "Zold binary not found at #{bin}" unless File.exist?(bin)
|
@@ -112,5 +115,28 @@ for #{after.host}:#{after.port} in #{Age.new(start)}: #{after.suffixes}")
|
|
112
115
|
@log.debug("No need to kill process ##{pid} since it's dead already: #{e.message}")
|
113
116
|
end
|
114
117
|
end
|
118
|
+
|
119
|
+
# In a child process using fork
|
120
|
+
class Fork
|
121
|
+
def initialize(log: Log::NULL)
|
122
|
+
@log = log
|
123
|
+
end
|
124
|
+
|
125
|
+
def up(score)
|
126
|
+
start = Time.now
|
127
|
+
stdin, stdout = IO.pipe
|
128
|
+
pid = Process.fork do
|
129
|
+
stdout.puts(score.next)
|
130
|
+
end
|
131
|
+
at_exit { Process.kill('KILL', pid) }
|
132
|
+
Process.wait
|
133
|
+
stdout.close
|
134
|
+
after = Score.parse(stdin.read.strip)
|
135
|
+
stdin.close
|
136
|
+
@log.debug("Next score #{after.value}/#{after.strength} found in proc ##{pid} \
|
137
|
+
for #{after.host}:#{after.port} in #{Age.new(start)}: #{after.suffixes}")
|
138
|
+
after
|
139
|
+
end
|
140
|
+
end
|
115
141
|
end
|
116
142
|
end
|
data/lib/zold/sync_wallets.rb
CHANGED
@@ -30,10 +30,11 @@ require_relative 'log'
|
|
30
30
|
module Zold
|
31
31
|
# Synchronized collection of wallets
|
32
32
|
class SyncWallets
|
33
|
-
def initialize(wallets, timeout: 30, log: Log::NULL)
|
33
|
+
def initialize(wallets, timeout: 30, log: Log::NULL, dir: wallets.path)
|
34
34
|
@wallets = wallets
|
35
35
|
@log = log
|
36
36
|
@timeout = timeout
|
37
|
+
@dir = dir
|
37
38
|
end
|
38
39
|
|
39
40
|
def to_s
|
@@ -50,7 +51,7 @@ module Zold
|
|
50
51
|
|
51
52
|
def acq(id, exclusive: false)
|
52
53
|
@wallets.acq(id, exclusive: exclusive) do |wallet|
|
53
|
-
Futex.new(wallet.path, log: @log).open(exclusive) do
|
54
|
+
Futex.new(wallet.path, log: @log, lock: File.join(@dir, "#{id}.lock")).open(exclusive) do
|
54
55
|
yield wallet
|
55
56
|
end
|
56
57
|
end
|
data/lib/zold/version.rb
CHANGED
data/test/commands/test_fetch.rb
CHANGED
@@ -73,4 +73,51 @@ class TestFetch < Zold::Test
|
|
73
73
|
assert_equal(0, copies.all[0][:score])
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
77
|
+
def test_fetches_multiple_wallets
|
78
|
+
log = TestLogger.new(test_log)
|
79
|
+
FakeHome.new(log: log).run do |home|
|
80
|
+
wallet_a = home.create_wallet
|
81
|
+
stub_request(:get, "http://localhost:4096/wallet/#{wallet_a.id}/size")
|
82
|
+
.to_return(status: 200, body: wallet_a.size.to_s)
|
83
|
+
stub_request(:get, "http://localhost:4096/wallet/#{wallet_a.id}").to_return(
|
84
|
+
status: 200,
|
85
|
+
body: {
|
86
|
+
'score': Zold::Score::ZERO.to_h,
|
87
|
+
'body': IO.read(wallet_a.path),
|
88
|
+
'mtime': Time.now.utc.iso8601
|
89
|
+
}.to_json
|
90
|
+
)
|
91
|
+
wallet_b = home.create_wallet
|
92
|
+
stub_request(:get, "http://localhost:4096/wallet/#{wallet_b.id}/size")
|
93
|
+
.to_return(status: 200, body: wallet_b.size.to_s)
|
94
|
+
stub_request(:get, "http://localhost:4096/wallet/#{wallet_b.id}").to_return(
|
95
|
+
status: 200,
|
96
|
+
body: {
|
97
|
+
'score': Zold::Score::ZERO.to_h,
|
98
|
+
'body': IO.read(wallet_b.path),
|
99
|
+
'mtime': Time.now.utc.iso8601
|
100
|
+
}.to_json
|
101
|
+
)
|
102
|
+
remotes = home.remotes
|
103
|
+
remotes.add('localhost', 4096)
|
104
|
+
copies_a = home.copies(wallet_a)
|
105
|
+
copies_b = home.copies(wallet_b)
|
106
|
+
begin
|
107
|
+
retries ||= 0
|
108
|
+
Zold::Fetch.new(wallets: home.wallets, copies: copies_a.root, remotes: remotes, log: log).run(
|
109
|
+
['fetch', '--ignore-score-weakness', '--threads 2', wallet_a.id.to_s, wallet_b.id.to_s]
|
110
|
+
)
|
111
|
+
rescue StandardError => _
|
112
|
+
sleep 1
|
113
|
+
retry if (retries += 1) < 3
|
114
|
+
end
|
115
|
+
assert_equal(1, copies_a.all.count)
|
116
|
+
assert_equal('1', copies_a.all[0][:name])
|
117
|
+
assert_equal(0, copies_a.all[0][:score])
|
118
|
+
assert_equal(1, copies_b.all.count)
|
119
|
+
assert_equal('1', copies_b.all[0][:name])
|
120
|
+
assert_equal(0, copies_b.all[0][:score])
|
121
|
+
end
|
122
|
+
end
|
76
123
|
end
|
data/test/commands/test_push.rb
CHANGED
@@ -47,4 +47,19 @@ class TestPush < Zold::Test
|
|
47
47
|
)
|
48
48
|
end
|
49
49
|
end
|
50
|
+
|
51
|
+
def test_pushes_multiple_wallets
|
52
|
+
log = TestLogger.new(test_log)
|
53
|
+
FakeHome.new(log: log).run do |home|
|
54
|
+
wallet_a = home.create_wallet
|
55
|
+
wallet_b = home.create_wallet
|
56
|
+
remotes = home.remotes
|
57
|
+
remotes.add('localhost', 80)
|
58
|
+
stub_request(:put, "http://localhost:80/wallet/#{wallet_a.id}").to_return(status: 304)
|
59
|
+
stub_request(:put, "http://localhost:80/wallet/#{wallet_b.id}").to_return(status: 304)
|
60
|
+
Zold::Push.new(wallets: home.wallets, remotes: remotes, log: log).run(
|
61
|
+
['--ignore-this-stupid-option --threads 2', 'push', wallet_a.id.to_s, wallet_b.id.to_s]
|
62
|
+
)
|
63
|
+
end
|
64
|
+
end
|
50
65
|
end
|
@@ -234,4 +234,13 @@ class TestRemote < Zold::Test
|
|
234
234
|
assert_equal(5, remotes.all.count)
|
235
235
|
end
|
236
236
|
end
|
237
|
+
|
238
|
+
def test_sets_defaults
|
239
|
+
Dir.mktmpdir do |dir|
|
240
|
+
remotes = Zold::Remotes.new(file: File.join(dir, 'remotes.txt'))
|
241
|
+
cmd = Zold::Remote.new(remotes: remotes, log: test_log)
|
242
|
+
cmd.run(%w[remote defaults])
|
243
|
+
assert(!remotes.all.empty?)
|
244
|
+
end
|
245
|
+
end
|
237
246
|
end
|
@@ -58,7 +58,7 @@ class TestAsyncEntrance < Zold::Test
|
|
58
58
|
def test_sends_through
|
59
59
|
FakeHome.new(log: test_log).run do |home|
|
60
60
|
basic = CountingEntrance.new
|
61
|
-
Zold::AsyncEntrance.new(basic, File.join(home.dir, 'a/b/c'), log: test_log).start do |e|
|
61
|
+
Zold::AsyncEntrance.new(basic, File.join(home.dir, 'a/b/c'), log: test_log, queue_limit: 1000).start do |e|
|
62
62
|
Threads.new(20).assert do
|
63
63
|
wallet = home.create_wallet
|
64
64
|
amount = Zold::Amount.new(zld: 39.99)
|
data/test/node/test_farmers.rb
CHANGED
@@ -25,23 +25,28 @@ require 'time'
|
|
25
25
|
require 'zold/score'
|
26
26
|
require_relative '../test__helper'
|
27
27
|
require_relative '../../lib/zold/node/farmers'
|
28
|
+
require_relative '../../lib/zold/verbose_thread'
|
28
29
|
|
29
30
|
class FarmersTest < Zold::Test
|
30
31
|
def test_calculates_next_score
|
31
32
|
before = Zold::Score.new(host: 'some-host', port: 9999, invoice: 'NOPREFIX4@ffffffffffffffff', strength: 3)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
[Zold::Farmers::Plain, Zold::Farmers::Spawn, Zold::Farmers::Fork].each do |farmer_class|
|
34
|
+
farmer = farmer_class.new(log: test_log)
|
35
|
+
after = farmer.up(before)
|
36
|
+
assert_equal(1, after.value)
|
37
|
+
assert(!after.expired?)
|
38
|
+
assert_equal('some-host', after.host)
|
39
|
+
assert_equal(9999, after.port)
|
40
|
+
end
|
38
41
|
end
|
39
42
|
|
40
43
|
def test_calculates_large_score
|
41
44
|
log = TestLogger.new(test_log)
|
42
45
|
thread = Thread.start do
|
43
|
-
|
44
|
-
|
46
|
+
[Zold::Farmers::Spawn, Zold::Farmers::Fork].each do |farmer_class|
|
47
|
+
farmer = farmer_class.new(log: log)
|
48
|
+
farmer.up(Zold::Score.new(host: 'a', port: 1, invoice: 'NOPREFIX4@ffffffffffffffff', strength: 20))
|
49
|
+
end
|
45
50
|
end
|
46
51
|
assert_wait { !log.msgs.find { |m| m.include?('Scoring started') }.nil? }
|
47
52
|
thread.kill
|
@@ -49,28 +54,36 @@ class FarmersTest < Zold::Test
|
|
49
54
|
assert(log.msgs.find { |m| m.include?('killed') })
|
50
55
|
end
|
51
56
|
|
52
|
-
def
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
57
|
+
def test_kills_farmer
|
58
|
+
[Zold::Farmers::Plain, Zold::Farmers::Spawn, Zold::Farmers::Fork].each do |type|
|
59
|
+
farmer = type.new(log: test_log)
|
60
|
+
thread = Thread.start do
|
61
|
+
Zold::VerboseThread.new(test_log).run do
|
62
|
+
farmer.up(Zold::Score.new(host: 'some-host', invoice: 'NOPREFIX4@ffffffffffffffff', strength: 32))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
sleep(1)
|
66
|
+
thread.kill
|
67
|
+
thread.join
|
68
|
+
end
|
60
69
|
end
|
61
70
|
|
62
71
|
def test_avoid_duplicate_processes
|
63
72
|
log = TestLogger.new(test_log)
|
64
73
|
time = Time.now
|
65
74
|
thread = Thread.start do
|
66
|
-
|
67
|
-
|
75
|
+
[Zold::Farmers::Spawn, Zold::Farmers::Fork].each do |farmer_class|
|
76
|
+
farmer = farmer_class.new(log: log)
|
77
|
+
farmer.up(Zold::Score.new(time: time, host: 'a', port: 1, invoice: 'prefixone@ffffffffffffffff', strength: 20))
|
78
|
+
end
|
68
79
|
end
|
69
80
|
assert_wait { !log.msgs.find { |m| m.include?('Scoring started') }.nil? }
|
70
81
|
assert_raises do
|
71
|
-
Zold::Farmers::Spawn.
|
72
|
-
|
73
|
-
|
82
|
+
[Zold::Farmers::Spawn, Zold::Farmers::Fork].each do |farmer_class|
|
83
|
+
farmer_class.new(log: log).up(
|
84
|
+
Zold::Score.new(time: time, host: 'a', port: 1, invoice: 'prefixtwo@ffffffffffffffff', strength: 20)
|
85
|
+
)
|
86
|
+
end
|
74
87
|
end
|
75
88
|
thread.kill
|
76
89
|
thread.join
|
data/test/node/test_front.rb
CHANGED
@@ -61,13 +61,13 @@ class FrontTest < Zold::Test
|
|
61
61
|
assert_equal(Zold::VERSION, json['version'])
|
62
62
|
assert_equal(Zold::PROTOCOL, json['protocol'])
|
63
63
|
assert_equal('foo', json['network'])
|
64
|
-
assert(json['pid'].positive
|
65
|
-
assert(json['cpus'].positive
|
66
|
-
assert(json['memory'].positive
|
67
|
-
assert(json['load'].
|
68
|
-
assert(json['wallets'].positive
|
69
|
-
assert(json['remotes'].zero
|
70
|
-
assert(json['nscore'].zero
|
64
|
+
assert(json['pid'].positive?, json)
|
65
|
+
assert(json['cpus'].positive?, json)
|
66
|
+
assert(json['memory'].positive?, json)
|
67
|
+
assert(!json['load'].negative?, json)
|
68
|
+
assert(json['wallets'].positive?, json)
|
69
|
+
assert(json['remotes'].zero?, json)
|
70
|
+
assert(json['nscore'].zero?, json)
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
data/test/test_dir_items.rb
CHANGED
@@ -53,11 +53,7 @@ class TestDirItems < Zold::Test
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
# @todo #507:30min I don't understand why this test doesn't work. It's not
|
57
|
-
# mission critical, since we don't have spaces in our paths, mostly. But
|
58
|
-
# still, would be great to fix it.
|
59
56
|
def test_lists_empty_dir
|
60
|
-
skip
|
61
57
|
Dir.mktmpdir do |dir|
|
62
58
|
d = File.join(dir, 'path с пробелами')
|
63
59
|
FileUtils.mkdir_p(d)
|
@@ -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 'rainbow'
|
23
24
|
require_relative '../lib/zold/version'
|
24
25
|
require_relative '../lib/zold/wallet'
|
25
26
|
|
@@ -38,7 +39,8 @@ module Zold
|
|
38
39
|
f = File.join(@home, path)
|
39
40
|
wallet = Wallet.new(f)
|
40
41
|
next if wallet.network == @network
|
41
|
-
@log.info("Wallet #{wallet.id}
|
42
|
+
@log.info("Wallet #{wallet.id} #{Rainbow(renamed).red}, \
|
43
|
+
since it's in \"#{wallet.network}\", while we are in \"#{@network}\" network")
|
42
44
|
File.rename(f, f + '-old')
|
43
45
|
end
|
44
46
|
end
|
data/zold.gemspec
CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |s|
|
|
30
30
|
s.specification_version = 2 if s.respond_to? :specification_version=
|
31
31
|
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
|
32
32
|
s.rubygems_version = '2.2'
|
33
|
-
s.required_ruby_version = '>=2.
|
33
|
+
s.required_ruby_version = '>=2.5'
|
34
34
|
s.name = 'zold'
|
35
35
|
s.version = Zold::VERSION
|
36
36
|
s.license = 'MIT'
|
@@ -70,7 +70,7 @@ and suggests a different architecture for digital wallet maintenance.'
|
|
70
70
|
s.add_runtime_dependency 'json', '2.1.0'
|
71
71
|
s.add_runtime_dependency 'memory_profiler', '0.9.12'
|
72
72
|
s.add_runtime_dependency 'openssl', '2.1.2'
|
73
|
-
s.add_runtime_dependency '
|
73
|
+
s.add_runtime_dependency 'parallel', '1.12.1'
|
74
74
|
s.add_runtime_dependency 'posix-spawn', '0.3.13'
|
75
75
|
s.add_runtime_dependency 'rainbow', '3.0.0'
|
76
76
|
s.add_runtime_dependency 'rake', '12.3.1' # has to stay here for Heroku
|
@@ -82,10 +82,11 @@ and suggests a different architecture for digital wallet maintenance.'
|
|
82
82
|
s.add_runtime_dependency 'sys-proctable', '1.2.1'
|
83
83
|
s.add_runtime_dependency 'thin', '1.7.2'
|
84
84
|
s.add_runtime_dependency 'threads', '0.3.0'
|
85
|
+
s.add_runtime_dependency 'typhoeus', '1.3.1'
|
85
86
|
s.add_runtime_dependency 'usagewatch_ext', '0.2.1'
|
86
87
|
s.add_runtime_dependency 'xcop', '0.6'
|
87
88
|
s.add_runtime_dependency 'zache', '0.3.1'
|
88
|
-
s.add_runtime_dependency 'zold-score', '0.
|
89
|
+
s.add_runtime_dependency 'zold-score', '0.3.3'
|
89
90
|
s.add_development_dependency 'codecov', '0.1.13'
|
90
91
|
s.add_development_dependency 'minitest', '5.11.3'
|
91
92
|
s.add_development_dependency 'minitest-fail-fast', '0.1.0'
|
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.
|
4
|
+
version: 0.17.0
|
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-11-
|
11
|
+
date: 2018-11-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backtrace
|
@@ -137,19 +137,19 @@ dependencies:
|
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: 2.1.2
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
140
|
+
name: parallel
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - '='
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version:
|
145
|
+
version: 1.12.1
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - '='
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version:
|
152
|
+
version: 1.12.1
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: posix-spawn
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -304,6 +304,20 @@ dependencies:
|
|
304
304
|
- - '='
|
305
305
|
- !ruby/object:Gem::Version
|
306
306
|
version: 0.3.0
|
307
|
+
- !ruby/object:Gem::Dependency
|
308
|
+
name: typhoeus
|
309
|
+
requirement: !ruby/object:Gem::Requirement
|
310
|
+
requirements:
|
311
|
+
- - '='
|
312
|
+
- !ruby/object:Gem::Version
|
313
|
+
version: 1.3.1
|
314
|
+
type: :runtime
|
315
|
+
prerelease: false
|
316
|
+
version_requirements: !ruby/object:Gem::Requirement
|
317
|
+
requirements:
|
318
|
+
- - '='
|
319
|
+
- !ruby/object:Gem::Version
|
320
|
+
version: 1.3.1
|
307
321
|
- !ruby/object:Gem::Dependency
|
308
322
|
name: usagewatch_ext
|
309
323
|
requirement: !ruby/object:Gem::Requirement
|
@@ -352,14 +366,14 @@ dependencies:
|
|
352
366
|
requirements:
|
353
367
|
- - '='
|
354
368
|
- !ruby/object:Gem::Version
|
355
|
-
version: 0.
|
369
|
+
version: 0.3.3
|
356
370
|
type: :runtime
|
357
371
|
prerelease: false
|
358
372
|
version_requirements: !ruby/object:Gem::Requirement
|
359
373
|
requirements:
|
360
374
|
- - '='
|
361
375
|
- !ruby/object:Gem::Version
|
362
|
-
version: 0.
|
376
|
+
version: 0.3.3
|
363
377
|
- !ruby/object:Gem::Dependency
|
364
378
|
name: codecov
|
365
379
|
requirement: !ruby/object:Gem::Requirement
|
@@ -697,7 +711,7 @@ licenses:
|
|
697
711
|
- MIT
|
698
712
|
metadata: {}
|
699
713
|
post_install_message: |-
|
700
|
-
Thanks for installing Zold 0.
|
714
|
+
Thanks for installing Zold 0.17.0!
|
701
715
|
Study our White Paper: https://papers.zold.io/wp.pdf
|
702
716
|
Read our blog posts: https://blog.zold.io
|
703
717
|
Try online wallet at: https://wts.zold.io
|
@@ -712,7 +726,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
712
726
|
requirements:
|
713
727
|
- - ">="
|
714
728
|
- !ruby/object:Gem::Version
|
715
|
-
version: '2.
|
729
|
+
version: '2.5'
|
716
730
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
717
731
|
requirements:
|
718
732
|
- - ">="
|