pub struct TopicBasedRemoteLogMetadataManager { /* private fields */ }Expand description
Production RemoteLogMetadataManager
backed by the __remote_log_metadata topic through a MetadataEventLog
adapter.
Construct it with Self::start. That call loads any on-disk snapshot,
but it consumes no metadata partitions until Self::reconcile_assignment
adds the broker’s leader-derived and follower-derived set.
Implementations§
Source§impl TopicBasedRemoteLogMetadataManager
impl TopicBasedRemoteLogMetadataManager
Sourcepub fn assigned_metadata_partitions(&self) -> Vec<i32>
pub fn assigned_metadata_partitions(&self) -> Vec<i32>
The metadata partitions this manager is currently assigned (tracked for readiness). Sorted ascending.
Sourcepub async fn reconcile_assignment(&self, desired: &[i32])
pub async fn reconcile_assignment(&self, desired: &[i32])
Diff desired against the current assignment and drive the
AssignmentHandle.
This method adds newly-needed partitions, seeded from the snapshot
committed offset + 1, or from 0 when there is no committed event. It
removes partitions that are no longer needed. It records each added
partition’s assignment-time HWM, so reads gate on NotReady until the
pump catches up.
An HWM-fetch failure fails CLOSED. This method records a partition
whose real high-water mark it could not get with the HWM_UNKNOWN
sentinel target, so the gate returns the retryable NotReady and
never a false Ok(None). Every subsequent reconcile retries such
partitions, and the broker drives a reconcile on each image change and
each reconciler tick. A transient high_water_marks failure therefore
self-heals: the real target replaces the sentinel as soon as the fetch
succeeds.
A SINGLE task MUST drive this method. It is not internally serialized.
It interleaves .await points with reads and writes of the
ready_targets map under short, non-overlapping locks, so two
concurrent callers could race the add, remove, and refresh logic.
Correctness depends on the broker invoking it from exactly one
reconciler task.
It is async because it reads the log’s high-water marks. The broker
calls it from its reconciler task on the runtime, never from a
spawn_blocking thread.
Source§impl TopicBasedRemoteLogMetadataManager
impl TopicBasedRemoteLogMetadataManager
Sourcepub fn committed_offset(&self, partition: i32) -> i64
pub fn committed_offset(&self, partition: i32) -> i64
Committed offset loaded from the snapshot for a single metadata
partition, or -1 when the partition is out of range or had no
committed event and so needs a full replay. The assignment reconciler
uses this to start a dynamically-added partition at committed + 1.
Source§impl TopicBasedRemoteLogMetadataManager
impl TopicBasedRemoteLogMetadataManager
Sourcepub fn metadata_partition_readiness(&self) -> Vec<MetadataPartitionReadiness>
pub fn metadata_partition_readiness(&self) -> Vec<MetadataPartitionReadiness>
One MetadataPartitionReadiness for each metadata partition this
manager is assigned, sorted by partition. An unassigned partition has
no entry.
ready comes from the same rule that every gated read applies, over
the target and applied offset the entry reports.
Source§impl TopicBasedRemoteLogMetadataManager
impl TopicBasedRemoteLogMetadataManager
Sourcepub fn metadata_partition_count(&self) -> i32
pub fn metadata_partition_count(&self) -> i32
Actual partition count of the opened metadata topic. An existing topic’s count takes precedence over its provisioning configuration.
Sourcepub fn start(
log: Arc<dyn MetadataEventLog>,
runtime: Handle,
snapshot_dir: PathBuf,
snapshot_interval: Duration,
) -> Result<Arc<Self>, RemoteStorageError>
pub fn start( log: Arc<dyn MetadataEventLog>, runtime: Handle, snapshot_dir: PathBuf, snapshot_interval: Duration, ) -> Result<Arc<Self>, RemoteStorageError>
Load any on-disk snapshot into the cache and spawn the consumer
pump with an empty assignment. The manager consumes nothing until the
broker drives Self::reconcile_assignment.
runtime must be a Tokio runtime handle that lives at least as long
as the returned manager. The synchronous
RemoteLogMetadataManager
methods bridge to this handle with block_on, so a caller must NOT
call them from a task that runs on this same runtime. The broker
invokes them only through spawn_blocking, which is the only
supported call pattern.
§Errors
Returns an error when the event log reports a negative partition count. Nothing else fails, because the consumed set starts empty.
Sourcepub fn shutdown(&self)
pub fn shutdown(&self)
Cancel the consumer pump. Read methods continue to work against whatever the pump applied before shutdown. Pending and subsequent mutation methods return a closed-log error.
Sourcepub async fn shutdown_and_flush(&self)
pub async fn shutdown_and_flush(&self)
Cancel the pump and the snapshotter, then write a final snapshot that captures everything applied so far. It is safe to call this once on a graceful shutdown.
Trait Implementations§
Source§impl RemoteLogMetadataManager for TopicBasedRemoteLogMetadataManager
impl RemoteLogMetadataManager for TopicBasedRemoteLogMetadataManager
Source§fn add_remote_log_segment_metadata(
&self,
metadata: RemoteLogSegmentMetadata,
) -> Result<(), RemoteStorageError>
fn add_remote_log_segment_metadata( &self, metadata: RemoteLogSegmentMetadata, ) -> Result<(), RemoteStorageError>
CopySegmentStarted
and its id must not already be known. Read moreSource§fn update_remote_log_segment_metadata(
&self,
update: RemoteLogSegmentMetadataUpdate,
) -> Result<(), RemoteStorageError>
fn update_remote_log_segment_metadata( &self, update: RemoteLogSegmentMetadataUpdate, ) -> Result<(), RemoteStorageError>
Source§fn remote_log_segment_metadata(
&self,
topic_id_partition: &TopicIdPartition,
leader_epoch: LeaderEpoch,
offset: i64,
) -> Result<Option<RemoteLogSegmentMetadata>, RemoteStorageError>
fn remote_log_segment_metadata( &self, topic_id_partition: &TopicIdPartition, leader_epoch: LeaderEpoch, offset: i64, ) -> Result<Option<RemoteLogSegmentMetadata>, RemoteStorageError>
Source§fn highest_offset_for_epoch(
&self,
topic_id_partition: &TopicIdPartition,
leader_epoch: LeaderEpoch,
) -> Result<Option<i64>, RemoteStorageError>
fn highest_offset_for_epoch( &self, topic_id_partition: &TopicIdPartition, leader_epoch: LeaderEpoch, ) -> Result<Option<i64>, RemoteStorageError>
leader_epoch. Read moreSource§fn list_remote_log_segments(
&self,
topic_id_partition: &TopicIdPartition,
) -> Result<Vec<RemoteLogSegmentMetadata>, RemoteStorageError>
fn list_remote_log_segments( &self, topic_id_partition: &TopicIdPartition, ) -> Result<Vec<RemoteLogSegmentMetadata>, RemoteStorageError>
start_offset order. The
state does not matter. Read moreSource§fn list_remote_log_segments_by_epoch(
&self,
topic_id_partition: &TopicIdPartition,
leader_epoch: LeaderEpoch,
) -> Result<Vec<RemoteLogSegmentMetadata>, RemoteStorageError>
fn list_remote_log_segments_by_epoch( &self, topic_id_partition: &TopicIdPartition, leader_epoch: LeaderEpoch, ) -> Result<Vec<RemoteLogSegmentMetadata>, RemoteStorageError>
Source§fn put_remote_partition_delete_metadata(
&self,
metadata: RemotePartitionDeleteMetadata,
) -> Result<(), RemoteStorageError>
fn put_remote_partition_delete_metadata( &self, metadata: RemotePartitionDeleteMetadata, ) -> Result<(), RemoteStorageError>
Source§fn caught_up(
&self,
topic_id_partition: &TopicIdPartition,
) -> Result<bool, RemoteStorageError>
fn caught_up( &self, topic_id_partition: &TopicIdPartition, ) -> Result<bool, RemoteStorageError>
topic_id_partition that the metadata store had committed when the
call began. Read moreAuto Trait Implementations§
impl !Freeze for TopicBasedRemoteLogMetadataManager
impl !RefUnwindSafe for TopicBasedRemoteLogMetadataManager
impl !UnwindSafe for TopicBasedRemoteLogMetadataManager
impl Send for TopicBasedRemoteLogMetadataManager
impl Sync for TopicBasedRemoteLogMetadataManager
impl Unpin for TopicBasedRemoteLogMetadataManager
impl UnsafeUnpin for TopicBasedRemoteLogMetadataManager
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<F> FnGhost for F
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling [Attribute] value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi [Quirk] value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the [Condition] value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);