async-io 1.27.5 → 1.27.6

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
  SHA256:
3
- metadata.gz: 2aa645f59a002756ee40be3c903917fb8010d91d61f1984a863481cab364644c
4
- data.tar.gz: 8e4fc966f387cb76a7635923d4f3803a2cd91354ddf63fc4618431c97c1c89e9
3
+ metadata.gz: 8e0bff7f13a902bd5ef577d7a36d067f482c4d02001dfe1111ef83cb549187fd
4
+ data.tar.gz: 80aa5c4aaf1da1f1fe9df08779f9be5e03168b4ba42a3a8e83b19c3b4b5205f2
5
5
  SHA512:
6
- metadata.gz: 297100087ebdf7a49a147b3b29f7e1b1c9cceffcf8c2a68857bb12cf10dfde34e83e5f18c53a1060f2833bb630b17ba72f5532bbd3453e953d5362c30d4eaf2c
7
- data.tar.gz: 0dfb45ca2d1134185511c44a91bf2c02e8ded1cb7e31fc10cb71ac2de93444aa45a5dd44a5edb94f224a1b2800c1d63818ae23803a0607137de5a810486fa878
6
+ metadata.gz: 9a6cd691bc26134513232ae20b4d7c38c7807fe697360537a690fd504099b825e546c6be4cd7fbb50d50164f55d46a02a0a5986a1ee97b64673342442886cf84
7
+ data.tar.gz: cf04dd4be38376c52b76c88233b5de97b58e7dc4ce14cac2a9d68824dc5489db3e192fb0d29bb8101d15a2172ffce66be51e9914a8b22b65807cd17a8cb4f583
data/Gemfile CHANGED
@@ -8,6 +8,8 @@ gemspec
8
8
  group :development do
9
9
  gem 'pry'
10
10
  gem 'guard-rspec'
11
+
12
+ gem 'bake-bundler'
11
13
  end
12
14
 
13
15
  group :test do
@@ -29,7 +29,7 @@ module Async
29
29
  BLOCK_SIZE = ENV.fetch('ASYNC_IO_BLOCK_SIZE', 1024*64).to_i
30
30
 
31
31
  # The maximum read size when appending to IO buffers. Defaults to 8MB.
32
- MAXIMUM_READ_SIZE = ENV.fetch('ASYNC_IO_MAXIMUM_READ_SIZE', BLOCK_SIZE * 128 * 8).to_i
32
+ MAXIMUM_READ_SIZE = ENV.fetch('ASYNC_IO_MAXIMUM_READ_SIZE', BLOCK_SIZE * 128).to_i
33
33
 
34
34
  # Convert a Ruby ::IO object to a wrapped instance:
35
35
  def self.try_convert(io, &block)
@@ -48,6 +48,7 @@ module Async
48
48
 
49
49
  @deferred = deferred
50
50
  @pending = 0
51
+
51
52
  @writing = Async::Semaphore.new(1)
52
53
 
53
54
  # We don't want Ruby to do any IO buffering.
@@ -154,7 +155,6 @@ module Async
154
155
  if @pending == 1
155
156
  task.yield
156
157
  drain_write_buffer unless @write_buffer.empty?
157
- @pending = 0
158
158
  end
159
159
  else
160
160
  drain_write_buffer unless @write_buffer.empty?
@@ -245,18 +245,29 @@ module Async
245
245
 
246
246
  def drain_write_buffer
247
247
  @writing.acquire do
248
- Async.logger.debug(self) do
248
+ Async.logger.debug(self) do |buffer|
249
249
  if @pending > 0
250
- "Draining #{@pending} writes (#{@write_buffer.bytesize} bytes)..."
250
+ buffer.puts "Draining #{@pending} writes (#{@write_buffer.bytesize} bytes)..."
251
251
  else
252
- "Draining immediate write (#{@write_buffer.bytesize} bytes)..."
252
+ buffer.puts "Draining immediate write (#{@write_buffer.bytesize} bytes)..."
253
253
  end
254
+
255
+ # buffer.puts "@write_buffer = #{@write_buffer.inspect}"
256
+ # buffer.puts "@drain_buffer = #{@drain_buffer.inspect}"
254
257
  end
255
258
 
259
+ # Flip the write buffer and drain buffer:
256
260
  @write_buffer, @drain_buffer = @drain_buffer, @write_buffer
257
261
 
258
- @io.write(@drain_buffer)
259
- @drain_buffer.clear
262
+ # The write buffer no longer contains pending writes:
263
+ @pending = 0
264
+
265
+ begin
266
+ @io.write(@drain_buffer)
267
+ ensure
268
+ # If the write operation fails, we still need to clear this buffer, and the data is essentially lost.
269
+ @drain_buffer.clear
270
+ end
260
271
  end
261
272
  end
262
273
 
@@ -281,6 +292,7 @@ module Async
281
292
  if chunk = @io.read_nonblock(size, @input_buffer, exception: false)
282
293
  @read_buffer << chunk
283
294
  # Async.logger.debug(self, name: "read") {@read_buffer.inspect}
295
+
284
296
  return true
285
297
  end
286
298
  end
@@ -22,6 +22,6 @@
22
22
 
23
23
  module Async
24
24
  module IO
25
- VERSION = "1.27.5"
25
+ VERSION = "1.27.6"
26
26
  end
27
27
  end
@@ -77,6 +77,25 @@ RSpec.describe Async::IO::Stream do
77
77
  expect(buffer).to be == (buffer[0] * buffer_size)
78
78
  end
79
79
  end
80
+
81
+ it "handles write failures" do
82
+ subject.close
83
+
84
+ task = reactor.async do
85
+ output.write("Hello World")
86
+ output.flush(deferred: true)
87
+ end
88
+
89
+ expect do
90
+ task.wait
91
+ end.to raise_error(Errno::EPIPE)
92
+
93
+ write_buffer = output.instance_variable_get(:@write_buffer)
94
+ drain_buffer = output.instance_variable_get(:@drain_buffer)
95
+
96
+ expect(write_buffer).to be_empty
97
+ expect(drain_buffer).to be_empty
98
+ end
80
99
  end
81
100
 
82
101
  describe '#close_read' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-io
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.27.5
4
+ version: 1.27.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-21 00:00:00.000000000 Z
11
+ date: 2020-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -122,7 +122,6 @@ files:
122
122
  - ".yardopts"
123
123
  - Gemfile
124
124
  - README.md
125
- - Rakefile
126
125
  - async-io.gemspec
127
126
  - examples/allocations/byteslice.rb
128
127
  - examples/allocations/memory.rb
@@ -212,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
212
211
  - !ruby/object:Gem::Version
213
212
  version: '0'
214
213
  requirements: []
215
- rubygems_version: 3.1.2
214
+ rubygems_version: 3.0.6
216
215
  signing_key:
217
216
  specification_version: 4
218
217
  summary: Provides support for asynchonous TCP, UDP, UNIX and SSL sockets.
data/Rakefile DELETED
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
5
-
6
- RSpec::Core::RakeTask.new(:test)
7
-
8
- task :default => :test