watcher.rs (1546B)
1 /* 2 This file is part of TALER 3 Copyright (C) 2022-2025, 2026 Taler Systems SA 4 5 TALER is free software; you can redistribute it and/or modify it under the 6 terms of the GNU Affero General Public License as published by the Free Software 7 Foundation; either version 3, or (at your option) any later version. 8 9 TALER is distributed in the hope that it will be useful, but WITHOUT ANY 10 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 11 A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. 12 13 You should have received a copy of the GNU Affero General Public License along with 14 TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> 15 */ 16 17 use sqlx::PgPool; 18 use taler_common::ExpoBackoffDecorr; 19 use tokio::time::sleep; 20 use tracing::error; 21 22 use super::LoopResult; 23 use crate::{ 24 config::RpcCfg, 25 rpc::{Rpc, RpcApi as _}, 26 }; 27 28 /// Wait for new block and notify arrival with postgreSQL notifications 29 pub async fn watcher(rpc_cfg: RpcCfg, pool: PgPool) { 30 let mut jitter = ExpoBackoffDecorr::default(); 31 loop { 32 let result: LoopResult<()> = async { 33 let mut rpc = Rpc::new(&rpc_cfg).await?; 34 loop { 35 sqlx::query("NOTIFY new_block").execute(&pool).await?; 36 rpc.wait_for_new_block().await?; 37 jitter.reset(); 38 } 39 } 40 .await; 41 if let Err(e) = result { 42 error!(target: "watcher", "{e}"); 43 sleep(jitter.backoff()).await; 44 } 45 } 46 }