Skip to content

Fix race condition causing events to be lost during initialization #1090

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

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

bytesoverflow
Copy link

This PR fixes a critical race condition that causes events to be lost when they are tracked while the Segment client is processing pending events during initialization.

Problem

Events tracked during the app startup phase were being lost. When the Segment client initializes, it processes any events that were tracked before it was ready (pending events).
However, due to a race condition, new events arriving during this processing period were incorrectly saved as "pending" and never sent.

Reproduction Steps

  1. Track events immediately when a React Native app starts
  2. Track additional events within the first 2-4 seconds
  3. Observe that only a subset of events are sent to Segment

Root Cause

The isReady flag was being set AFTER the onReady() function completed processing pending events. This created a window where:

  1. Pending events are being processed
  2. New events arrive and check isReady.value
  3. Since isReady.value is still false, they get saved as pending
  4. But the pending processor has already run, so these events are never sent

Solution

Set the isReady flag to true BEFORE processing pending events, not after. This ensures any events arriving during initialization go directly to the queue.

…re onReady

Fixed a race condition where events tracked during the onReady() processing
were incorrectly categorized as pending and never sent to Segment.

The bug occurred when:
1. App starts tracking events before initialization
2. During init, onReady() begins processing pending events (takes seconds)
3. New events arrive while onReady() is still running
4. These events check isReady (still false) and get saved as "pending"
5. Since onReady() already ran, these new pending events are never processed

The fix simply swaps two lines to set isReady=true BEFORE calling onReady(),
ensuring any events that arrive during processing go directly to the queue.

Added tests to verify the initialization order and prevent regression.
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.

1 participant