Skip to content
This repository was archived by the owner on Aug 29, 2024. It is now read-only.
This repository was archived by the owner on Aug 29, 2024. It is now read-only.

v1.23.0 breaks README example #26

@tonytonyjan

Description

@tonytonyjan

The example:

require 'async/io'

def echo_server(endpoint)
	Async do |task|
		# This is a synchronous block within the current task:
		endpoint.accept do |client|
			# This is an asynchronous block within the current reactor:
			data = client.read(512)
			
			# This produces out-of-order responses.
			task.sleep(rand * 0.01)
			
			client.write(data.reverse)
		end
	end
end

def echo_client(endpoint, data)
	Async do |task|
		endpoint.connect do |peer|
			result = peer.write(data)
			
			message = peer.read(512)
			
			puts "Sent #{data}, got response: #{message}"
		end
	end
end

Async do
	endpoint = Async::IO::Endpoint.tcp('0.0.0.0', 9000)
	
	server = echo_server(endpoint)
	
	5.times.collect do |i|
		echo_client(endpoint, "Hello World #{i}")
	end.each(&:wait)
	
	server.stop
end

The output with rsync-io v1.22.0:

Sent Hello World 2, got response: 2 dlroW olleH
Sent Hello World 0, got response: 0 dlroW olleH
Sent Hello World 1, got response: 1 dlroW olleH
Sent Hello World 3, got response: 3 dlroW olleH
Sent Hello World 4, got response: 4 dlroW olleH

With v1.23.0, this example hangs, waiting for incoming data from client, while client has nothing to send.

It could have something to do whit this commit:

38cbf08#diff-0bd25964d6d64dbffce9d542ba85a492R110

Since all the data has been read during fast path, the secondsysread would never receive new data and block forever.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions