watcher.rs (1529B)
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::{config::RpcCfg, rpc::rpc_common}; 24 25 /// Wait for new block and notify arrival with postgreSQL notifications 26 pub async fn watcher(rpc_cfg: RpcCfg, pool: PgPool) { 27 let mut jitter = ExpoBackoffDecorr::default(); 28 loop { 29 let result: LoopResult<()> = async { 30 let mut rpc = rpc_common(&rpc_cfg).await?; 31 loop { 32 sqlx::query("NOTIFY new_block").execute(&pool).await?; 33 rpc.wait_for_new_block().await?; 34 jitter.reset(); 35 } 36 } 37 .await; 38 if let Err(e) = result { 39 error!(target: "watcher", "{e}"); 40 sleep(jitter.backoff()).await; 41 } 42 } 43 }