From 84f60edb2921f281275796dc5399287ca851fbd0 Mon Sep 17 00:00:00 2001 From: meh Date: Wed, 5 Aug 2026 09:17:43 +0700 Subject: [PATCH 1/2] chore: port to WorkTable 1.0.0-beta.5 --- Cargo.toml | 10 +++++----- migration/Cargo.toml | 4 ++-- src/app.rs | 9 ++++++--- src/db/tables.rs | 15 ++++++++------- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index bb2dd42..b35ef01 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,8 +12,8 @@ chrono = { version = "0.4", default-features = false, features = ["oldtime", "st clap = { version = "4.5", features = ["derive"] } config = { version = "0.15", default-features = false, features = ["toml"] } crossfire = { version = "3.1.10", features = ["tokio"] } -derive_more = { version = "2.1", features = ["full"] } -endpoint-libs = { version = "2.0", features = ["ws", "ws-http1"] } +derive_more = { version = "2.1.1", features = ["full"] } +endpoint-libs = { version = "=2.0.0", features = ["ws", "ws-http1"] } eyre = "0.6" reqwest = { version = "0.12", default-features = false, features = ["rustls-tls-webpki-roots", "json"] } rustls = { version = "0.23.39", default-features = false, features = ["ring", "logging", "std", "tls12"] } @@ -34,11 +34,11 @@ tokio = { version = "1.48", features = ["full", "rt-multi-thread"] } tracing = "0.1" url = "2.5.7" uuid = { version = "1.18", features = ["v4", "serde"] } -worktable = { version = "0.9.2" } -honey_id-types = "2.0" +worktable = { version = "=1.0.0-beta.5" } +honey_id-types = "=2.0.2" cert-provider = { git = "https://github.com/dVeon-loch/cert-provider.git", rev = "eb2387f28daf09539504c5b65766e656b7ec2c93", features = ["dns01"], optional = true } [features] s3-sync = ["worktable/s3-support"] acme = ["dep:cert-provider"] -cert-s3-sync = ["acme", "cert-provider/s3-sync"] \ No newline at end of file +cert-s3-sync = ["acme", "cert-provider/s3-sync"] diff --git a/migration/Cargo.toml b/migration/Cargo.toml index dd9d6db..58fe1c2 100644 --- a/migration/Cargo.toml +++ b/migration/Cargo.toml @@ -9,14 +9,14 @@ path = "src/main.rs" [dependencies] support_cafe = { path = "..", features = ["s3-sync"] } -worktable = { version = "0.9.2" } +worktable = { version = "=1.0.0-beta.5" } rkyv = "0.8.12" eyre = "0.6" clap = { version = "4.5", features = ["derive", "env"] } config = { version = "0.15", default-features = false, features = ["toml"] } serde = { version = "1.0", features = ["derive"] } smart-default = "0.7" -derive_more = { version = "2.1", features = ["full"] } +derive_more = { version = "2.1.1", features = ["full"] } tokio = { version = "1.48", features = ["rt-multi-thread", "macros", "fs", "io-util"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/src/app.rs b/src/app.rs index 0e513d3..1516972 100644 --- a/src/app.rs +++ b/src/app.rs @@ -9,7 +9,7 @@ use eyre::Result; use honey_id_types::HoneyIdClient; use honey_id_types::handlers::convenience_utils::token_management::TokenWorkTableStorage; use honey_id_types::id_entities::UserPublicId; -use tracing::{info, warn}; +use tracing::{error, info, warn}; use crate::codegen::model::{UserRole, type_registry}; use crate::config::Config; @@ -158,8 +158,11 @@ impl App { self.ctx.bot_service.shutdown().await; message_purge_task.abort(); tokio::select! { - _ = self.ctx.db.wait_for_ops() =>{ - warn!("Gracefully terminated all threads"); + result = self.ctx.db.wait_for_ops() =>{ + match result { + Ok(()) => warn!("Gracefully terminated all threads"), + Err(error) => error!(%error, "Failed to flush all WorkTable persistence operations"), + } }, _ = tokio::time::sleep(Duration::from_secs(15)) => { std::process::exit(20); diff --git a/src/db/tables.rs b/src/db/tables.rs index e14ff62..28e109d 100644 --- a/src/db/tables.rs +++ b/src/db/tables.rs @@ -187,12 +187,13 @@ impl Tables { }) } - pub async fn wait_for_ops(&self) { - self.app_config_table.wait_for_ops().await; - self.app_member_table.wait_for_ops().await; - self.chat_session_table.wait_for_ops().await; - self.support_message_table.wait_for_ops().await; - self.support_info_table.wait_for_ops().await; - self.user_table.wait_for_ops().await; + pub async fn wait_for_ops(&self) -> worktable::persistence::PersistenceResult { + self.app_config_table.wait_for_ops().await?; + self.app_member_table.wait_for_ops().await?; + self.chat_session_table.wait_for_ops().await?; + self.support_message_table.wait_for_ops().await?; + self.support_info_table.wait_for_ops().await?; + self.user_table.wait_for_ops().await?; + Ok(()) } } From 88bc78fb8d85b9d962d6144b9dd5f4557483945c Mon Sep 17 00:00:00 2001 From: meh Date: Wed, 5 Aug 2026 09:20:44 +0700 Subject: [PATCH 2/2] fix: drain every persistence queue on shutdown --- src/db/tables.rs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/db/tables.rs b/src/db/tables.rs index 28e109d..3d7b716 100644 --- a/src/db/tables.rs +++ b/src/db/tables.rs @@ -188,12 +188,20 @@ impl Tables { } pub async fn wait_for_ops(&self) -> worktable::persistence::PersistenceResult { - self.app_config_table.wait_for_ops().await?; - self.app_member_table.wait_for_ops().await?; - self.chat_session_table.wait_for_ops().await?; - self.support_message_table.wait_for_ops().await?; - self.support_info_table.wait_for_ops().await?; - self.user_table.wait_for_ops().await?; + let (app_config, app_member, chat_session, support_message, support_info, user) = tokio::join!( + self.app_config_table.wait_for_ops(), + self.app_member_table.wait_for_ops(), + self.chat_session_table.wait_for_ops(), + self.support_message_table.wait_for_ops(), + self.support_info_table.wait_for_ops(), + self.user_table.wait_for_ops(), + ); + app_config?; + app_member?; + chat_session?; + support_message?; + support_info?; + user?; Ok(()) } }