The Stripe environment check's reads outlive the attempt Temporal gave up, so two attempts run at once #313

Open
opened 2026-10-31 01:01:37 +00:00 by cgalo5758 · 1 comment
Owner

What happens

When the console's Stripe key changes, and when an operator presses the control in the Stripe page's Environment check section, the console runs a background job (a Temporal workflow with one activity) that reads every product and price it has mapped to Stripe, to learn whether the current key can reach them. The activity reads them one at a time and reports progress to Temporal after each; if two minutes pass without a report, Temporal gives the attempt up and starts a new one a few seconds later.

The reads are sent without the attempt's context, so giving the attempt up does not stop them. The Stripe library waits up to 80 seconds for an answer and tries twice more, about four minutes in all. A read that Stripe leaves unanswered for more than two minutes therefore runs beside the next attempt. When it returns, the old attempt writes that row and makes one more Stripe read before it notices it was given up. If the hung read was the last one, the old attempt writes the check's finished record while the new attempt is still running, and the Stripe page shows the check as finished until the new attempt finishes.

What should happen

Each read carries the attempt's context and a deadline shorter than the two minutes Temporal waits for a report, so no read outlives its attempt, as the calls that apply scheduled plan changes and that reconcile subscriptions already do. An attempt that has been given up writes nothing more.

Where

internal/integrations/stripe/workflows/environment_check.go (CheckMappingEnvironments)

Why it matters

A slow Stripe makes two attempts of the check run at once, and the Stripe page can report a finished check while one is still running.

### What happens When the console's Stripe key changes, and when an operator presses the control in the Stripe page's Environment check section, the console runs a background job (a Temporal workflow with one activity) that reads every product and price it has mapped to Stripe, to learn whether the current key can reach them. The activity reads them one at a time and reports progress to Temporal after each; if two minutes pass without a report, Temporal gives the attempt up and starts a new one a few seconds later. The reads are sent without the attempt's context, so giving the attempt up does not stop them. The Stripe library waits up to 80 seconds for an answer and tries twice more, about four minutes in all. A read that Stripe leaves unanswered for more than two minutes therefore runs beside the next attempt. When it returns, the old attempt writes that row and makes one more Stripe read before it notices it was given up. If the hung read was the last one, the old attempt writes the check's finished record while the new attempt is still running, and the Stripe page shows the check as finished until the new attempt finishes. ### What should happen Each read carries the attempt's context and a deadline shorter than the two minutes Temporal waits for a report, so no read outlives its attempt, as the calls that apply scheduled plan changes and that reconcile subscriptions already do. An attempt that has been given up writes nothing more. ### Where `internal/integrations/stripe/workflows/environment_check.go` (`CheckMappingEnvironments`) ### Why it matters A slow Stripe makes two attempts of the check run at once, and the Stripe page can report a finished check while one is still running.
cgalo5758 added the
kind
bug
area/billingarea/integrations
labels 2026-10-31 01:01:37 +00:00
Author
Owner

The Stripe public-details read (internal/integrations/stripe/workflows/public_details.go, ReadPublicDetails) has the same shape: its attempt lasts one minute, its Stripe reads carry no context, and a read that outlives the attempt keeps calling Stripe beside the next attempt.

The Stripe public-details read (`internal/integrations/stripe/workflows/public_details.go`, `ReadPublicDetails`) has the same shape: its attempt lasts one minute, its Stripe reads carry no context, and a read that outlives the attempt keeps calling Stripe beside the next attempt.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wiki-cafe/member-console#313