From 0da534d5249a9111f8e1af0ff517526e2c66cdb0 Mon Sep 17 00:00:00 2001 From: Ellie Huxtable Date: Wed, 8 May 2024 17:28:52 +0100 Subject: fix: add incremental rebuild to daemon loop (#2010) --- crates/atuin-daemon/src/server/sync.rs | 35 +++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) (limited to 'crates/atuin-daemon/src/server/sync.rs') diff --git a/crates/atuin-daemon/src/server/sync.rs b/crates/atuin-daemon/src/server/sync.rs index de34779c..ba037d4e 100644 --- a/crates/atuin-daemon/src/server/sync.rs +++ b/crates/atuin-daemon/src/server/sync.rs @@ -2,14 +2,32 @@ use eyre::Result; use rand::Rng; use tokio::time::{self, MissedTickBehavior}; +use atuin_client::database::Sqlite as HistoryDatabase; use atuin_client::{ + encryption, + history::store::HistoryStore, record::{sqlite_store::SqliteStore, sync}, settings::Settings, }; -pub async fn worker(settings: Settings, store: SqliteStore) -> Result<()> { +use atuin_dotfiles::store::{var::VarStore, AliasStore}; + +pub async fn worker( + settings: Settings, + store: SqliteStore, + history_store: HistoryStore, + history_db: HistoryDatabase, +) -> Result<()> { tracing::info!("booting sync worker"); + let encryption_key: [u8; 32] = encryption::load_key(&settings)?.into(); + let host_id = Settings::host_id().expect("failed to get host_id"); + let alias_store = AliasStore::new(store.clone(), host_id, encryption_key); + let var_store = VarStore::new(store.clone(), host_id, encryption_key); + + // Don't backoff by more than 30 mins (with a random jitter of up to 1 min) + let max_interval: f64 = 60.0 * 30.0 + rand::thread_rng().gen_range(0.0..60.0); + let mut ticker = time::interval(time::Duration::from_secs(settings.daemon.sync_frequency)); // IMPORTANT: without this, if we miss ticks because a sync takes ages or is otherwise delayed, @@ -24,13 +42,13 @@ pub async fn worker(settings: Settings, store: SqliteStore) -> Result<()> { if let Err(e) = res { tracing::error!("sync tick failed with {e}"); + let mut rng = rand::thread_rng(); - let new_interval = ticker.period().as_secs_f64() * rng.gen_range(2.0..2.2); + let mut new_interval = ticker.period().as_secs_f64() * rng.gen_range(2.0..2.2); - // Don't backoff by more than 30 mins - if new_interval > 60.0 * 30.0 { - continue; + if new_interval > max_interval { + new_interval = max_interval; } ticker = time::interval(time::Duration::from_secs(new_interval as u64)); @@ -46,6 +64,13 @@ pub async fn worker(settings: Settings, store: SqliteStore) -> Result<()> { "sync complete" ); + history_store + .incremental_build(&history_db, &downloaded) + .await?; + + alias_store.build().await?; + var_store.build().await?; + // Reset backoff on success if ticker.period().as_secs() != settings.daemon.sync_frequency { ticker = time::interval(time::Duration::from_secs(settings.daemon.sync_frequency)); -- cgit v1.3.1