Skip to main content

BrokerPool

Struct BrokerPool 

Source
pub struct BrokerPool<C: BrokerConnector = TcpConnector> { /* private fields */ }
Expand description

Pool of Arc<Connection> keyed by broker id.

The pool opens a connection lazily on first use and caches it afterwards. A closed connection is replaced on the next use. After a failure or a disconnect, the pool waits Kafka’s reconnect backoff before it dials that broker again. Concurrent users of one broker share one connection attempt.

Implementations§

Source§

impl BrokerPool<TcpConnector>

Source

pub fn new(bootstrap: Vec<SocketAddr>, options: ConnectionOptions) -> Self

Create a new pool with the given bootstrap addresses and connection options.

Source

pub fn new_with_server_names( bootstrap: Vec<(SocketAddr, String)>, options: ConnectionOptions, ) -> Self

Create a pool whose bootstrap TLS names retain their pre-DNS hostnames.

Source§

impl<C: BrokerConnector> BrokerPool<C>

Source

pub async fn get(&self, broker_id: i32) -> Result<Arc<C::Conn>, ClientError>

Get-or-connect to a specific broker id. The pool must have already learned the (id, address) mapping with refresh_brokers.

When the broker is in its reconnect backoff, this method waits for the backoff to end before it dials. One call makes at most one connection attempt, to the next address of the broker.

§Errors

Returns ClientError::Disconnected for a broker id that the pool does not know, the resolve error, or the dial error.

Source

pub fn evict(&self, broker_id: i32)

Drop the cached connection to broker_id, if there is one, so the next get reconnects.

Call this after a send fails. A bounced or failed-over broker must not be retried over its dead, cached socket. As Kafka does after a disconnect, the next connection waits the reconnect backoff and resolves the host again.

Source

pub fn evict_bootstrap(&self)

Drop the cached bootstrap connection so the next bootstrap_connection re-iterates the bootstrap addresses and reconnects to a live broker.

The pool keys the bootstrap connection by the synthetic id -1, which no real broker id matches, so evict can never reach it.

Source

pub fn replace_bootstrap(&self, bootstrap: Vec<SocketAddr>)

Replace the bootstrap address list and drop the cached bootstrap connection so the next bootstrap send dials the fresh addresses.

Source

pub fn replace_bootstrap_with_server_names( &self, bootstrap: Vec<(SocketAddr, String)>, )

Replace bootstrap addresses while retaining their TLS server names.

The bootstrap node keeps its reconnect backoff and failure counts, so a retry loop that calls this after each failure still backs off. Until the next refresh_brokers with brokers, least_loaded uses the bootstrap connection.

Source

pub fn prefer_bootstrap(&self)

Make least_loaded use the bootstrap connection until the next refresh_brokers with brokers.

Source

pub fn rebootstrap(&self, bootstrap: Vec<SocketAddr>)

Replace bootstrap addresses and discard every connection and advertised broker address learned from stale metadata.

Source

pub fn rebootstrap_with_server_names( &self, bootstrap: Vec<(SocketAddr, String)>, )

Replace all broker state while retaining bootstrap TLS server names.

Source

pub async fn bootstrap_connection(&self) -> Result<Arc<C::Conn>, ClientError>

Get-or-connect to the first reachable bootstrap address. The bootstrap connection is cached under the synthetic broker id -1.

One call dials each bootstrap address at most once, starting after the address that failed last. When every address fails, the next call waits the reconnect backoff first.

§Errors

Returns the error of the last address, an authentication failure at once, or ClientError::Disconnected for an empty address list.

Source

pub async fn least_loaded(&self) -> Result<Arc<C::Conn>, ClientError>

Get-or-connect to the least loaded known broker, as Kafka’s NetworkClient.leastLoadedNode picks the node for a request with no fixed target. Before the pool knows a broker, this is the bootstrap connection.

The order of preference:

  1. An open connection with no request in flight.
  2. The open connection with the fewest requests in flight.
  3. A broker out of its reconnect backoff, the one with the oldest connection attempt first, and a broker never dialed before all.
  4. The broker whose reconnect backoff ends first.
§Errors

Returns the error of get or bootstrap_connection.

Source

pub fn open_connection( &self, preferred: Option<i32>, ) -> Option<(i32, Arc<C::Conn>)>

An open connection with its id, without a new connection attempt: the one of preferred while it is open, or else the one with the fewest requests in flight. The bootstrap connection has id -1.

Source

pub async fn refresh_brokers(&self, brokers: &[BrokerInfo])

Update the (id, host, port) registry from a list of brokers, which usually comes from a MetadataResponse. This method opens no new connections, and it does not resolve the hosts: the pool resolves a host each time it needs new addresses, as Kafka does.

This method skips brokers that advertise port 0, because that is not a dialable address. It shows up for in-process test brokers whose advertised port never got rewritten to the real bound port. When the registry leaves such an entry out, get reports Disconnected for that id. The caller can then fall back to the bootstrap connection instead of trying a doomed host:0 connect.

A broker whose host or port changed loses its cached connection and addresses.

Source

pub fn knows_broker(&self, broker_id: i32) -> bool

Whether the registry knows a dialable address for this broker id. It knows one when refresh_brokers learned it and the port was not 0. A caller can use this to choose between a route to a specific broker and a fallback to the bootstrap connection, without a speculative connect.

Source

pub fn broker_ids(&self) -> Vec<i32>

Return the broker ids from the most recent usable metadata.

The deterministic order keeps metadata failover predictable. Callers use this list to exhaust the last-known cluster before deciding that a fresh bootstrap is required.

Source

pub fn broker_ids_by_load(&self) -> Vec<i32>

broker_ids, with the brokers that have an open connection first, fewest requests in flight first, then the others in id order.

Kafka sends a metadata request to NetworkClient.leastLoadedNode. A broker answers the requests of one connection in order, so a request queued behind a parked long-poll Fetch waits for up to the fetch’s max_wait_ms. A caller that walks every broker until one answers, as the metadata refresh does, walks them in this order.

Source

pub fn finalized_features(&self) -> FinalizedFeatures

The finalized feature levels with the highest epoch that any connection of the pool received, as Kafka’s ApiVersions.getMaxFinalizedFeaturesInfo gives them.

Source

pub fn close_all(self)

Close every open connection in the pool. Consumes the pool.

Auto Trait Implementations§

§

impl<C = TcpConnector> !Freeze for BrokerPool<C>

§

impl<C = TcpConnector> !RefUnwindSafe for BrokerPool<C>

§

impl<C = TcpConnector> !UnwindSafe for BrokerPool<C>

§

impl<C> Send for BrokerPool<C>

§

impl<C> Sync for BrokerPool<C>

§

impl<C> Unpin for BrokerPool<C>
where C: Unpin,

§

impl<C> UnsafeUnpin for BrokerPool<C>
where C: UnsafeUnpin,

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