Griffin.Framework icon indicating copy to clipboard operation
Griffin.Framework copied to clipboard

Fixed unhandled SemaphoreFullException when messages arrive while ReceiveAsync is still executing

Open gribunin opened this issue 7 years ago • 3 comments

_readSemaphore has been replaced with _readEvent, because an event can be safely Set multiple times in a row, while semaphore can be unintentionally Release'ed beyond its maximum level. When server sends messages faster than the client reads, and OnChannelMessageReceived is called while ReceiveAsync is still executing, the _readSemaphore is Release'ed twice -- first in on OnChannelMessageReceived, then second time at the end of ReceiveAsync (because readItems.Count > 0) which lead to unhandled SemaphoreFullException in ReceiveAsync

The offending data flow:

  1. OnChannelMessageReceived (readSemaphore.Release()) ----- readSemaphore.Count == 1
  2. WaitOne is triggered at the beginning of ReceiveAsync ----- readSemaphore.Count == 0
  3. Another OnChannelMessageReceived (readSemaphore.Release()) --- readSemaphoreCount == 1
  4. End of ReceiveAsync (if (_readItems.Count > 0) readSemaphore.Release()) -- readSemaphoreCount == 2 -- SemaphoreFullException

gribunin avatar Aug 12 '16 19:08 gribunin

Any news about this pull request? I had experienced the same problem while testing my webserver with jMeter.

I made a quick and dirty fix removing this line But I don't know any possible consequences.

fabianoriccardi avatar Oct 29 '19 09:10 fabianoriccardi

Hello, I have the same problem, is there any update on this?

Dragan-Juric avatar Dec 20 '19 16:12 Dragan-Juric

I'm working on a new network stack. Completely async and rewritten from scratch.

jgauffin avatar Jan 11 '20 10:01 jgauffin