amplify-swift icon indicating copy to clipboard operation
amplify-swift copied to clipboard

Data Race - Thread Sanitizer

Open popwarfour opened this issue 9 months ago • 4 comments

Describe the bug

Seeing data race conditions

Steps To Reproduce

1) Enable Thread Sanitization in scheme setting 
2) Setup Auth

Expected behavior

I should not be seeing data race conditions within the library

Amplify Framework Version

2.25.4

Amplify Categories

Auth

Dependency manager

Swift PM

Swift version

5.9

CLI version

12.10.3

Xcode version

15.3

Relevant log output

WARNING: ThreadSanitizer: data race (pid=4687)
  Write of size 1 at 0x0001473827f9 by thread T29:
    #0 ClientRuntime.HttpResponse.statusCode.setter : ClientRuntime.HttpStatusCode <null> (MyApp:arm64+0x105d7db0c)
    #1 closure #6 (Swift.Result<Swift.UInt32, AwsCommonRuntimeKit.CommonRunTimeError>) -> () in ClientRuntime.CRTClientEngine.(makeHttpRequestStreamOptions in _91B07933650E8EA49FB320ECA4DED537)(request: AwsCommonRuntimeKit.HTTPRequestBase, continuation: Swift.CheckedContinuation<ClientRuntime.HttpResponse, Swift.Error>, http2ManualDataWrites: Swift.Bool) -> AwsCommonRuntimeKit.HTTPRequestOptions <null> (MyApp:arm64+0x105d67298)
    #2 partial apply forwarder for closure #6 (Swift.Result<Swift.UInt32, AwsCommonRuntimeKit.CommonRunTimeError>) -> () in ClientRuntime.CRTClientEngine.(makeHttpRequestStreamOptions in _91B07933650E8EA49FB320ECA4DED537)(request: AwsCommonRuntimeKit.HTTPRequestBase, continuation: Swift.CheckedContinuation<ClientRuntime.HttpResponse, Swift.Error>, http2ManualDataWrites: Swift.Bool) -> AwsCommonRuntimeKit.HTTPRequestOptions <null> (MyApp:arm64+0x105d68600)
    #3 AwsCommonRuntimeKit.(onComplete in _BEB8F7D4C37A431780FEA5A42770A7B4)(stream: Swift.Optional<Swift.UnsafeMutablePointer<__C.aws_http_stream>>, errorCode: Swift.Int32, userData: Swift.Optional<Swift.UnsafeMutableRawPointer>) -> () <null> (MyApp:arm64+0x1056b9d4c)
    #4 @objc AwsCommonRuntimeKit.(onComplete in _BEB8F7D4C37A431780FEA5A42770A7B4)(stream: Swift.Optional<Swift.UnsafeMutablePointer<__C.aws_http_stream>>, errorCode: Swift.Int32, userData: Swift.Optional<Swift.UnsafeMutableRawPointer>) -> () <null> (MyApp:arm64+0x1056b99e4)
    #5 s_stream_complete <null> (MyApp:arm64+0x1058249f0)
    #6 s_decoder_on_done <null> (MyApp:arm64+0x10582d248)
    #7 s_mark_done <null> (MyApp:arm64+0x105833b48)
    #8 s_state_unchunked_body <null> (MyApp:arm64+0x10583468c)
    #9 aws_h1_decode <null> (MyApp:arm64+0x10582eacc)
    #10 s_try_process_next_stream_read_message <null> (MyApp:arm64+0x1058210b4)
    #11 aws_h1_connection_try_process_read_messages <null> (MyApp:arm64+0x10581f9ec)
    #12 s_handler_process_read_message <null> (MyApp:arm64+0x1058277c8)
    #13 aws_channel_handler_process_read_message <null> (MyApp:arm64+0x105798414)
    #14 aws_channel_slot_send_message <null> (MyApp:arm64+0x105797de0)
    #15 s_process_read_message <null> (MyApp:arm64+0x1057b0168)
    #16 aws_channel_handler_process_read_message <null> (MyApp:arm64+0x105798414)
    #17 aws_channel_slot_send_message <null> (MyApp:arm64+0x105797de0)
    #18 s_do_read <null> (MyApp:arm64+0x1057f90d8)
    #19 s_on_readable_notification <null> (MyApp:arm64+0x1057f75dc)
    #20 s_on_socket_io_event <null> (MyApp:arm64+0x1057f043c)
    #21 aws_event_loop_thread <null> (MyApp:arm64+0x105790614)
    #22 thread_fn <null> (MyApp:arm64+0x105753578)

  Previous read of size 1 at 0x0001473827f9 by thread T52:
    #0 ClientRuntime.HttpResponse.statusCode.getter : ClientRuntime.HttpStatusCode <null> (MyApp:arm64+0x105d7daa0)
    #1 (3) suspend resume partial function for ClientRuntime.DeserializeMiddleware.handle<A where A1: ClientRuntime.Handler, A1.Context == ClientRuntime.HttpContext, A1.Input == ClientRuntime.SdkHttpRequest, A1.Output == ClientRuntime.OperationOutput<A>>(context: ClientRuntime.HttpContext, input: ClientRuntime.SdkHttpRequest, next: A1) async throws -> ClientRuntime.OperationOutput<A> <null> (MyApp:arm64+0x105d895c8)
    #2 swift::runJobInEstablishedExecutorContext(swift::Job*) <null> (libswift_Concurrency.dylib:arm64+0x38108)

  Location is heap block of size 42 at 0x0001473827d0 allocated by thread T52:
    #0 malloc <null> (libclang_rt.tsan_iossim_dynamic.dylib:arm64+0x4fa48)
    #1 _malloc_type_malloc_outlined <null> (libsystem_malloc.dylib:arm64+0xf0d0)
    #2 ClientRuntime.CRTClientEngine.(makeHttpRequestStreamOptions in _91B07933650E8EA49FB320ECA4DED537)(request: AwsCommonRuntimeKit.HTTPRequestBase, continuation: Swift.CheckedContinuation<ClientRuntime.HttpResponse, Swift.Error>, http2ManualDataWrites: Swift.Bool) -> AwsCommonRuntimeKit.HTTPRequestOptions <null> (MyApp:arm64+0x105d65928)
    #3 closure #1 (Swift.CheckedContinuation<ClientRuntime.HttpResponse, Swift.Error>) -> () in ClientRuntime.CRTClientEngine.execute(request: ClientRuntime.SdkHttpRequest) async throws -> ClientRuntime.HttpResponse <null> (MyApp:arm64+0x105d61e24)
    #4 partial apply forwarder for closure #1 (Swift.CheckedContinuation<ClientRuntime.HttpResponse, Swift.Error>) -> () in ClientRuntime.CRTClientEngine.execute(request: ClientRuntime.SdkHttpRequest) async throws -> ClientRuntime.HttpResponse <null> (MyApp:arm64+0x105d6250c)
    #5 merged closure #1 (Swift.UnsafeContinuation<A, Swift.Never>) -> () in Swift.withCheckedContinuation<A>(function: Swift.String, _: (Swift.CheckedContinuation<A, Swift.Never>) -> ()) async -> A <null> (libswift_Concurrency.dylib:arm64+0x5740)

  Thread T29 (tid=62930512, running) created by thread T10 at:
    #0 pthread_create <null> (libclang_rt.tsan_iossim_dynamic.dylib:arm64+0x2bee4)
    #1 aws_thread_launch <null> (MyApp:arm64+0x105752d0c)
    #2 s_run <null> (MyApp:arm64+0x10578c474)
    #3 aws_event_loop_run <null> (MyApp:arm64+0x1057b71c0)
    #4 s_event_loop_group_new <null> (MyApp:arm64+0x1057b4f70)
    #5 aws_event_loop_group_new <null> (MyApp:arm64+0x1057b49d4)
    #6 aws_event_loop_group_new_default <null> (MyApp:arm64+0x1057b51c8)
    #7 closure #1 (Swift.UnsafePointer<__C.aws_shutdown_callback_options>) -> Swift.Optional<Swift.UnsafeMutablePointer<__C.aws_event_loop_group>> in closure #1 () -> Swift.Optional<Swift.UnsafeMutablePointer<__C.aws_event_loop_group>> in AwsCommonRuntimeKit.EventLoopGroup.init(threadCount: Swift.UInt16, shutdownCallback: Swift.Optional<() -> ()>) throws -> AwsCommonRuntimeKit.EventLoopGroup <null> (MyApp:arm64+0x1056bcbec)
    #8 partial apply forwarder for closure #1 (Swift.UnsafePointer<__C.aws_shutdown_callback_options>) -> Swift.Optional<Swift.UnsafeMutablePointer<__C.aws_event_loop_group>> in closure #1 () -> Swift.Optional<Swift.UnsafeMutablePointer<__C.aws_event_loop_group>> in AwsCommonRuntimeKit.EventLoopGroup.init(threadCount: Swift.UInt16, shutdownCallback: Swift.Optional<() -> ()>) throws -> AwsCommonRuntimeKit.EventLoopGroup <null> (MyApp:arm64+0x1056bcd9c)
    #9 Swift.withUnsafePointer<A, B>(to: A, _: (Swift.UnsafePointer<A>) throws -> B) throws -> B <null> (libswiftCore.dylib:arm64+0x116f24)
    #10 AwsCommonRuntimeKit.EventLoopGroup.init(threadCount: Swift.UInt16, shutdownCallback: Swift.Optional<() -> ()>) throws -> AwsCommonRuntimeKit.EventLoopGroup <null> (MyApp:arm64+0x1056bc780)
    #11 AwsCommonRuntimeKit.EventLoopGroup.__allocating_init(threadCount: Swift.UInt16, shutdownCallback: Swift.Optional<() -> ()>) throws -> AwsCommonRuntimeKit.EventLoopGroup <null> (MyApp:arm64+0x1056bc5c4)
    #12 ClientRuntime.SDKDefaultIO.() -> ClientRuntime.SDKDefaultIO(in _FE859A5DC63535809337AB8A60C1C338).init() -> ClientRuntime.SDKDefaultIO <null> (MyApp:arm64+0x105d6d564)
    #13 ClientRuntime.SDKDefaultIO.__allocating_init() -> ClientRuntime.SDKDefaultIO <null> (MyApp:arm64+0x105d6d310)
    #14 one-time initialization function for shared <null> (MyApp:arm64+0x105d6d288)
    #15 dispatch_once <null> (libclang_rt.tsan_iossim_dynamic.dylib:arm64+0x78d30)
    #16 dispatch_once_f <null> (libclang_rt.tsan_iossim_dynamic.dylib:arm64+0x78dcc)
    #17 ClientRuntime.SDKDefaultIO.shared.unsafeMutableAddressor : ClientRuntime.SDKDefaultIO <null> (MyApp:arm64+0x105d6d3bc)
    #18 AWSClientRuntime.DefaultChainCredentialsProvider.init(fileBasedConfig: AwsCommonRuntimeKit.FileBasedConfiguration) throws -> AWSClientRuntime.DefaultChainCredentialsProvider <null> (MyApp:arm64+0x105599738)
    #19 AWSClientRuntime.AWSClientConfiguration.__allocating_init(region: Swift.String, credentialsProvider: Swift.Optional<AWSClientRuntime.CredentialsProviding>, endpoint: Swift.Optional<Swift.String>, serviceSpecific: Swift.Optional<A>, signingRegion: Swift.Optional<Swift.String>, useDualStack: Swift.Optional<Swift.Bool>, useFIPS: Swift.Optional<Swift.Bool>, retryMode: Swift.Optional<AWSClientRuntime.AWSRetryMode>, maxAttempts: Swift.Optional<Swift.Int>, appID: Swift.Optional<Swift.String>, connectTimeoutMs: Swift.Optional<Swift.UInt32>) throws -> AWSClientRuntime.AWSClientConfiguration<A> <null> (MyApp:arm64+0x10559106c)
    #20 AWSCognitoAuthPlugin.AWSCognitoAuthPlugin.(makeUserPool in _8AB0DFBFCB62BEA0C3EE23AA1F6DBA04)() throws -> AWSCognitoAuthPlugin.CognitoUserPoolBehavior <null> (MyApp:arm64+0x104aee818)
    #21 implicit closure #4 () throws -> AWSCognitoAuthPlugin.CognitoUserPoolBehavior in implicit closure #3 (AWSCognitoAuthPlugin.AWSCognitoAuthPlugin) -> () throws -> AWSCognitoAuthPlugin.CognitoUserPoolBehavior in AWSCognitoAuthPlugin.AWSCognitoAuthPlugin.(authenticationEnvironment in _8AB0DFBFCB62BEA0C3EE23AA1F6DBA04)(userPoolConfigData: AWSCognitoAuthPlugin.UserPoolConfigurationData) -> AWSCognitoAuthPlugin.AuthenticationEnvironment <null> (MyApp:arm64+0x104af1814)
    #22 partial apply forwarder for implicit closure #4 () throws -> AWSCognitoAuthPlugin.CognitoUserPoolBehavior in implicit closure #3 (AWSCognitoAuthPlugin.AWSCognitoAuthPlugin) -> () throws -> AWSCognitoAuthPlugin.CognitoUserPoolBehavior in AWSCognitoAuthPlugin.AWSCognitoAuthPlugin.(authenticationEnvironment in _8AB0DFBFCB62BEA0C3EE23AA1F6DBA04)(userPoolConfigData: AWSCognitoAuthPlugin.UserPoolConfigurationData) -> AWSCognitoAuthPlugin.AuthenticationEnvironment <null> (MyApp:arm64+0x104af79a0)
    #23 (1) suspend resume partial function for AWSCognitoAuthPlugin.AWSAuthFetchUserAttributeTask.getUserAttributes(with: Swift.String) async throws -> Swift.Array<Amplify.AuthUserAttribute> <null> (MyApp:arm64+0x10523de3c)
    #24 swift::runJobInEstablishedExecutorContext(swift::Job*) <null> (libswift_Concurrency.dylib:arm64+0x38108)

  Thread T52 (tid=62931679, running) is a GCD worker thread

SUMMARY: ThreadSanitizer: data race (/Users/andersmelen/Library/Developer/CoreSimulator/Devices/26B50286-E86D-4C5E-BE5C-1B37155233DA/data/Containers/Bundle/Application/765655DB-80F2-4044-AB8F-EDA8230A137E/MyApp.app/MyApp:arm64+0x105d7db0c) in ClientRuntime.HttpResponse.statusCode.setter : ClientRuntime.HttpStatusCode+0x44
==================
ThreadSanitizer report breakpoint hit. Use 'thread info -s' to get extended information about the report.

Is this a regression?

No

Regression additional context

No response

Platforms

No response

OS Version

17.4

Device

iPhone 15 Pro

Specific to simulators

No response

Additional context

No response

popwarfour avatar May 17 '24 13:05 popwarfour