Skip to main content

BrokerTransport

Struct BrokerTransport 

Source
pub struct BrokerTransport { /* private fields */ }
Expand description

The CoordinationTransport that talks to a Kafka cluster.

Build one with BrokerTransport::builder. One transport serves every role of one process. It opens the connections it needs on first use, and BrokerTransport::close shuts them down.

The module documentation states the parts of the design that the call sites do not show.

Implementations§

Source§

impl BrokerTransport

Source

pub async fn start( bootstrap: String, client_id: String, lease_duration: Time, request_timeout: Time, fetch_max_wait: Time, fetch_partition_max: ByteSize, topic_partitions: i32, topic_replication: i32, security: Option<ClientSecurity>, ) -> Result<Self, CoordinationError>

Builds a transport against the cluster at bootstrap.

bootstrap takes one host:port, or several separated by commas. lease_duration becomes the transaction timeout of every role, so the transaction coordinator aborts the open transaction of a dead holder after that extent.

The call opens the admin connection. It does not create the topic and it does not build a producer. The first call that needs the topic creates it.

§Errors

Returns CoordinationError::InvalidConfig when bootstrap holds no address, when an address does not resolve, or when the partition count or the replication factor is not positive. Returns CoordinationError::Admin when no bootstrap address accepts the admin connection.

Source

pub fn builder() -> BrokerTransportStartBuilder

Builds a transport against the cluster at bootstrap.

bootstrap takes one host:port, or several separated by commas. lease_duration becomes the transaction timeout of every role, so the transaction coordinator aborts the open transaction of a dead holder after that extent.

The call opens the admin connection. It does not create the topic and it does not build a producer. The first call that needs the topic creates it.

§Errors

Returns CoordinationError::InvalidConfig when bootstrap holds no address, when an address does not resolve, or when the partition count or the replication factor is not positive. Returns CoordinationError::Admin when no bootstrap address accepts the admin connection.

Source§

impl BrokerTransport

Source

pub async fn bound_producer(&self, role: &Role) -> Option<Arc<Producer>>

The producer that CoordinationTransport::acquire_epoch bound to the epoch of role.

The result is None when this process holds no epoch for role. A leadership handle gives the producer to the caller, and the broker fences every write the caller makes with it.

Source

pub async fn held_token(&self, role: &Role) -> Option<FencingToken>

The epoch that CoordinationTransport::acquire_epoch minted for role in this process.

The result is None when this process holds no epoch for role. The value is what this process believes. The cluster is the authority, and CoordinationTransport::describe asks it.

Source

pub async fn close(self)

Closes every producer and every connection this transport opened.

Each producer runs a sender task, and this call stops those tasks. Drop every leadership handle before this call. A producer that a handle still shares stays open, and this call reports it in a warning.

Trait Implementations§

Source§

impl CoordinationTransport for BrokerTransport

Source§

fn acquire_epoch<'life0, 'life1, 'async_trait>( &'life0 self, role: &'life1 Role, ) -> Pin<Box<dyn Future<Output = Result<FencingToken, CoordinationError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Mints the epoch of role and fences the member that held it.

The call builds the transactional producer of the role and calls init_transactions, which sends InitProducerId to the transaction coordinator. The transport keeps that producer, because it stays bound to the epoch the coordinator minted.

The call then reads the minted pair out of that producer with Producer::transactional_identity. It does not ask the coordinator again. A second request would report whatever the coordinator holds at that moment, so a competitor that mints in between would hand this member the token of the competitor. Producer::producer_id is a different pair again: it reports the build-time InitProducerId, which carries no transactional.id, and the coordinator never advances it.

§Errors

Returns CoordinationError::Fenced when a later member already took role while this call ran. Returns CoordinationError::Producer when the coordinator refuses the call or returns no identity, and CoordinationError::Client when a connection fails.

Source§

fn read_role_records<'life0, 'life1, 'async_trait>( &'life0 self, role: &'life1 Role, ) -> Pin<Box<dyn Future<Output = Result<RoleRecords, CoordinationError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Reads the partition of role and returns its records in offset order.

The scan runs at isolation level 1, so an aborted lease write is invisible. It starts at the first offset the partition still holds, and it stops when the cursor reaches the last stable offset that the cluster reported at the start of the scan. The scan does not wait for a record that a writer appends while it runs.

The scan drops a record whose key does not decode, and a record whose key names another role. Both belong to a writer that this role does not own.

§Errors

Returns CoordinationError::Client when the metadata read, the offset lookup, or a fetch fails, and when the cluster reports no leader for the partition of role. Returns CoordinationError::Record when the value of a record of role does not decode. Returns CoordinationError::InvalidConfig when the topic reports no partition.

Source§

fn register<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, role: &'life1 Role, member: &'life2 MemberId, ) -> Pin<Box<dyn Future<Output = Result<(), CoordinationError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Appends the registration of member to the partition of role.

The append travels on the plain producer and sits outside a transaction, because a candidate holds no epoch. The offset the broker gives it is the join sequence of the member.

§Errors

Returns CoordinationError::Producer when the append fails, and CoordinationError::Client when a connection fails. This method never reports CoordinationError::Fenced, because its producer holds no epoch for the role.

Source§

fn write_lease<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, role: &'life1 Role, token: FencingToken, lease: &'life2 Lease, ) -> Pin<Box<dyn Future<Output = Result<(), CoordinationError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Writes the lease of role in a transaction under token.

The write travels on the producer that CoordinationTransport::acquire_epoch bound to token. The broker checks the epoch of that producer, so a superseded holder cannot append a lease. That check is how a deposed holder learns that it lost the role.

A failed send aborts the transaction, so the partial write stays invisible to a committed read.

§Errors

Returns CoordinationError::NotHeld when this process holds no epoch for role, and when token is not the epoch it holds. Returns CoordinationError::Fenced when the broker rejects the epoch, and CoordinationError::Producer for every other failure of the write.

Source§

fn describe<'life0, 'life1, 'async_trait>( &'life0 self, role: &'life1 Role, ) -> Pin<Box<dyn Future<Output = Result<Option<FencingToken>, CoordinationError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Asks the transaction coordinator which epoch holds role now.

The call sends DescribeTransactions (KIP-664). It joins no group and it takes no epoch, so any process makes it. The result is None when the coordinator answers TRANSACTIONAL_ID_NOT_FOUND, which says that no member has ever held role.

§Errors

Returns CoordinationError::Admin when the coordinator lookup fails, or when the coordinator reports a fault other than an unknown role.

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
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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.

§

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

§

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 primary(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Primary].

§Example
println!("{}", value.primary());
§

fn fixed(&self, color: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Fixed].

§Example
println!("{}", value.fixed(color));
§

fn rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Rgb].

§Example
println!("{}", value.rgb(r, g, b));
§

fn black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Black].

§Example
println!("{}", value.black());
§

fn red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Red].

§Example
println!("{}", value.red());
§

fn green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Green].

§Example
println!("{}", value.green());
§

fn yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Yellow].

§Example
println!("{}", value.yellow());
§

fn blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Blue].

§Example
println!("{}", value.blue());
§

fn magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Magenta].

§Example
println!("{}", value.magenta());
§

fn cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Cyan].

§Example
println!("{}", value.cyan());
§

fn white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: White].

§Example
println!("{}", value.white());
§

fn bright_black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlack].

§Example
println!("{}", value.bright_black());
§

fn bright_red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightRed].

§Example
println!("{}", value.bright_red());
§

fn bright_green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightGreen].

§Example
println!("{}", value.bright_green());
§

fn bright_yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightYellow].

§Example
println!("{}", value.bright_yellow());
§

fn bright_blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlue].

§Example
println!("{}", value.bright_blue());
§

fn bright_magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.bright_magenta());
§

fn bright_cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightCyan].

§Example
println!("{}", value.bright_cyan());
§

fn bright_white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightWhite].

§Example
println!("{}", value.bright_white());
§

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>

Returns self with the bg() set to [Color :: Primary].

§Example
println!("{}", value.on_primary());
§

fn on_fixed(&self, color: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Fixed].

§Example
println!("{}", value.on_fixed(color));
§

fn on_rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Rgb].

§Example
println!("{}", value.on_rgb(r, g, b));
§

fn on_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Black].

§Example
println!("{}", value.on_black());
§

fn on_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Red].

§Example
println!("{}", value.on_red());
§

fn on_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Green].

§Example
println!("{}", value.on_green());
§

fn on_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Yellow].

§Example
println!("{}", value.on_yellow());
§

fn on_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Blue].

§Example
println!("{}", value.on_blue());
§

fn on_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Magenta].

§Example
println!("{}", value.on_magenta());
§

fn on_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Cyan].

§Example
println!("{}", value.on_cyan());
§

fn on_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: White].

§Example
println!("{}", value.on_white());
§

fn on_bright_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlack].

§Example
println!("{}", value.on_bright_black());
§

fn on_bright_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightRed].

§Example
println!("{}", value.on_bright_red());
§

fn on_bright_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightGreen].

§Example
println!("{}", value.on_bright_green());
§

fn on_bright_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightYellow].

§Example
println!("{}", value.on_bright_yellow());
§

fn on_bright_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlue].

§Example
println!("{}", value.on_bright_blue());
§

fn on_bright_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.on_bright_magenta());
§

fn on_bright_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightCyan].

§Example
println!("{}", value.on_bright_cyan());
§

fn on_bright_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightWhite].

§Example
println!("{}", value.on_bright_white());
§

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 bold(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Bold].

§Example
println!("{}", value.bold());
§

fn dim(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Dim].

§Example
println!("{}", value.dim());
§

fn italic(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Italic].

§Example
println!("{}", value.italic());
§

fn underline(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Underline].

§Example
println!("{}", value.underline());

Returns self with the attr() set to [Attribute :: Blink].

§Example
println!("{}", value.blink());

Returns self with the attr() set to [Attribute :: RapidBlink].

§Example
println!("{}", value.rapid_blink());
§

fn invert(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Invert].

§Example
println!("{}", value.invert());
§

fn conceal(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Conceal].

§Example
println!("{}", value.conceal());
§

fn strike(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Strike].

§Example
println!("{}", value.strike());
§

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 mask(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Mask].

§Example
println!("{}", value.mask());
§

fn wrap(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Wrap].

§Example
println!("{}", value.wrap());
§

fn linger(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Linger].

§Example
println!("{}", value.linger());
§

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.

Returns self with the quirk() set to [Quirk :: Clear].

§Example
println!("{}", value.clear());
§

fn resetting(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Resetting].

§Example
println!("{}", value.resetting());
§

fn bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Bright].

§Example
println!("{}", value.bright());
§

fn on_bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: OnBright].

§Example
println!("{}", value.on_bright());
§

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);
§

fn new(self) -> Painted<Self>
where Self: Sized,

Create a new [Painted] with a default [Style]. Read more
§

fn paint<S>(&self, style: S) -> Painted<&Self>
where S: Into<Style>,

Apply a style wholesale to self. Any previous style is replaced. Read more
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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.
§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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