Skip to content

feat: evaluate big segments#550

Merged
beekld merged 3 commits into
mainfrom
beeklimt/SDK-2366-2
Jun 12, 2026
Merged

feat: evaluate big segments#550
beekld merged 3 commits into
mainfrom
beeklimt/SDK-2366-2

Conversation

@beekld

@beekld beekld commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Evaluate big segments

Wires the big segment store wrapper into the server-side evaluator so flags referencing big segments actually evaluate, and annotates the reason with the big segments status. Builds on SDK-2366, which introduced the EvaluationReason::BigSegmentsStatus type.

What's in

  • Big segment matching in rules.cpp:
    • looks up membership for the unbounded context kind
    • tests the <key>.g<generation> segment ref
    • short-circuits to non-match on a store error
    • falls through to the segment's rules on a membership miss
  • EvaluationStack carries the per-evaluation status, membership cache, and per-key store-error set, so a context key is queried at most once per evaluation.
  • The aggregated status is stamped onto the returned EvaluationReason.

Design notes

When one evaluation queries multiple big segments with differing statuses, the least-trustworthy status wins (NOT_CONFIGURED > STORE_ERROR > STALE > HEALTHY). This follows the spec but diverges from Java/Go, which take the last status written.

Testing

Added unit tests covering each evaluation branch against an in-memory store.


Note

Medium Risk
Changes core segment-matching and evaluation-reason behavior for flags using big segments; incorrect membership or status aggregation could change targeting outcomes, though behavior is heavily unit-tested.

Overview
Big segment evaluation is wired into the server-side flag evaluator: unbounded segments now resolve membership via BigSegmentStoreWrapper instead of always returning non-match with a TODO.

EvaluationStack is extended with a non-owning store pointer, per-evaluation membership cache (one store lookup per context key), per-key store-error short-circuit, and aggregated BigSegmentsStatus using worst-wins precedence (NOT_CONFIGURED > STORE_ERROR > STALE > HEALTHY). Evaluator accepts an optional big-segment store, seeds the stack from it, and stamps the aggregated status onto the returned EvaluationReason when any big segment was consulted.

In Contains / MatchBigSegment, big segments use the unbounded context kind’s key, check <segmentKey>.g<generation>, treat store errors as non-match without retry, skip regular include/exclude lists, and fall through to segment rules on membership miss. New gtest coverage exercises not-configured, healthy/stale/error paths, precedence, caching, and rule fallthrough.

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

@beekld
beekld requested a review from a team as a code owner June 10, 2026 04:55
@beekld
beekld marked this pull request as draft June 10, 2026 04:58
@beekld
beekld force-pushed the beeklimt/SDK-2366-2 branch 3 times, most recently from 1e33a1a to 20a23ce Compare June 10, 2026 19:52
@beekld
beekld force-pushed the beeklimt/SDK-2366 branch from ae98702 to d0e181f Compare June 11, 2026 21:08
Base automatically changed from beeklimt/SDK-2366 to main June 11, 2026 21:51
@beekld
beekld force-pushed the beeklimt/SDK-2366-2 branch from 20a23ce to c7a2817 Compare June 11, 2026 22:09
@beekld
beekld marked this pull request as ready for review June 11, 2026 22:45
Comment thread libs/server-sdk/src/evaluation/evaluator.cpp
Comment thread libs/server-sdk/src/evaluation/rules.cpp Outdated
@beekld
beekld merged commit 505ee46 into main Jun 12, 2026
47 checks passed
@beekld
beekld deleted the beeklimt/SDK-2366-2 branch June 12, 2026 19:04
@github-actions github-actions Bot mentioned this pull request Jun 11, 2026
beekld added a commit that referenced this pull request Jun 12, 2026
beekld added a commit that referenced this pull request Jun 12, 2026
beekld added a commit that referenced this pull request Jun 12, 2026
beekld pushed a commit that referenced this pull request Jun 29, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>launchdarkly-cpp-client: 3.11.2</summary>

##
[3.11.2](launchdarkly-cpp-client-v3.11.1...launchdarkly-cpp-client-v3.11.2)
(2026-06-29)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/cpp-internal bumped from 0.13.0 to 0.14.0
    * @launchdarkly/cpp-common bumped from 1.11.0 to 1.12.0
    * @launchdarkly/cpp-sse-client bumped from 0.6.1 to 0.7.0
</details>

<details><summary>launchdarkly-cpp-common: 1.12.0</summary>

##
[1.12.0](launchdarkly-cpp-common-v1.11.0...launchdarkly-cpp-common-v1.12.0)
(2026-06-29)


### Features

* expose Big Segments via public Client and Config APIs
([#552](#552))
([c5fd239](c5fd239))
</details>

<details><summary>launchdarkly-cpp-internal: 0.14.0</summary>

##
[0.14.0](launchdarkly-cpp-internal-v0.13.0...launchdarkly-cpp-internal-v0.14.0)
(2026-06-29)


### Features

* add internal BigSegmentStoreWrapper with caching and status polling
([#543](#543))
([47fa5c2](47fa5c2))
* orchestrator switches to FDv1 fallback on directive
([#539](#539))
([44f2522](44f2522))


### Bug Fixes

* FDv2 fixes surfaced by v3 contract test harness
([#547](#547))
([e9c3c04](e9c3c04))
* handle FDv2 intentCode none as listening, reject unknown codes
([#555](#555))
([42e8ecd](42e8ecd))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/cpp-common bumped from 1.11.0 to 1.12.0
</details>

<details><summary>launchdarkly-cpp-server: 3.11.0</summary>

##
[3.11.0](launchdarkly-cpp-server-v3.10.1...launchdarkly-cpp-server-v3.11.0)
(2026-06-29)


### Features

* add FDv1AdapterSynchronizer wrapping IDataSynchronizer as
IFDv2Synchronizer
([#540](#540))
([d6368b8](d6368b8))
* add FDv2 configuration builder
([#545](#545))
([43850ce](43850ce))
* add IBigSegmentStore interface + Redis and DynamoDB stores
([#536](#536))
([136aca7](136aca7))
* add internal BigSegmentsBuilder + config struct
([#541](#541))
([3c88c2a](3c88c2a))
* add internal BigSegmentStoreWrapper with caching and status polling
([#543](#543))
([47fa5c2](47fa5c2))
* add server FDv2 data system orchestrator
([#529](#529))
([65e110f](65e110f))
* add X-LaunchDarkly-Instance-Id header to server SDK (SDK-2353)
([#532](#532))
([fd0c761](fd0c761))
* evaluate big segments
([#550](#550))
([505ee46](505ee46))
* expose Big Segments via public Client and Config APIs
([#552](#552))
([c5fd239](c5fd239))
* orchestrator switches to FDv1 fallback on directive
([#539](#539))
([44f2522](44f2522))
* propagate FDv1 fallback directive from FDv2 polling and streaming
sources ([#538](#538))
([edd96fe](edd96fe))


### Bug Fixes

* FDv2 fixes surfaced by v3 contract test harness
([#547](#547))
([e9c3c04](e9c3c04))
* stop accumulating WhenAny continuations on the Conditions aggregate
([#562](#562))
([5f8bf79](5f8bf79))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/cpp-internal bumped from 0.13.0 to 0.14.0
    * @launchdarkly/cpp-common bumped from 1.11.0 to 1.12.0
    * @launchdarkly/cpp-sse-client bumped from 0.6.1 to 0.7.0
</details>

<details><summary>launchdarkly-cpp-server-dynamodb-source:
0.2.0</summary>

##
[0.2.0](launchdarkly-cpp-server-dynamodb-source-v0.1.0...launchdarkly-cpp-server-dynamodb-source-v0.2.0)
(2026-06-29)


### Features

* add IBigSegmentStore interface + Redis and DynamoDB stores
([#536](#536))
([136aca7](136aca7))
* add internal BigSegmentStoreWrapper with caching and status polling
([#543](#543))
([47fa5c2](47fa5c2))
* implement DynamoDBDataSource + tests
([#534](#534))
([a0c2790](a0c2790))
* scaffold libs/server-sdk-dynamodb-source
([#533](#533))
([df386c1](df386c1))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/cpp-server bumped from 3.10.1 to 3.11.0
</details>

<details><summary>launchdarkly-cpp-server-otel: 0.1.2</summary>

##
[0.1.2](launchdarkly-cpp-server-otel-v0.1.1...launchdarkly-cpp-server-otel-v0.1.2)
(2026-06-29)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/cpp-server bumped from 3.10.1 to 3.11.0
</details>

<details><summary>launchdarkly-cpp-server-redis-source: 2.3.0</summary>

##
[2.3.0](launchdarkly-cpp-server-redis-source-v2.2.2...launchdarkly-cpp-server-redis-source-v2.3.0)
(2026-06-29)


### Features

* add IBigSegmentStore interface + Redis and DynamoDB stores
([#536](#536))
([136aca7](136aca7))
* add internal BigSegmentStoreWrapper with caching and status polling
([#543](#543))
([47fa5c2](47fa5c2))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/cpp-server bumped from 3.10.1 to 3.11.0
</details>

<details><summary>launchdarkly-cpp-sse-client: 0.7.0</summary>

##
[0.7.0](launchdarkly-cpp-sse-client-v0.6.1...launchdarkly-cpp-sse-client-v0.7.0)
(2026-06-29)


### Features

* propagate FDv1 fallback directive from FDv2 polling and streaming
sources ([#538](#538))
([edd96fe](edd96fe))
</details>

---
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]
> **Low Risk**
> The diff is mechanical versioning and changelog updates only;
functional risk is whatever shipped in prior commits now being tagged,
not new logic in this PR.
> 
> **Overview**
> This PR is a **Release Please** cut that updates
`.release-please-manifest.json`, workspace `package.json` dependency
pins, CMake `VERSION` lines, embedded SDK version strings, version
assertion tests, and **CHANGELOG** entries—no feature or bugfix code
appears in the diff itself.
> 
> The release packages **server SDK 3.11.0** (FDv2 orchestration/config,
FDv1 fallback from streaming/polling, big-segment evaluation and public
APIs, Redis/DynamoDB `IBigSegmentStore`, `X-LaunchDarkly-Instance-Id`),
plus **client 3.11.2** and bumps for **common 1.12.0**, **internal
0.14.0**, **SSE 0.7.0**, **redis-source 2.3.0**, **dynamodb-source
0.2.0**, and **otel 0.1.2**.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
48e3593. 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