diff options
author | Jens Geyer <jensg@apache.org> | 2021-04-15 16:48:21 +0200 |
---|---|---|
committer | Jens Geyer <jensg@apache.org> | 2021-04-15 19:05:24 +0200 |
commit | d4e1eb98525faffafdba4f36f44e3e7382cc0fd0 (patch) | |
tree | b23eae2e77e7ab52030e9ec1bd3d1cfa0307454d /lib/netstd | |
parent | 430e540ef99b2072125897ff6a666b9ec679926f (diff) | |
download | thrift-d4e1eb98525faffafdba4f36f44e3e7382cc0fd0.tar.gz |
THRIFT-5398 ThreadPoolServer not stoppable via CancellationToken
Client: netstd
Patch: Jens Geyer
This closes #2376
Diffstat (limited to 'lib/netstd')
3 files changed, 12 insertions, 15 deletions
diff --git a/lib/netstd/Thrift/Server/TThreadPoolAsyncServer.cs b/lib/netstd/Thrift/Server/TThreadPoolAsyncServer.cs index 20e659d3a..877d595e6 100644 --- a/lib/netstd/Thrift/Server/TThreadPoolAsyncServer.cs +++ b/lib/netstd/Thrift/Server/TThreadPoolAsyncServer.cs @@ -172,19 +172,21 @@ namespace Thrift.Server if (ServerEventHandler != null) await ServerEventHandler.PreServeAsync(cancellationToken); - while (!stop) + while (!(stop || ServerCancellationToken.IsCancellationRequested)) { - int failureCount = 0; try { TTransport client = await ServerTransport.AcceptAsync(cancellationToken); ThreadPool.QueueUserWorkItem(this.Execute, client); } + catch (TaskCanceledException) + { + stop = true; + } catch (TTransportException ttx) { if (!stop || ttx.Type != TTransportException.ExceptionType.Interrupted) { - ++failureCount; LogError(ttx.ToString()); } diff --git a/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs b/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs index 307b7f8a1..35a037da7 100644 --- a/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs +++ b/lib/netstd/Thrift/Transport/Server/TNamedPipeServerTransport.cs @@ -264,6 +264,11 @@ namespace Thrift.Transport.Server Close(); throw; } + catch (TaskCanceledException) + { + Close(); + throw; // let it bubble up + } catch (Exception e) { Close(); diff --git a/lib/netstd/Thrift/Transport/Server/TServerTransport.cs b/lib/netstd/Thrift/Transport/Server/TServerTransport.cs index eee50fb5a..5366114b0 100644 --- a/lib/netstd/Thrift/Transport/Server/TServerTransport.cs +++ b/lib/netstd/Thrift/Transport/Server/TServerTransport.cs @@ -36,19 +36,9 @@ namespace Thrift.Transport public abstract void Close(); public abstract bool IsClientPending(); - protected virtual async ValueTask<TTransport> AcceptImplementationAsync() - { - return await AcceptImplementationAsync(CancellationToken.None); - } - - protected abstract ValueTask<TTransport> AcceptImplementationAsync(CancellationToken cancellationToken); - - public async ValueTask<TTransport> AcceptAsync() - { - return await AcceptAsync(CancellationToken.None); - } + protected abstract ValueTask<TTransport> AcceptImplementationAsync(CancellationToken cancellationToken = default); - public async ValueTask<TTransport> AcceptAsync(CancellationToken cancellationToken) + public async ValueTask<TTransport> AcceptAsync(CancellationToken cancellationToken = default) { var transport = await AcceptImplementationAsync(cancellationToken); |