Skip to content

[Galaxy]: Fix race condition when fetching Galaxy products#3213

Merged
fire-at-will merged 4 commits into
mainfrom
galaxy/set-product-handler-request-before-request-is-sent
Mar 13, 2026
Merged

[Galaxy]: Fix race condition when fetching Galaxy products#3213
fire-at-will merged 4 commits into
mainfrom
galaxy/set-product-handler-request-before-request-is-sent

Conversation

@fire-at-will

@fire-at-will fire-at-will commented Mar 11, 2026

Copy link
Copy Markdown
Contributor

Description

It's extremely unlikely, but technically possible, for a race condition to arise when fetching products for the Galaxy Store. The race condition occurs when the call to IAPHelper.getProductsDetails() completes before the calling code in ProductDataHandler is able to set this.inFlightRequest = request on the next line. When this occurs, the ProductDataHandler will be unable to fetch and execute the onSuccess/onFailure callbacks, causing the product fetch to never complete.

We haven't been able to reproduce this race condition, and it's highly likely that it will never happen in real-world or testing environments, since getProductsDetails() is asynchronous, but since it's possible for it to happen, we should address it.

This PR eliminates the race condition by setting the inFlightRequest before getProductsDetails() is called.

We currently set the inFlightRequest before making the call to IAPHelper for all other requests made to the Galaxy Store, so this is the only location where this particular race condition should be able to occur.


Note

Low Risk
Low risk: changes are limited to Galaxy Store request bookkeeping (setting inFlightRequest earlier) plus comment clarifications, with no protocol/API changes.

Overview
Fixes a potential race in ProductDataHandler.getProductDetails by setting inFlightRequest before dispatching iapHelper.getProductsDetails(), ensuring callbacks can always be routed even if the SDK responds immediately.

Also adds clarifying comments across Galaxy handlers noting that underlying Samsung IAP calls (e.g., startPayment, getOwnedList, acknowledgePurchases, getPromotionEligibility, changeSubscriptionPlan) may swallow exceptions, and slightly refactors ProductDataHandler to avoid a temporary request variable.

Written by Cursor Bugbot for commit a32f2bb. This will update automatically on new commits. Configure here.

@fire-at-will fire-at-will added the pr:fix A bug fix label Mar 11, 2026
@codecov

codecov Bot commented Mar 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 79.41%. Comparing base (054abeb) to head (a32f2bb).
⚠️ Report is 2 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #3213   +/-   ##
=======================================
  Coverage   79.41%   79.41%           
=======================================
  Files         356      356           
  Lines       14342    14342           
  Branches     1958     1958           
=======================================
  Hits        11389    11389           
  Misses       2149     2149           
  Partials      804      804           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@fire-at-will fire-at-will marked this pull request as ready for review March 11, 2026 16:06
@fire-at-will fire-at-will requested a review from a team as a code owner March 11, 2026 16:06
@fire-at-will fire-at-will requested a review from tonidero March 11, 2026 16:06

@tonidero tonidero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hmm right, makes sense. Thanks for fixing!

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

@fire-at-will fire-at-will added this pull request to the merge queue Mar 13, 2026
Merged via the queue into main with commit 9768055 Mar 13, 2026
29 checks passed
@fire-at-will fire-at-will deleted the galaxy/set-product-handler-request-before-request-is-sent branch March 13, 2026 20:17
github-merge-queue Bot pushed a commit that referenced this pull request Mar 16, 2026
**This is an automatic release.**

## RevenueCat SDK
### 🐞 Bugfixes
* Fix & Standardize Galaxy Date Parsing Edge Cases (#3216) via Will
Taylor (@fire-at-will)
* Fix addSuccessfullyPostedToken for new purchases in
PostPendingTransactionsHelper (#3239) via Facundo Menzella
(@facumenzella)
* [Galaxy]: Fix race condition when fetching Galaxy products (#3213) via
Will Taylor (@fire-at-will)
* Fixes double padding in PaywallActivity on Android 15+ when
`edgeToEdge` parameter is false (#3227) via Cesar de la Vega (@vegaro)

## RevenueCatUI SDK
### 🐞 Bugfixes
* Fix bold text not rendering in Markdown lists (#3228) via Cesar de la
Vega (@vegaro)
* Fix: Clear in-memory offerings cache on locale override to prevent
stale paywall data (#3225) via Antonio Pallares (@ajpallares)
### Paywallv2
#### ✨ New Features
* Feature: Update default paywall (#3133) via Jacob Rakidzich
(@JZDesign)
#### 🐞 Bugfixes
* Fix V2 paywall safe area in landscape mode (#3221) via Cesar de la
Vega (@vegaro)

### 🔄 Other Changes
* Run integration tests on all branches (#3242) via Toni Rico
(@tonidero)
* Migrate Firebase Test Lab jobs to CircleCI emulators (#3238) via Toni
Rico (@tonidero)
* Run metalava on galaxy module in test-galaxy job (#3235) via Will
Taylor (@fire-at-will)
* Add offering_id to custom paywall impression event (#3230) via Rick
(@rickvdl)
* Cache isAutoRenewing to detect subscription changes without
syncPurchases (#3198) via Facundo Menzella (@facumenzella)
* Bump fastlane-plugin-revenuecat_internal from `e146447` to `3e8c384`
(#3233) via dependabot[bot] (@dependabot[bot])

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk release housekeeping: version string bumps and
documentation/deployment path updates with no functional runtime logic
changes beyond the exposed version constant.
> 
> **Overview**
> Publishes the `9.26.0` release by removing `-SNAPSHOT` across
build/version metadata (root `VERSION_NAME`, `.version`,
`Config.frameworkVersion`, and sample/test app dependency pins).
> 
> Updates release documentation artifacts by adding the `9.26.0` notes
to `CHANGELOG.md`/`CHANGELOG.latest.md`, switching docs deployment in
CircleCI to sync `docs/9.26.0` to S3, and updating `docs/index.html` to
redirect to the new version.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
0a30a45. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr:fix A bug fix

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants