From 50b84a17f932f6934f0f373da6e9ee3642b750ed Mon Sep 17 00:00:00 2001 From: Avinash Sajjanshetty Date: Tue, 20 May 2025 11:48:00 +0530 Subject: [PATCH 1/2] create a connection only if required to spawn a bg thread for background sync, we need a connection. however, we are creating a connection even if no `sync_interval` was configured. --- libsql/src/database/builder.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libsql/src/database/builder.rs b/libsql/src/database/builder.rs index a8be27598e..c31f7cadf7 100644 --- a/libsql/src/database/builder.rs +++ b/libsql/src/database/builder.rs @@ -644,11 +644,11 @@ cfg_sync! { } let mut bg_abort: Option> = None; - let conn = db.connect()?; - - let sync_ctx = db.sync_ctx.as_ref().unwrap().clone(); if let Some(sync_interval) = sync_interval { + let conn = db.connect()?; + let sync_ctx = db.sync_ctx.as_ref().unwrap().clone(); + let jh = tokio::spawn( async move { loop { From 3fc95ba597428919222ed757eb766ab7db347b3c Mon Sep 17 00:00:00 2001 From: Avinash Sajjanshetty Date: Tue, 20 May 2025 11:55:58 +0530 Subject: [PATCH 2/2] bugfix: call `bootstrap_db` before calling `connect` `bootstrap_db` calls the `export` endpoint and bootstraps the db quickly. If we call `connect` before calling `bootstrap_db`, it will create a local `.db` file and sync falls back to incremental bootstrap which is super slow --- libsql/src/database/builder.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libsql/src/database/builder.rs b/libsql/src/database/builder.rs index c31f7cadf7..b8b128cb5b 100644 --- a/libsql/src/database/builder.rs +++ b/libsql/src/database/builder.rs @@ -2,9 +2,8 @@ cfg_core! { use crate::EncryptionConfig; } -use crate::{Database, Result}; - use super::DbType; +use crate::{Database, Result}; /// A builder for [`Database`]. This struct can be used to build /// all variants of [`Database`]. These variants include: @@ -646,9 +645,16 @@ cfg_sync! { let mut bg_abort: Option> = None; if let Some(sync_interval) = sync_interval { - let conn = db.connect()?; let sync_ctx = db.sync_ctx.as_ref().unwrap().clone(); + { + let mut ctx = sync_ctx.lock().await; + crate::sync::bootstrap_db(&mut ctx).await?; + } + // db.connect creates a local db file, so it is important that we always call + // `bootstrap_db` (for synced dbs) before calling connect. Otherwise, the sync + // protocol skips calling `export` endpoint causing slowdown in initial bootstrap. + let conn = db.connect()?; let jh = tokio::spawn( async move { loop {