Azure / Azure/DotNetty

Environment.TickCount wrap around problem in IdleStateHandler

Open
#580 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C#
Stars
4.3k
Forks
1k
PR merge metrics
No merged PRs in 30d

Description

https://docs.microsoft.com/en-us/dotnet/api/system.environment.tickcount?view=netframework-4.7.2#remarks

Environment.TickCount wrap around problem may occur if server startup time is around 24.9 days
So IdleStateHandler won't trigger idle event

Example:
```C#
static void HandleReadTimeout(IdleStateHandler self, IChannelHandlerContext context)
{
TimeSpan nextDelay = self.readerIdleTime;

if (!self.reading)
{
// TimeSpan.FromSeconds(30) - (TimeSpan.FromMilliseconds(-2128993450)-TimeSpan.FromMilliseconds(2147461190));
nextDelay -= self.Ticks() - self.lastReadTime;
}

// nextDelay is 49.11:54:44.6400000
if (nextDelay.Ticks <= 0)
{
// Reader is idle - set a new timeout and notify the callback.
self.readerIdleTimeout =
self.Schedule(context, ReadTimeoutAction, self, context,
self.readerIdleTime);

bool first = self.firstReaderIdleEvent;
self.firstReaderIdleEvent = false;

try
{
IdleStateEvent stateEvent = self.NewIdleStateEvent(IdleState.ReaderIdle, first);
self.ChannelIdle(context, stateEvent);
}
catch (Exception ex)
{
context.FireExceptionCaught(ex);
}
}
else
{
// will shedule ReadTimeoutAction after 49.11:54:44.6400000
self.readerIdleTimeout = self.Schedule(context, ReadTimeoutAction, self, context,
nextDelay);
}
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.