Skip to content

fix: Park a synchronizer that reports Off or closes its results - #500

Merged
beekld merged 2 commits into
bklimt/SDK-2986/fdv1-fallback-default-ttlfrom
bklimt/SDK-3425/synchronizer-off-result
Nov 3, 2026
Merged

beekld merged 2 commits into
bklimt/SDK-2986/fdv1-fallback-default-ttlfrom
bklimt/SDK-3425/synchronizer-off-result

Conversation

@beekld

@beekld beekld commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Since #489, the data system has silently ignored a synchronizer result with State: Off. The result's error was dropped, the status didn't change, and the data system kept waiting on that synchronizer. A synchronizer isn't supposed to report Off, but State is a public field, and custom synchronizers can set it.

This PR treats an Off result as an unexpected failure. The data system reports Interrupted with the result's error and parks the synchronizer.

It also changes how the data system handles a synchronizer that closes its result channel on its own. That used to count as a fallback, which with a single synchronizer restarted it at once with no delay. A synchronizer that kept ending its results could then restart in a tight loop. The data system now treats this as an unexpected failure too, and parks the synchronizer.


Note

Overview
Fixes FDv2 synchronizer handling where State: Off from a synchronizer was ignored (error dropped, loop kept waiting) and where a synchronizer closing its own result channel was treated like a normal fallback—often restarting immediately with a single synchronizer and risking a tight loop.

Off results are now treated as an unexpected failure: status becomes Interrupted with the result’s error, and the synchronizer is parked (same path as other unexpected failures).

A closed result channel is also an unexpected failure: status Interrupted with a fixed unknown error message, then syncPark (or syncRestart if the SDK key changed mid-run). Tests cover both behaviors.

Reviewed by Cursor Bugbot for commit 59492c2. Bugbot is set up for automated code reviews on this repo. Configure here.

@beekld
beekld added this pull request to stack #503 November 2, 2026 21:04
@beekld
beekld marked this pull request as ready for review November 2, 2026 21:05
@beekld
beekld requested a review from a team as a code owner November 2, 2026 21:05

@cursor cursor Bot left a comment

Copy link
Copy Markdown

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 using default effort and found 1 potential issue.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 193489d. Configure here.

Comment thread internal/datasystem/fdv2_datasystem.go Resolved
@beekld
beekld force-pushed the bklimt/SDK-3425/synchronizer-off-result branch from 7f8c484 to ee27cca Compare November 2, 2026 21:59
@beekld
beekld force-pushed the bklimt/SDK-3425/synchronizer-off-result branch from ee27cca to 6b4d9a8 Compare November 3, 2026 00:05
@beekld
beekld force-pushed the bklimt/SDK-3425/synchronizer-off-result branch 2 times, most recently from 466c1a2 to fcfa772 Compare November 3, 2026 19:55
@beekld
beekld force-pushed the bklimt/SDK-3425/synchronizer-off-result branch from fcfa772 to 59492c2 Compare November 3, 2026 20:36
@beekld
beekld merged commit f6e9910 into v7 Nov 3, 2026
53 checks passed
@beekld
beekld deleted the bklimt/SDK-3425/synchronizer-off-result branch November 3, 2026 21:33
beekld pushed a commit that referenced this pull request Nov 6, 2026
🤖 I have created a release *beep* *boop*
---


##
[7.22.0](v7.21.2...v7.22.0)
(2026-11-06)


### Features

* Broadcast Off to FDv2 status listeners when the data system stops
([#505](#505))
([5c5b8ce](5c5b8ce))
* End an FDv1 fallback after a default TTL of one hour
([#499](#499))
([1f03a5f](1f03a5f))
* Park FDv2 synchronizers instead of retiring them on unexpected
failures
([#489](#489))
([644253a](644253a))


### Bug Fixes

* Keep data from a store that is not initialized out of override
evaluations and AllFlagsState, and report a store failure
([#491](#491))
([1005a1a](1005a1a))
* Keep the override marking when a migration flag serves an unrecognized
stage ([#492](#492))
([9f9911f](9f9911f))
* Leave StateSince alone when a synchronizer starts
([#502](#502))
([823b9aa](823b9aa))
* Make TestData ValueForAll return its value when targeting is off
([#507](#507))
([7300bc1](7300bc1))
* Park a synchronizer that reports Off or closes its results
([#500](#500))
([f6e9910](f6e9910))
* Poll the override files when they cannot be watched
([#495](#495))
([170ad3b](170ad3b))
* Prevent a full status listener from hanging Close
([#498](#498))
([9efd570](9efd570))
* Say that the data system retries after an unrecoverable HTTP error
([#501](#501))
([d4066cc](d4066cc))
* Treat a repeated override file path in a different case as a repeat on
Windows
([#494](#494))
([eeb68d3](eeb68d3))
* Warn when offline mode skips the override source
([#493](#493))
([69bbe61](69bbe61))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Overview**
> **Cuts the Go server SDK release `7.22.0` and records its notes.**
> 
> The root **`.release-please-manifest.json`** and
**`internal/version.go`** now declare **`7.22.0`** (replacing `7.21.2`).
**`CHANGELOG.md`** gains a new **`[7.22.0]`** section dated
**2026-11-06** documenting shipped work: FDv2 data-system behavior
(status **Off** broadcasts, synchronizer **parking** instead of retire,
**FDv1 fallback TTL**, **StateSince** handling, parking on
**Off**/closed results), plus multiple **bug fixes** around
uninitialized store data in overrides/**AllFlagsState**, migration
override marking, **TestData** when targeting is off, **override file**
polling/deduping on Windows, offline-mode warnings, status listener
**Close** hangs, and messaging for unrecoverable HTTP retries.
> 
> No application code changes appear in this PR; it’s version
bookkeeping and release notes only.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
c763cc0. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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.

2 participants