jgauffin / Griffin.Framework

Application framework for Business Applications
http://griffinframework.net
168 stars 62 forks source link

Fixed unhandled SemaphoreFullException when messages arrive while ReceiveAsync is still executing #74

Open gribunin opened 8 years ago

gribunin commented 8 years ago

_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
fabianoriccardi commented 4 years ago

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.

Dragan-Juric commented 4 years ago

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

jgauffin commented 4 years ago

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