[squeak-dev] Re: [Vm-dev] I would be extremely grateful for a reproducible case for the following Socket issue

Levente Uzonyi leves at caesar.elte.hu
Thu Mar 24 09:16:09 UTC 2016


Hi Eliot,

The snippet below, evaluated from a workspace, triggered the issue in less 
than a minute for me, three times in a row.
Both processes will halt if #sloppyWaitForDataIfClosed: doesn't return 
within a second. If you send #dataAvailable to the socket, you'll find 
that it has data ready to be read, but its readSemaphore has no signal.

Levente


Socket compile: 'sloppyWaitForDataIfClosed: closedBlock

 	[(socketHandle ~~ nil
 	  and: [self primSocketReceiveDataAvailable: socketHandle]) ifTrue:
 		[^self].
 	 self isConnected ifFalse:
 		[^closedBlock value].
 	 self readSemaphore wait] repeat'
classified: 'waiting'.

[
 	listenerSocket := Socket newTCP.
 	listenerSocket listenOn: 0 backlogSize: 4 interface: #[127 0 0 1].
 	clientSocket := Socket newTCP.
 	clientSocket connectTo: #[127 0 0 1] port: listenerSocket localPort.
 	clientSocket waitForConnectionFor: 1.
 	self assert: clientSocket isConnected.
 	serverSocket := listenerSocket waitForAcceptFor: 1.
 	self assert: serverSocket isConnected ]
 	ensure: [ listenerSocket destroy ].

serverProcess := [
 	| shouldRun buffer bytesReceived waitDuration |
 	shouldRun := true.
 	buffer := ByteString new: 10.
 	waitDuration := 1 second.
 	[
 		[ serverSocket sloppyWaitForDataIfClosed: [ shouldRun := 
false ] ]
 			valueWithin: waitDuration
 			onTimeout: [ self halt ].
 		buffer atAllPut: (Character value: 0).
 		bytesReceived := serverSocket receiveDataInto: buffer.
 		self assert: bytesReceived = 4.
 		self assert: (buffer first: 4) = 'PING'.
 		serverSocket sendData: 'PONG' ] repeat ] newProcess.
clientProcess := [
 	| shouldRun buffer bytesReceived waitDuration |
 	shouldRun := true.
 	buffer := ByteString new: 10.
 	waitDuration := 1 second.
 	[
 		clientSocket sendData: 'PING'.
 		[ clientSocket sloppyWaitForDataIfClosed: [ shouldRun := false ] ]
 			valueWithin: waitDuration
 			onTimeout: [ self halt ].
 		buffer atAllPut: (Character value: 0).
 		bytesReceived := clientSocket receiveDataInto: buffer.
 		self assert: bytesReceived = 4.
 		self assert: (buffer first: 4) = 'PONG' ] repeat ] newProcess.
clientProcess priority: 39; resume.
serverProcess priority: 39; resume.

"Evaluate these after debugging:
clientSocket destroy.
serverSocket destroy."


On Wed, 23 Mar 2016, Eliot Miranda wrote:

> Hi Levente,
> On Wed, Mar 23, 2016 at 11:31 AM, Levente Uzonyi <leves at caesar.elte.hu> wrote:
>       Hi Eliot,
>
>       What sort of reproducibility are you looking for? Is it enough if it happens once every few hours or do you need something that you can trigger on demand?
> 
> 
> I'll take every few hours, but I'd prefer "in under 30 minutes".  Getting warm and fuzzy feelings when trying to prove a negative with something that takes hours to run is very difficult.  Let's say you have
> a case which reproduces in 8 hours 50% of the time.  To reach 99% confidence level in a fix I'd have to run it for 8 * (50 log: 2) hours without seeing it reproduce, right?  That's nearly 2 days; it could
> take weeks to fix :-(
>
>       Levente
> 
> 
> 
> _,,,^..^,,,_
> best, Eliot
> 
>


More information about the Vm-dev mailing list