dotnet / runtime

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.
https://docs.microsoft.com/dotnet/core/
MIT License
15.19k stars 4.72k forks source link

BufferedFileStreamStrategy.ReadAsync throws Arg_InvalidOperationException when EnableLLVM == true #104167

Open jamescrosswell opened 8 months ago

jamescrosswell commented 8 months ago

Android application type

.NET Android (net7.0-android, net8.0-android, etc.)

Affected platform version

.NET 8.0.0

Description

We have a customer using the Sentry SDK in their MAUI application. One piece of functionality they've built sends log files through to a Sentry server. A background task in the Sentry API is calling FileStream.ReadAsync to enable this.

If the application is compiled with the build property <EnableLLVM>true</EnableLLVM> then frequently the logs are not sent to Sentry. Trawling through the diagnostic logs, it appears the BufferedFileStreamStrategy.ReadAsync method is throwing an Arg_InvalidOperationException, but it's not clear why.

See full discussion (including the source code to an app that allows this issue to be reproduced) at:

Steps to Reproduce

Steps to reproduce described here.

Did you find any workaround?

No. The customer needs to enable EnableLLVM for performance reasons.

Relevant log output

2024-02-15 14:50:56.008  9130-9159  DOTNET                  com.companyname.sentrydebughelper    I    Debug: Android: Serializing object: {     "reportType": "SendLogs" }
2024-02-15 14:50:56.010  9130-9209  DOTNET                  com.companyname.sentrydebughelper    I  Warning: Failed to serialize envelope item
                                                                                                    System.InvalidOperationException: Arg_InvalidOperationException
2024-02-15 14:50:56.010  9130-9209  DOTNET                  com.companyname.sentrydebughelper    I     at System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1[[System.Int64, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].GetStatus(Int16 )
                                                                                                       at Microsoft.Win32.SafeHandles.SafeFileHandle.ThreadPoolValueTaskSource.GetStatus(Int16 )
                                                                                                       at System.IO.Strategies.BufferedFileStreamStrategy.ReadAsync(Byte[] , Int32 , Int32 , CancellationToken )
2024-02-15 14:50:56.010  9130-9209  DOTNET                  com.companyname.sentrydebughelper    I     at System.IO.FileStream.ReadAsync(Byte[] , Int32 , Int32 , CancellationToken )
                                                                                                       at Sentry.Internal.PartialStream.ReadAsync(Byte[] , Int32 , Int32 , CancellationToken )
2024-02-15 14:50:56.010  9130-9209  DOTNET                  com.companyname.sentrydebughelper    I     at System.IO.Stream.<CopyToAsync>g__Core|27_0(Stream , Stream , Int32 , CancellationToken )
                                                                                                       at Sentry.Protocol.Envelopes.EnvelopeItem.BufferPayloadAsync(IDiagnosticLogger , CancellationToken )
                                                                                                       at Sentry.Protocol.Envelopes.EnvelopeItem.SerializeAsync(Stream , IDiagnosticLogger , CancellationToken )
2024-02-15 14:50:56.010  9130-9209  DOTNET                  com.companyname.sentrydebughelper    I     at Sentry.Protocol.Envelopes.Envelope.SerializeAsync(Stream , IDiagnosticLogger , ISystemClock , CancellationToken )
vargaz commented 8 months ago

Is this reproducible with a sample which just calls FileStream.ReadAsync ?

jamescrosswell commented 7 months ago

Is this reproducible with a sample which just calls FileStream.ReadAsync ?

@pierre-galaup do you think you could try to create a simplified version of your demo app that has LLVM enabled and loops to try to read some files (async) and stream these off into the void (just as a way to verify this is genuinely coming from FileStream.ReadAsync when LLVM is enabled)? If not, I might be able to try but I can't prioritise this right now (it will be some weeks before I can do this).

tranb3r commented 5 months ago

@jamescrosswell @vargaz @pierre-galaup I'm having the same issue with Sentry when enabling LLVM. I've easily reproduced it in a sample app which just calls FileStream.ReadAsync. Could this be fixed? Is there a workaround?

tranb3r commented 5 months ago

Here is a repro project: https://github.com/tranb3r/Issues/tree/main/MauiAppLlvmReadAsync cc @vargaz

tranb3r commented 4 months ago

@grendello @vargaz @lamdageek Any update? This is impacting the Sentry SDK, and no workaround seems possible.

lambdageek commented 4 months ago

/cc @steveisok

steveisok commented 4 months ago

@grendello @vargaz @lamdageek Any update? This is impacting the Sentry SDK, and no workaround seems possible.

@tranb3r no update yet. We'll share when we have more details.

lambdageek commented 4 months ago

Might be related to https://github.com/dotnet/runtime/issues/100527 we should try the upcoming servicing release to see if the AOT compiler fixes there will address this one, too

tranb3r commented 3 months ago

I've tested 8.0.7 but I still get the error when running my repro app. Could somebody please double-check?

fanyang-mono commented 3 months ago

@tranb3r Thanks for validating. We would need to look into it further.

tranb3r commented 2 months ago

Any update? Thanks

tranb3r commented 2 weeks ago

Still not working in net9-rc2.