Skip to main content

ParameterScope

Enum ParameterScope 

Source
pub enum ParameterScope {
    Environment,
    Cluster,
    Replica,
}
Expand description

The scope at which a synced parameter’s value may be overridden.

Every synced parameter declares its scope class as part of its definition. The declaration is the single source of truth for which contexts the LaunchDarkly sync loop evaluates and where the resolved value may be overridden. See doc/developer/design/20260609_scoped_feature_flags.md.

Environment is the safe declaration, and the right one when in doubt. It preserves the unscoped behavior of a single value everywhere. A finer scope enables divergence, so declaring one asserts that divergence is both safe and useful for this config. Getting that wrong introduces a way to break an environment that did not previously exist, while erring toward Environment only forgoes a capability. Prefer forgoing the capability.

Where a config is realized is therefore a necessary condition for a finer scope, not a sufficient one. A config qualifies for Replica only if it is realized per replica, and should be declared Replica only if it also tunes that replica process’s own resource usage (memory, CPU, I/O, concurrency, timing) and cannot change what a dataflow produces, what reaches durable state, or anything externally visible. lgalloc, the memory limiter, the spill and pager knobs, and the timely zero-copy settings are the shape to match.

In particular, declare Environment for a flag selecting a different implementation or code path whose output-equivalence is an assumption rather than a guarantee. Where the assumption holds, Environment costs nothing. Where it does not, a per-replica rollout turns one bug into query results that differ by which replica served them.

Which contexts a config can be realized in:

  • A config realized inside a clusterd process is a Replica candidate. That covers the compute and storage worker config sets and mz_metrics, which the per-replica dyncfg push reaches. environmentd may read such a config too, for its own process. That read legitimately sees the environment-wide value.
  • A config that environmentd resolves for one specific replica, whether it ships the value there or acts on it itself, is also a candidate. The read site has to resolve that replica’s override, either with Config::get_with_overrides or from a per-replica config set. Without that, the override never takes effect and the declaration is a silent no-op.
  • A config realized in environmentd with no single replica in scope is Environment. So is every balancerd config. balancerd syncs LaunchDarkly itself, against a balancer context keyed by cloud provider, region and build version, and has no environment, cluster or replica beneath it to target.
  • A config consumed at plan time, once per cluster, is Cluster.

NOTE: a config whose value must agree across the replicas of one cluster (because they render the same dataflow and their outputs are compared) is Environment even when it is read on clusterd. Per-replica divergence in how a dataflow is rendered is fine, in what it produces is not.

NOTE: persist configs are Environment as a class, even though the persist client runs on clusterd and the per-replica push reaches its config set. The same client code also runs in environmentd, and every copy of it acts on shared durable state. A replica-scoped persist config could never reach the environmentd client, so a rollout targeting replicas would leave a shard’s other writer on the old value indefinitely. Environment is the only scope covering every persist client in an environment.

Variants§

§

Environment

Environment-wide only; no cluster/replica overrides. The default, so all existing synced parameters are unchanged.

NOTE: this names the coarsest targeting granularity, not the environmentd process. A config a process other than environmentd resolves for itself, with nothing finer beneath it, is Environment.

§

Cluster

Cluster-coherent: env-wide base plus per-cluster overrides. Evaluated with the cluster context (replica-free) and resolved at plan time via OptimizerFeatureOverrides. e.g. optimizer features.

§

Replica

Replica-local: env-wide base plus per-replica / per-size-family overrides. Evaluated with the replica context and resolved at the controller’s per-replica dyncfg push. e.g. lgalloc, persist pager, LZ4.

Implementations§

Source§

impl ParameterScope

Source

pub const DEFAULT: ParameterScope = ParameterScope::Environment

The scope applied to a parameter that does not declare one: environment- wide, i.e. no cluster/replica overrides. A const so it can be used in the const contexts (system-var constructors, the feature_flags! macro) where Default::default is unavailable.

Source

pub const fn as_str(&self) -> &'static str

Returns the lowercase string name of this scope, as surfaced in documentation and introspection.

Trait Implementations§

Source§

impl Clone for ParameterScope

Source§

fn clone(&self) -> ParameterScope

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for ParameterScope

Source§

impl Debug for ParameterScope

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ParameterScope

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Eq for ParameterScope

Source§

impl PartialEq for ParameterScope

Source§

fn eq(&self, other: &ParameterScope) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for ParameterScope

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more