zold 0.13.37 → 0.13.38

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