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