pub struct LeaderElection { /* private fields */ }Expand description
Leader election using PostgreSQL advisory locks.
Advisory locks provide a simple, reliable way to elect a leader without external coordination services. Key properties:
- Mutual exclusion: Only one session can hold a given lock ID at a time.
- Automatic release: If the connection dies, PostgreSQL releases the lock.
- Non-blocking try:
pg_try_advisory_lockreturns immediately with success/failure.
Each LeaderRole maps to a unique lock ID, allowing multiple independent
leader elections (e.g., separate leaders for cron scheduler and workflow timers).
The is_leader flag uses SeqCst ordering because:
- Multiple threads read this flag to decide whether to execute leader-only code
- We need visibility guarantees across threads immediately after acquiring/releasing
- The performance cost is negligible (leadership changes are rare)
Implementations§
Source§impl LeaderElection
impl LeaderElection
Sourcepub fn new(
pool: PgPool,
node_id: NodeId,
role: LeaderRole,
config: LeaderConfig,
) -> Self
pub fn new( pool: PgPool, node_id: NodeId, role: LeaderRole, config: LeaderConfig, ) -> Self
Create a new leader election instance.
Sourcepub fn shutdown_receiver(&self) -> Receiver<bool>
pub fn shutdown_receiver(&self) -> Receiver<bool>
Get a shutdown receiver.
Sourcepub async fn try_become_leader(&self) -> Result<bool>
pub async fn try_become_leader(&self) -> Result<bool>
Try to acquire leadership.
Sourcepub async fn refresh_lease(&self) -> Result<()>
pub async fn refresh_lease(&self) -> Result<()>
Refresh the leadership lease.
Sourcepub async fn release_leadership(&self) -> Result<()>
pub async fn release_leadership(&self) -> Result<()>
Release leadership.
Sourcepub async fn check_leader_health(&self) -> Result<bool>
pub async fn check_leader_health(&self) -> Result<bool>
Check if the current leader is healthy.
Sourcepub async fn get_leader(&self) -> Result<Option<LeaderInfo>>
pub async fn get_leader(&self) -> Result<Option<LeaderInfo>>
Get current leader info.
Auto Trait Implementations§
impl Freeze for LeaderElection
impl !RefUnwindSafe for LeaderElection
impl Send for LeaderElection
impl Sync for LeaderElection
impl Unpin for LeaderElection
impl !UnwindSafe for LeaderElection
Blanket Implementations§
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
Mutably borrows from an owned value. Read more
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> 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>
Converts
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>
Converts
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message
T in a tonic::Request