From 8c733f39905bbe76a3d1adcd32fedec6fa21ccf0 Mon Sep 17 00:00:00 2001 From: Mateusz Jasiuk Date: Tue, 20 Aug 2024 10:23:39 +0200 Subject: [PATCH] bug: remove whole bonds in pairs (#103) --- chain/src/main.rs | 10 ++++++---- chain/src/repository/pos.rs | 25 ++++++++++++++----------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/chain/src/main.rs b/chain/src/main.rs index ff4a190f..c5973abe 100644 --- a/chain/src/main.rs +++ b/chain/src/main.rs @@ -244,10 +244,12 @@ async fn crawling_fn( // We first remove all the bonds that are not in the storage // anymore - repository::pos::clear_bonds( - transaction_conn, - removed_bonds_addresses, - )?; + if !removed_bonds_addresses.is_empty() { + repository::pos::clear_bonds( + transaction_conn, + removed_bonds_addresses, + )?; + } repository::pos::insert_bonds(transaction_conn, bonds_updates)?; repository::pos::insert_unbonds(transaction_conn, unbonds)?; diff --git a/chain/src/repository/pos.rs b/chain/src/repository/pos.rs index eb63489e..9efc22e8 100644 --- a/chain/src/repository/pos.rs +++ b/chain/src/repository/pos.rs @@ -20,19 +20,22 @@ pub fn clear_bonds( transaction_conn: &mut PgConnection, addresses: Vec<(Id, Id)>, ) -> anyhow::Result<()> { - let (sources, validators): (Vec, Vec) = addresses - .into_iter() - .map(|(source, validator)| (source.to_string(), validator.to_string())) - .unzip(); - - diesel::delete(bonds::table) - .filter(bonds::address.eq_any(sources).and( - bonds::validator_id.eq_any( - validators::table.select(validators::columns::id).filter( - validators::columns::namada_address.eq_any(validators), + let mut query = diesel::delete(bonds::table).into_boxed(); + + for (source, validator) in addresses { + query = query.filter( + bonds::address.eq(source.to_string()).and( + bonds::validator_id.eq_any( + validators::table.select(validators::columns::id).filter( + validators::columns::namada_address + .eq(validator.to_string()), + ), ), ), - )) + ); + } + + query .execute(transaction_conn) .context("Failed to remove bonds from db")?;