From 27902bc5f4ccf674c1f36d54f2182dcf3615ffe6 Mon Sep 17 00:00:00 2001 From: Greg Heartsfield Date: Tue, 27 Dec 2022 10:28:56 -0600 Subject: [PATCH] improvement: move reader mutex closer to DB connection acquisition --- src/db.rs | 5 +++++ src/server.rs | 7 +------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/db.rs b/src/db.rs index 5f17f80..8f9ba56 100644 --- a/src/db.rs +++ b/src/db.rs @@ -762,9 +762,14 @@ pub async fn db_query( pool: SqlitePool, query_tx: tokio::sync::mpsc::Sender, mut abandon_query_rx: tokio::sync::oneshot::Receiver<()>, + safe_to_read: Arc>, ) { let pre_spawn_start = Instant::now(); task::spawn_blocking(move || { + { + // if we are waiting on a checkpoint, stop until it is complete + let _ = safe_to_read.blocking_lock(); + } let db_queue_time = pre_spawn_start.elapsed(); // if the queue time was very long (>5 seconds), spare the DB and abort. if db_queue_time > Duration::from_secs(5) { diff --git a/src/server.rs b/src/server.rs index ef97e29..bf77d94 100644 --- a/src/server.rs +++ b/src/server.rs @@ -687,13 +687,8 @@ async fn nostr_server( previous_query.send(()).ok(); } if s.needs_historical_events() { - { - // acquire and immediately release lock; this ensures we do not start new queries during a wal checkpoint. - let _ = safe_to_read.lock().await; - trace!("passed safe_to_read lock"); - } // start a database query. this spawns a blocking database query on a worker thread. - db::db_query(s, cid.to_owned(), pool.clone(), query_tx.clone(), abandon_query_rx).await; + db::db_query(s, cid.to_owned(), pool.clone(), query_tx.clone(), abandon_query_rx,safe_to_read.clone()).await; } }, Err(e) => {