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
impl BrokerTransport
Sourcepub 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>
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.
Sourcepub fn builder() -> BrokerTransportStartBuilder
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
impl BrokerTransport
Sourcepub async fn bound_producer(&self, role: &Role) -> Option<Arc<Producer>>
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.
Sourcepub async fn held_token(&self, role: &Role) -> Option<FencingToken>
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.
Trait Implementations§
Source§impl CoordinationTransport for BrokerTransport
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,
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,
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,
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,
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,
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§
impl !Freeze for BrokerTransport
impl !RefUnwindSafe for BrokerTransport
impl !UnwindSafe for BrokerTransport
impl Send for BrokerTransport
impl Sync for BrokerTransport
impl Unpin for BrokerTransport
impl UnsafeUnpin for BrokerTransport
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<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§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);