Skip to content

0.20.1 - -Free Evaluation Hot Path (High-Concurrency Perf), Sticky-Value Enforce Options (Rust/Java), Exposure Dedupe Cap in All Bindings

Choose a tag to compare

@statsig-kong statsig-kong released this 17 Jul 00:06
· 111 commits to main since this release
c51568b

Breaking Changes

  • N/A

New Features

  • Rust:
    • enforce_overrides / enforce_targeting on ExperimentEvaluationOptions and LayerEvaluationOptions — when a user has a persisted sticky value, a matching console override rule (enforce_overrides) or a failed targeting re-check (enforce_targeting) now takes precedence
      over the persisted value, mirroring the legacy Java server SDK's sticky-evaluation behavior. Defaults unchanged (both off).
  • Java:
    • GetExperimentOptions / GetLayerOptions gain enforceOverrides + enforceTargeting (new four-arg constructor; existing constructors unchanged, flags default to false).
  • Node.js, Python, Java, .NET, PHP, Elixir, C++:
    • exposure_dedupe_max_keys StatsigOption — configurable cap (default 100_000) on the bounded LRU backing exposure dedupe. Previously only settable from Rust, Go, and the C FFI options JSON; now exposed in every binding.

Improvements & Fixes

  • Go: fixed a process-fatal SIGSEGV under concurrent evaluation (double-free/return-value swap in purego's FFI frame pooling) — bumped ebitengine/purego to v0.10.1; also nil-guard core responses in GetFeatureGate/GetDynamicConfig/GetExperiment/GetLayer (#53)
  • All SDKs (rust core): evaluation hot path is now lock-free — refcount-free interning and a sharded eval-hash cache remove the remaining serialization points under concurrent load. In a reproduced high-concurrency workload (4-CPU pod, production-scale ruleset), throughput improved
    from 36k evals/sec with p99 = 100ms to 80k evals/sec with p99 = 200µs. Resolves the reported Java Core SDK performance issue and incorporates the community-contributed intern-store sharding fix from the Elixir SDK.

Included In This Release

  • 8f97829 statsig-kong[bot]
    • chore: bump version to 0.20.1-rc.2607140133
  • b20f206 Xin Li (Bot)
    • [automated] sync rc with main
  • ebe32f0 statsig-kong[bot]
    • [automated] chore: bump version to 0.20.1-rc.2607132133 (#3058)
  • b822d50 statsig-kong[bot]
    • chore: bump version to 0.20.1-rc.2607132132
  • fa494e8 statsig-kong[bot]
    • [automated] sync rc with main (#3057)
  • b267db8 Xin Li (Bot)
    • [automated] sync rc with main
  • e636e62 statsig-kong[bot]
    • [automated] chore: bump version to 0.20.0-rc.1 (#3056)
  • 76f7efc statsig-kong[bot]
    • [automated] chore: bump version to 0.19.9-beta.2607110300 (#3054)
  • 5232200 Peter Zhu
    • [S2SDK-115] java: expose enforceOverrides + enforceTargeting persistent-assignment options (#3041)
  • b26a764 Sandeep Madugula
    • [S2SDK-140] Make the eval hot path lock-free: refcount-free interning, sharded eval-hash cache (#3040)
  • 52f6bcd statsig-kong[bot]
    • [automated] chore: bump version to 0.19.9-beta.2607100302 (#3053)
  • 4401edf Peter Zhu
    • [S2SDK-114] rust-core: add enforceOverrides + enforceTargeting persistent-assignment options (#3030)
  • ecd3da7 Peter Zhu
    • feat: expose exposure_dedupe_max_keys option in all SDK bindings (#3013)
  • 5fd8b51 statsig-kong[bot]
    • [automated] chore: bump version to 0.19.9-rc.2607090505 (#3039)
  • 1f92bd7 statsig-kong[bot]
    • [automated] sync rc with main (#3038)

Full Changelog: 0.20.0...0.20.1