zold 0.13.37 → 0.13.38

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: d18501efcccce708ef86d74d1833aa65049cc9af
4
- data.tar.gz: 305c19eecc8df966e70ca0d1dd487988a4e7fe40
3
+ metadata.gz: e1c4b9fec37b2f1f351188890814381b2abbaa48
4
+ data.tar.gz: c3d35c7bcf49845a0f95a0a24fee896bf4fbef3f
5
5
  SHA512:
6
- metadata.gz: 4d3b807fdc1db274a26d31a9cba3c42b2ac888bd1de0d079f2dc9554ebdb4d3fa0fd245ce6a914a5fd4856aeeeb95ac384365555279ea80a746cab31f193fbd4
7
- data.tar.gz: c9e3c8e1e5dfa5b7c976b0ef74af1d68bdf9b367a8236615a616e23308d370b3bb2f75b019172a3b1ed033e9df327b056701968c95f38d6e92eb4dd41d1a44bc
6
+ metadata.gz: c3d5840ae8b755c85ceffbc5d0bfab5c778bc42d8a6f9883f1c178d7d86136206d07707425a33ecc55f2f823f850edc834fb8c9175eccab2ba8400c177acadb8
7
+ data.tar.gz: bebb092830df7d63e311b861804ab2013b6e43341a77e0ed9d96b5ee2438bc405797e30d06dbe831a46c52ae8a7f14e454040094e6d74c927ee667d5418eeaae
data/lib/zold/remotes.rb CHANGED
@@ -110,6 +110,7 @@ module Zold
110
110
  @file = file
111
111
  raise 'Network can\'t be nil' if network.nil?
112
112
  @network = network
113
+ @mutex = Mutex.new
113
114
  end
114
115
 
115
116
  def all
@@ -223,31 +224,35 @@ in #{(Time.now - start).round}s; errors=#{errors}")
223
224
  private
224
225
 
225
226
  def load
226
- raw = CSV.read(file).map do |r|
227
- {
228
- host: r[0],
229
- port: r[1].to_i,
230
- score: r[2].to_i,
231
- errors: r[3].to_i
232
- }
233
- end
234
- raw.reject { |r| !r[:host] || r[:port].zero? }.map do |r|
235
- r[:home] = URI("http://#{r[0]}:#{r[1]}/")
236
- r
227
+ @mutex.synchronize do
228
+ raw = CSV.read(file).map do |r|
229
+ {
230
+ host: r[0],
231
+ port: r[1].to_i,
232
+ score: r[2].to_i,
233
+ errors: r[3].to_i
234
+ }
235
+ end
236
+ raw.reject { |r| !r[:host] || r[:port].zero? }.map do |r|
237
+ r[:home] = URI("http://#{r[0]}:#{r[1]}/")
238
+ r
239
+ end
237
240
  end
238
241
  end
239
242
 
240
243
  def save(list)
241
- AtomicFile.new(file).write(
242
- list.map do |r|
243
- [
244
- r[:host],
245
- r[:port],
246
- r[:score],
247
- r[:errors]
248
- ].join(',')
249
- end.join("\n")
250
- )
244
+ @mutex.synchronize do
245
+ AtomicFile.new(file).write(
246
+ list.map do |r|
247
+ [
248
+ r[:host],
249
+ r[:port],
250
+ r[:score],
251
+ r[:errors]
252
+ ].join(',')
253
+ end.join("\n")
254
+ )
255
+ end
251
256
  end
252
257
 
253
258
  def file
data/lib/zold/version.rb CHANGED
@@ -23,5 +23,5 @@
23
23
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
24
24
  # License:: MIT
25
25
  module Zold
26
- VERSION = '0.13.37'.freeze
26
+ VERSION = '0.13.38'.freeze
27
27
  end
data/test/test_remotes.rb CHANGED
@@ -20,9 +20,12 @@
20
20
 
21
21
  require 'minitest/autorun'
22
22
  require 'tmpdir'
23
+ require 'concurrent'
24
+ require 'concurrent/atomics'
23
25
  require_relative 'test__helper'
24
26
  require_relative '../lib/zold/log'
25
27
  require_relative '../lib/zold/remotes'
28
+ require_relative '../lib/zold/verbose_thread'
26
29
 
27
30
  # Remotes test.
28
31
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -122,4 +125,35 @@ class TestRemotes < Minitest::Test
122
125
  end
123
126
  end
124
127
  end
128
+
129
+ def test_modifies_from_many_threads
130
+ Dir.mktmpdir 'test' do |dir|
131
+ remotes = Zold::Remotes.new(File.join(dir, 'a.csv'))
132
+ remotes.clean
133
+ threads = 5
134
+ pool = Concurrent::FixedThreadPool.new(threads)
135
+ alive = true
136
+ cycles = Concurrent::AtomicFixnum.new
137
+ success = Concurrent::AtomicFixnum.new
138
+ host = '192.168.0.1'
139
+ remotes.add(host)
140
+ threads.times do
141
+ pool.post do
142
+ while alive
143
+ Zold::VerboseThread.new(test_log).run(true) do
144
+ cycles.increment
145
+ remotes.error(host)
146
+ success.increment
147
+ end
148
+ end
149
+ end
150
+ end
151
+ sleep 0.1 while cycles.value < 50
152
+ alive = false
153
+ pool.shutdown
154
+ pool.wait_for_termination
155
+ assert_equal(cycles.value, success.value)
156
+ assert_equal(0, remotes.all.reject { |r| r[:host] == host }.size)
157
+ end
158
+ end
125
159
  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.13.37
4
+ version: 0.13.38
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko