Struct mz_compute_client::controller::ComputeController

source ·
pub struct ComputeController<T: ComputeControllerTimestamp> {
Show 20 fields instances: BTreeMap<ComputeInstanceId, InstanceState<T>>, instance_workload_classes: Arc<Mutex<BTreeMap<ComputeInstanceId, Option<String>>>>, build_info: &'static BuildInfo, storage_collections: Arc<dyn StorageCollections<Timestamp = T> + Send + Sync>, initialized: bool, read_only: bool, config: ComputeParameters, arrangement_exert_proportionality: u32, stashed_response: Option<ComputeControllerResponse<T>>, envd_epoch: NonZeroI64, metrics: ComputeControllerMetrics, now: NowFn, wallclock_lag: WallclockLagFn<T>, dyncfg: Arc<ConfigSet>, response_rx: UnboundedReceiver<ComputeControllerResponse<T>>, response_tx: UnboundedSender<ComputeControllerResponse<T>>, introspection_rx: Receiver<(IntrospectionType, Vec<(Row, Diff)>)>, introspection_tx: Sender<(IntrospectionType, Vec<(Row, Diff)>)>, maintenance_ticker: Interval, maintenance_scheduled: bool,
}
Expand description

A controller for the compute layer.

Fields§

§instances: BTreeMap<ComputeInstanceId, InstanceState<T>>§instance_workload_classes: Arc<Mutex<BTreeMap<ComputeInstanceId, Option<String>>>>

A map from an instance ID to an arbitrary string that describes the class of the workload that compute instance is running (e.g., production or staging).

§build_info: &'static BuildInfo§storage_collections: Arc<dyn StorageCollections<Timestamp = T> + Send + Sync>

A handle providing access to storage collections.

§initialized: bool

Set to true once initialization_complete has been called.

§read_only: bool

Whether or not this controller is in read-only mode.

When in read-only mode, neither this controller nor the instances controlled by it are allowed to affect changes to external systems (largely persist).

§config: ComputeParameters

Compute configuration to apply to new instances.

§arrangement_exert_proportionality: u32

arrangement_exert_proportionality value passed to new replicas.

§stashed_response: Option<ComputeControllerResponse<T>>

A controller response to be returned on the next call to ComputeController::process.

§envd_epoch: NonZeroI64

A number that increases on every environmentd restart.

§metrics: ComputeControllerMetrics

The compute controller metrics.

§now: NowFn

A function that produces the current wallclock time.

§wallclock_lag: WallclockLagFn<T>

A function that computes the lag between the given time and wallclock time.

§dyncfg: Arc<ConfigSet>

Dynamic system configuration.

Updated through ComputeController::update_configuration calls and shared with all subcomponents of the compute controller.

§response_rx: UnboundedReceiver<ComputeControllerResponse<T>>

Receiver for responses produced by Instances.

§response_tx: UnboundedSender<ComputeControllerResponse<T>>

Response sender that’s passed to new Instances.

§introspection_rx: Receiver<(IntrospectionType, Vec<(Row, Diff)>)>

Receiver for introspection updates produced by Instances.

§introspection_tx: Sender<(IntrospectionType, Vec<(Row, Diff)>)>

Introspection updates sender that’s passed to new Instances.

§maintenance_ticker: Interval

Ticker for scheduling periodic maintenance work.

§maintenance_scheduled: bool

Whether maintenance work was scheduled.

Implementations§

source§

impl<T: ComputeControllerTimestamp> ComputeController<T>

source

pub fn new( build_info: &'static BuildInfo, storage_collections: Arc<dyn StorageCollections<Timestamp = T> + Send + Sync>, envd_epoch: NonZeroI64, read_only: bool, metrics_registry: MetricsRegistry, now: NowFn, wallclock_lag: WallclockLagFn<T>, ) -> Self

Construct a new ComputeController.

source

pub fn instance_exists(&self, id: ComputeInstanceId) -> bool

TODO(database-issues#7533): Add documentation.

source

fn instance( &self, id: ComputeInstanceId, ) -> Result<&InstanceState<T>, InstanceMissing>

Return a reference to the indicated compute instance.

source

fn instance_mut( &mut self, id: ComputeInstanceId, ) -> Result<&mut InstanceState<T>, InstanceMissing>

Return a mutable reference to the indicated compute instance.

source

pub fn collection_ids( &self, instance_id: ComputeInstanceId, ) -> Result<impl Iterator<Item = GlobalId> + '_, InstanceMissing>

List the IDs of all collections in the identified compute instance.

source

pub fn collection_frontiers( &self, collection_id: GlobalId, instance_id: Option<ComputeInstanceId>, ) -> Result<CollectionFrontiers<T>, CollectionLookupError>

Return the frontiers of the indicated collection.

If an instance_id is provided, the collection is assumed to be installed on that instance. Otherwise all available instances are searched.

source

pub fn collection_reverse_dependencies( &self, instance_id: ComputeInstanceId, id: GlobalId, ) -> Result<impl Iterator<Item = GlobalId> + '_, InstanceMissing>

List compute collections that depend on the given collection.

source

pub fn set_arrangement_exert_proportionality(&mut self, value: u32)

Set the arrangement_exert_proportionality value to be passed to new replicas.

source

pub async fn clusters_hydrated( &self, exclude_collections: &BTreeSet<GlobalId>, ) -> bool

Returns true if all non-transient, non-excluded collections on all clusters have been hydrated.

For this check, zero-replica clusters are always considered hydrated. Their collections would never normally be considered hydrated but it’s clearly intentional that they have no replicas.

source

pub async fn collection_hydrated( &self, instance_id: ComputeInstanceId, collection_id: GlobalId, ) -> Result<bool, Error>

Returns true iff the given collection has been hydrated.

For this check, zero-replica clusters are always considered hydrated. Their collections would never normally be considered hydrated but it’s clearly intentional that they have no replicas.

source

pub fn collections_hydrated_for_replicas( &self, instance_id: ComputeInstanceId, replicas: Vec<ReplicaId>, exclude_collections: BTreeSet<GlobalId>, ) -> Result<Receiver<bool>, Error>

Returns true if all non-transient, non-excluded collections are hydrated on any of the provided replicas.

For this check, zero-replica clusters are always considered hydrated. Their collections would never normally be considered hydrated but it’s clearly intentional that they have no replicas.

source

pub async fn dump(&self) -> Result<Value, Error>

Returns the state of the ComputeController formatted as JSON.

The returned value is not guaranteed to be stable and may change at any point in time.

source§

impl<T> ComputeController<T>

source

pub fn create_instance( &mut self, id: ComputeInstanceId, arranged_logs: BTreeMap<LogVariant, GlobalId>, workload_class: Option<String>, ) -> Result<(), InstanceExists>

Create a compute instance.

source

pub fn update_instance_workload_class( &mut self, id: ComputeInstanceId, workload_class: Option<String>, ) -> Result<(), InstanceMissing>

Updates a compute instance’s workload class.

source

pub fn drop_instance(&mut self, id: ComputeInstanceId)

Remove a compute instance.

§Panics

Panics if the identified instance still has active replicas.

source

pub fn dyncfg(&self) -> &Arc<ConfigSet>

Returns the compute controller’s config set.

source

pub fn update_configuration(&mut self, config_params: ComputeParameters)

Update compute configuration.

source

pub fn initialization_complete(&mut self)

Mark the end of any initialization commands.

The implementor may wait for this method to be called before implementing prior commands, and so it is important for a user to invoke this method as soon as it is comfortable. This method can be invoked immediately, at the potential expense of performance.

source

pub async fn ready(&mut self)

Wait until the controller is ready to do some processing.

This method may block for an arbitrarily long time.

When the method returns, the caller should call ComputeController::process.

This method is cancellation safe.

source

pub fn add_replica_to_instance( &mut self, instance_id: ComputeInstanceId, replica_id: ReplicaId, location: ClusterReplicaLocation, config: ComputeReplicaConfig, ) -> Result<(), ReplicaCreationError>

Adds replicas of an instance.

source

pub fn drop_replica( &mut self, instance_id: ComputeInstanceId, replica_id: ReplicaId, ) -> Result<(), ReplicaDropError>

Removes a replica from an instance, including its service in the orchestrator.

source

pub fn create_dataflow( &mut self, instance_id: ComputeInstanceId, dataflow: DataflowDescription<Plan<T>, (), T>, subscribe_target_replica: Option<ReplicaId>, ) -> Result<(), DataflowCreationError>

Creates the described dataflow and initializes state for its output.

If a subscribe_target_replica is given, any subscribes exported by the dataflow are configured to target that replica, i.e., only subscribe responses sent by that replica are considered.

source

pub fn drop_collections( &mut self, instance_id: ComputeInstanceId, collection_ids: Vec<GlobalId>, ) -> Result<(), CollectionUpdateError>

Drop the read capability for the given collections and allow their resources to be reclaimed.

source

pub fn peek( &self, instance_id: ComputeInstanceId, peek_target: PeekTarget, literal_constraints: Option<Vec<Row>>, uuid: Uuid, timestamp: T, finishing: RowSetFinishing, map_filter_project: SafeMfpPlan, target_replica: Option<ReplicaId>, peek_response_tx: Sender<PeekResponse>, ) -> Result<(), PeekError>

Initiate a peek request for the contents of the given collection at timestamp.

source

pub fn cancel_peek( &self, instance_id: ComputeInstanceId, uuid: Uuid, reason: PeekResponse, ) -> Result<(), InstanceMissing>

Cancel an existing peek request.

Canceling a peek is best effort. The caller may see any of the following after canceling a peek request:

  • A PeekResponse::Rows indicating that the cancellation request did not take effect in time and the query succeeded.
  • A PeekResponse::Canceled affirming that the peek was canceled.
  • No PeekResponse at all.
source

pub fn set_read_policy( &self, instance_id: ComputeInstanceId, policies: Vec<(GlobalId, ReadPolicy<T>)>, ) -> Result<(), ReadPolicyError>

Assign a read policy to specific identifiers.

The policies are assigned in the order presented, and repeated identifiers should conclude with the last policy. Changing a policy will immediately downgrade the read capability if appropriate, but it will not “recover” the read capability if the prior capability is already ahead of it.

Identifiers not present in policies retain their existing read policies.

It is an error to attempt to set a read policy for a collection that is not readable in the context of compute. At this time, only indexes are readable compute collections.

source

pub fn acquire_read_hold( &self, instance_id: ComputeInstanceId, collection_id: GlobalId, ) -> Result<ReadHold<T>, CollectionUpdateError>

Acquires a ReadHold for the identified compute collection.

source

fn determine_time_dependence( &self, instance_id: ComputeInstanceId, dataflow: &DataflowDescription<Plan<T>, (), T>, ) -> Result<Option<TimeDependence>, TimeDependenceError>

Determine the time dependence for a dataflow.

source

fn record_introspection_updates( &mut self, storage: &mut dyn StorageController<Timestamp = T>, )

source

pub fn process( &mut self, storage: &mut dyn StorageController<Timestamp = T>, ) -> Option<ComputeControllerResponse<T>>

Processes the work queued by ComputeController::ready.

source

fn maintain(&mut self, storage: &mut dyn StorageController<Timestamp = T>)

Auto Trait Implementations§

§

impl<T> !Freeze for ComputeController<T>

§

impl<T> !RefUnwindSafe for ComputeController<T>

§

impl<T> Send for ComputeController<T>

§

impl<T> Sync for ComputeController<T>

§

impl<T> Unpin for ComputeController<T>
where T: Unpin,

§

impl<T> !UnwindSafe for ComputeController<T>

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, U> CastInto<U> for T
where U: CastFrom<T>,

source§

fn cast_into(self) -> U

Performs the cast.
source§

impl<T> Conv for T

source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
source§

impl<T> FmtForward for T

source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FutureExt for T

source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
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> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
source§

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

source§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
source§

impl<T, U> OverrideFrom<Option<&T>> for U
where U: OverrideFrom<T>,

source§

fn override_from(self, layer: &Option<&T>) -> U

Override the configuration represented by Self with values from the given layer.
source§

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

source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
source§

impl<T> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<P, R> ProtoType<R> for P
where R: RustType<P>,

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<'a, S, T> Semigroup<&'a S> for T
where T: Semigroup<S>,

source§

fn plus_equals(&mut self, rhs: &&'a S)

The method of std::ops::AddAssign, for types that do not implement AddAssign.
source§

impl<T> Tap for T

source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
source§

impl<T> TryConv for T

source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

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

§

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>,

§

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<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

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