Fix incorrect connection metrics tracking on instances pending shutdown #214
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
While a spectator server instance was pending shutdown, it could start reporting endlessly rising user counts until its actual shutdown. The reason for this was questionable logic in
ConcurrentConnectionLimiter
.When I wrote that thing I used
try...finally
inOnConnectedAsync()
andOnDisconnectedAsync()
because I wanted to have multiple returns in the body of the method and sitll callawait next()
at the end. However I appear to have also forgotten that it means thatawait next()
would be called even if the preceding code threw an exception, and then the exception would be thrown anyway.This in the case of
StatefulUserHub
s led to the following sequence of events:ConcurrentConnectionLimiter.OnConnectedAsync()
firesfinally
, callsawait next()
anywayawait next()
is the hub's connection method, in particularLoggingHub.OnConnectedAsync()
, which increments the datadog connected user gaugeOnDisconnectedAsync()
will not get called for this connection, leading the counter to not decrement back down from the increment in point (3)leading to the runaway increase in reported user counts.
To fix, stop using
try...finally
and split the blocks of code that want early-returns to separate methods instead.