You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@thrift.apache.org by "Jens Geyer (Jira)" <ji...@apache.org> on 2026/09/27 10:29:00 UTC
[jira] [Resolved] (THRIFT-6375) netstd tutorial client runs all -mc clients over one shared transport and protocol
[ https://issues.apache.org/jira/browse/THRIFT-6375?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jens Geyer resolved THRIFT-6375.
--------------------------------
Fix Version/s: 0.26.0
Assignee: Jens Geyer
Resolution: Fixed
> netstd tutorial client runs all -mc clients over one shared transport and protocol
> ----------------------------------------------------------------------------------
>
> Key: THRIFT-6375
> URL: https://issues.apache.org/jira/browse/THRIFT-6375
> Project: Thrift
> Issue Type: Bug
> Components: netstd - Library, Tutorial
> Affects Versions: 0.24.0
> Reporter: Jens Geyer
> Assignee: Jens Geyer
> Priority: Minor
> Fix For: 0.26.0
>
> Time Spent: 20m
> Remaining Estimate: 0h
>
> With {{\-mc:<n>}} the netstd tutorial client is meant to run _n_ clients against the server; the tutorial README's sample is {{Client \-tr:tcp \-pr:binary \-mc:10}}. With more than one client, none of them completes its calls. {{RunAsync()}} ([Client/Program.cs:125-140|https://github.com/apache/thrift/blob/bcdf956895aeac5411ce3029ab8b33901b7c7a36/tutorial/netstd/Client/Program.cs#L125-L140]) creates one transport and one protocol and hands that same protocol to every {{RunClientAsync()}} task. All clients then write to, read from and finally close the one transport at the same time, through one shared protocol instance.
> ||Client||Runs||Result||
> |{{\-tr:tcp \-mc:1}}|1|all calls complete|
> |{{\-tr:tcp \-mc:2}}|1|both clients fail: "Cannot read, Remote side has closed"|
> |{{\-tr:tcp \-mc:5}}|3|no client completes. One run hung until it was killed after 60 s. The others failed with "Cannot read, Remote side has closed", or with "MaxMessageSize reached" and {{IOException}}s from cancelled reads.|
> |{{\-tr:tcp \-mc:10}}|2|all 10 clients fail: "Cannot read, Remote side has closed"|
> |{{\-tr:http \-mc:5}}|3|no client completes: four fail with "Sent 0 request content bytes, but Content-Length promised 17." and one with "The operation was canceled."|
> The server ran with the same {{\-tr}} value. For HTTP it needed the one-line fix from THRIFT-6374, because the tutorial's HTTP server does not start as it is. Apart from the hung run, the client exits with 0 every time, because {{RunClientAsync()}} logs the exception and returns.
> Checked on master (bcdf956) with the .NET 10.0.401 SDK, server and client in one container, binary protocol. The tutorial code is the same on master, release/0.25.0 and release/0.24.0.
> Commit 0d12832d ("misc. netstd improvements", 2021) replaced the per-client arrays of transports and protocols with this single pair. Creating a transport and a protocol for each client inside the loop again fixes it: with that change every client completes, with {{\-tr:tcp \-mc:10}} (2 runs) as well as with {{\-tr:http}} at {{\-mc:5}} and {{\-mc:10}}.
> _Drafted with AI assistance (Claude Opus 5.5)._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)