async-io 1.27.5 → 1.27.6

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