[ https://issues.apache.org/jira/browse/THRIFT-5830?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17895803#comment-17895803 ]
Jens Geyer commented on THRIFT-5830: ------------------------------------ You could sketch the idea and/or implement a proof of concept and I could do the compiler changes part. Would that help? > Using THttpTransport using interleaved asynchronous calls may throw exception > ----------------------------------------------------------------------------- > > Key: THRIFT-5830 > URL: https://issues.apache.org/jira/browse/THRIFT-5830 > Project: Thrift > Issue Type: Bug > Components: netstd - Library > Affects Versions: 0.21.0 > Environment: See this PR to remove interleaved asynchronous calls to > work-around the issue. > [fix(csharp/src/Drivers/Apache): remove interleaved async look-ahead code by > birschick-bq · Pull Request #2273 · > apache/arrow-adbc|https://github.com/apache/arrow-adbc/pull/2273] > Reporter: Bruce Irschick > Priority: Major > > When using the THttpTransport, interleaved asynchronous calls can cause the > following exception: > {code:java} > System.AggregateException : One or more errors occurred. (Couldn't connect to > server: System.Net.Http.HttpRequestException: Error while copying content to > a stream. > ---> System.ObjectDisposedException: Cannot access a closed Stream.{code} > > Essentially, the *THttpTransport._outputStream* can get disposed while > another asynchronous call is running. > This is due to allocating the _outputStream at the class level. The stream > should be allocated on a call-by-call basis. > > {code:java} > Apache.Arrow.Adbc.Tests.Drivers.Apache.Spark.DriverTests.CanExecuteUpdate > Source: DriverTests.cs line 90 > Duration: 1.8 sec > Message: > System.AggregateException : One or more errors occurred. (Couldn't connect to > server: System.Net.Http.HttpRequestException: Error while copying content to > a stream. > ---> System.ObjectDisposedException: Cannot access a closed Stream. > at System.IO.MemoryStream.CopyToAsync(Stream destination, Int32 > bufferSize, CancellationToken cancellationToken) > at System.Net.Http.StreamToStreamCopy.CopyAsync(Stream source, Stream > destination, Int32 bufferSize, Boolean disposeSource, CancellationToken > cancellationToken) > --- End of stack trace from previous location --- > at System.Net.Http.HttpContent.<CopyToAsync>g__WaitAsync|56_0(ValueTask > copyTask) > --- End of inner exception stack trace --- > at System.Net.Http.HttpContent.<CopyToAsync>g__WaitAsync|56_0(ValueTask > copyTask) > at > System.Net.Http.HttpConnection.SendRequestContentAsync(HttpRequestMessage > request, HttpContentWriteStream stream, Boolean async, CancellationToken > cancellationToken) > at System.Net.Http.HttpConnection.SendAsync(HttpRequestMessage request, > Boolean async, CancellationToken cancellationToken) > at System.Net.Http.HttpConnection.SendAsync(HttpRequestMessage request, > Boolean async, CancellationToken cancellationToken) > at > System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage > request, Boolean async, Boolean doRequestAuth, CancellationToken > cancellationToken) > at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, > Boolean async, CancellationToken cancellationToken) > at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage > request, HttpCompletionOption completionOption, CancellationTokenSource cts, > Boolean disposeCts, CancellationTokenSource pendingRequestsCts, > CancellationToken originalCancellationToken) > at Thrift.Transport.Client.THttpTransport.FlushAsync(CancellationToken > cancellationToken)) > ---- Thrift.Transport.TTransportException : Couldn't connect to server: > System.Net.Http.HttpRequestException: Error while copying content to a stream. > ---> System.ObjectDisposedException: Cannot access a closed Stream. > at System.IO.MemoryStream.CopyToAsync(Stream destination, Int32 > bufferSize, CancellationToken cancellationToken) > at System.Net.Http.StreamToStreamCopy.CopyAsync(Stream source, Stream > destination, Int32 bufferSize, Boolean disposeSource, CancellationToken > cancellationToken) > --- End of stack trace from previous location --- > at System.Net.Http.HttpContent.<CopyToAsync>g__WaitAsync|56_0(ValueTask > copyTask) > --- End of inner exception stack trace --- > at System.Net.Http.HttpContent.<CopyToAsync>g__WaitAsync|56_0(ValueTask > copyTask) > at > System.Net.Http.HttpConnection.SendRequestContentAsync(HttpRequestMessage > request, HttpContentWriteStream stream, Boolean async, CancellationToken > cancellationToken) > at System.Net.Http.HttpConnection.SendAsync(HttpRequestMessage request, > Boolean async, CancellationToken cancellationToken) > at System.Net.Http.HttpConnection.SendAsync(HttpRequestMessage request, > Boolean async, CancellationToken cancellationToken) > at > System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage > request, Boolean async, Boolean doRequestAuth, CancellationToken > cancellationToken) > at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, > Boolean async, CancellationToken cancellationToken) > at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage > request, HttpCompletionOption completionOption, CancellationTokenSource cts, > Boolean disposeCts, CancellationTokenSource pendingRequestsCts, > CancellationToken originalCancellationToken) > at Thrift.Transport.Client.THttpTransport.FlushAsync(CancellationToken > cancellationToken) > Stack Trace: > Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) > Task`1.GetResultCore(Boolean waitCompletionNotification) > HiveServer2Statement.ExecuteUpdate() line 39 > DriverTests.CanExecuteUpdate() line 122 > RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature > sig, Boolean isConstructor) > MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) > ----- Inner Stack Trace ----- > THttpTransport.FlushAsync(CancellationToken cancellationToken) > Client.send_ExecuteStatement(TExecuteStatementReq req, CancellationToken > cancellationToken) line 240 > Client.ExecuteStatement(TExecuteStatementReq req, CancellationToken > cancellationToken) line 226 > HiveServer2Statement.ExecuteStatementAsync() line 116 > HiveServer2Statement.ExecuteQueryAsync() line 43 > HiveServer2Statement.ExecuteUpdateAsync() line 61 > {code} > -- This message was sent by Atlassian Jira (v8.20.10#820010)