Avoid torn reads from _frame.MinReadBodyDataRate in FrameConnection.Tick().

This commit is contained in:
Cesar Blum Silveira 2017-06-30 12:22:31 -07:00 committed by GitHub
parent f2061ed716
commit 68ba9a9445
1 changed files with 6 additions and 3 deletions

View File

@ -283,16 +283,19 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal
{ {
if (_readTimingEnabled) if (_readTimingEnabled)
{ {
// Reference in local var to avoid torn reads in case the min rate is changed via IHttpMinRequestBodyDataRateFeature
var minRequestBodyDataRate = _frame.MinRequestBodyDataRate;
_readTimingElapsedTicks += timestamp - _lastTimestamp; _readTimingElapsedTicks += timestamp - _lastTimestamp;
if (_frame.MinRequestBodyDataRate?.BytesPerSecond > 0 && _readTimingElapsedTicks > _frame.MinRequestBodyDataRate.GracePeriod.Ticks) if (minRequestBodyDataRate?.BytesPerSecond > 0 && _readTimingElapsedTicks > minRequestBodyDataRate.GracePeriod.Ticks)
{ {
var elapsedSeconds = (double)_readTimingElapsedTicks / TimeSpan.TicksPerSecond; var elapsedSeconds = (double)_readTimingElapsedTicks / TimeSpan.TicksPerSecond;
var rate = Interlocked.Read(ref _readTimingBytesRead) / elapsedSeconds; var rate = Interlocked.Read(ref _readTimingBytesRead) / elapsedSeconds;
if (rate < _frame.MinRequestBodyDataRate.BytesPerSecond && !Debugger.IsAttached) if (rate < minRequestBodyDataRate.BytesPerSecond && !Debugger.IsAttached)
{ {
Log.RequestBodyMininumDataRateNotSatisfied(_context.ConnectionId, _frame.TraceIdentifier, _frame.MinRequestBodyDataRate.BytesPerSecond); Log.RequestBodyMininumDataRateNotSatisfied(_context.ConnectionId, _frame.TraceIdentifier, minRequestBodyDataRate.BytesPerSecond);
Timeout(); Timeout();
} }
} }