Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed deadlock during offline start. #3959

Closed
wants to merge 1 commit into from

Conversation

molind
Copy link

@molind molind commented May 8, 2024

📜 Description

See details in #3956

💡 Motivation and Context

Sentry deadlocked during offline startup.

💚 How did you test it?

I've added sleep into the crash wrapper. And when background thread tried to send envelope it locked SentrySdk @synchronized(self).

- (NSDictionary *)systemInfo
{
    static NSDictionary *sharedInfo = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,
                  ^{
        sleep(5);
        sharedInfo = SentryDependencyContainer.sharedInstance.crashReporter.systemInfo;
    });
    return sharedInfo;
}

📝 Checklist

You have to check all boxes before merging:

  • I reviewed the submitted code.
  • I added tests to verify the changes.
  • No new PII added or SDK only sends newly added PII if sendDefaultPII is enabled.
  • I updated the docs if needed.
  • Review from the native team if needed.
  • No breaking change or entry added to the changelog.
  • No breaking change for hybrid SDKs or communicated to hybrid SDKs.

🔮 Next steps

@molind molind changed the title While hub is not configured. It makes no sense to send anything. Fixed deadlock during offline start. May 8, 2024
Comment on lines -76 to -78
if (nil == currentHub) {
currentHub = [[SentryHub alloc] initWithClient:nil andScope:nil];
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

h: We cant remove this right now. It will break a lot of tests, we need to find another solution.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you explain motivation behind this?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it'll try to send envelopes to that hub, they'll be just dropped. And transport should wait for a hub with a client to send something.
May be we could check scope, before enrich it.

if (scope)
        [SentryDependencyContainer.sharedInstance.crashWrapper enrichScope:scope];

But that's strange solution and it could happen again in different part of code. Sentry should try to send something only when SentrySDK start finishes. With changes from this PR it's guaranteed.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you explain motivation behind this?

This was probably put in place to make writing tests easier.
As you can see, all unit tests are broken right now.
But I agree that we need to check if the SDK is initialized before starting to use the hub.

@molind
Copy link
Author

molind commented May 8, 2024

I've checked 8.21, when it worked without issues.

It creates SentryHub without enriching scope:

- (instancetype)initWithClient:(nullable SentryClient *)client
                      andScope:(nullable SentryScope *)scope
{
    if (self = [super init]) {
        _client = client;
        _scope = scope;
        _sessionLock = [[NSObject alloc] init];
        _integrationsLock = [[NSObject alloc] init];
        _installedIntegrations = [[NSMutableArray alloc] init];
        _installedIntegrationNames = [[NSMutableSet alloc] init];
        _crashWrapper = [SentryCrashWrapper sharedInstance];
        _errorsBeforeSession = 0;
    }
    return self;
}

And there is no systemInfo call and no deadlock.

@philipphofmann
Copy link
Member

Thanks for all the context in this PR and in #3956, which helped us reproduce the issue. As this PR is only a workaround and doesn't fix the underlying issue, I opened #3970 to fix the underlying issue. We can close this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants