From 271823e278687f749fb008bcf58ed5f8420f80b3 Mon Sep 17 00:00:00 2001 From: kjuulh Date: Thu, 25 Sep 2025 10:49:29 +0200 Subject: [PATCH] feat: reset after failure Signed-off-by: kjuulh --- crates/noleader/src/backend/postgres.rs | 26 ++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/crates/noleader/src/backend/postgres.rs b/crates/noleader/src/backend/postgres.rs index a3c5277..6271d3d 100644 --- a/crates/noleader/src/backend/postgres.rs +++ b/crates/noleader/src/backend/postgres.rs @@ -144,18 +144,22 @@ impl BackendEdge for PostgresBackend { let res = match res { Ok(res) => res, - Err(e) => match &e { - sqlx::Error::Database(database_error) => { - if database_error.is_unique_violation() { - anyhow::bail!("update conflict: another leader holds lock") - } else { + Err(e) => { + self.revision.store(0, Ordering::Relaxed); + + match &e { + sqlx::Error::Database(database_error) => { + if database_error.is_unique_violation() { + anyhow::bail!("update conflict: another leader holds lock") + } else { + anyhow::bail!(e); + } + } + _ => { anyhow::bail!(e); } } - _ => { - anyhow::bail!(e); - } - }, + } }; match res { @@ -170,6 +174,8 @@ impl BackendEdge for PostgresBackend { // Only update our local revision if the update succeeded with our expected value self.revision.store(rec.revision as u64, Ordering::Relaxed); } else { + self.revision.store(0, Ordering::Relaxed); + anyhow::bail!( "update conflict: expected value={}, revision={}, got value={}, revision={}", val.0.to_string(), @@ -207,6 +213,8 @@ impl BackendEdge for PostgresBackend { .await .context("failed to release lock, it will expire naturally")?; + self.revision.store(0, Ordering::Relaxed); + Ok(()) } }