diff --git a/Cargo.lock b/Cargo.lock index 1338b38f..f8a4741d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2855,6 +2855,7 @@ name = "embucketd" version = "0.1.0" dependencies = [ "api-snowflake-rest", + "api-snowflake-rest-sessions", "axum 0.8.6", "catalog-metastore", "clap", diff --git a/crates/embucketd/Cargo.toml b/crates/embucketd/Cargo.toml index 3386a4d5..9d0bda90 100644 --- a/crates/embucketd/Cargo.toml +++ b/crates/embucketd/Cargo.toml @@ -8,6 +8,7 @@ license-file.workspace = true executor = { path = "../executor" } catalog-metastore = { path = "../catalog-metastore" } api-snowflake-rest = { path = "../api-snowflake-rest" } +api-snowflake-rest-sessions = { path = "../api-snowflake-rest-sessions" } axum = { workspace = true } clap = { workspace = true } console-subscriber = { version = "0.4.1" } diff --git a/crates/embucketd/src/main.rs b/crates/embucketd/src/main.rs index a0905472..10336f82 100644 --- a/crates/embucketd/src/main.rs +++ b/crates/embucketd/src/main.rs @@ -6,11 +6,13 @@ pub(crate) mod helpers; pub(crate) mod layers; pub(crate) mod metastore_config; +use crate::metastore_config::MetastoreBootstrapConfig; use api_snowflake_rest::server::layer::require_auth as snowflake_require_auth; use api_snowflake_rest::server::router::create_auth_router as create_snowflake_auth_router; use api_snowflake_rest::server::router::create_router as create_snowflake_router; use api_snowflake_rest::server::server_models::Config; use api_snowflake_rest::server::state::AppState as SnowflakeAppState; +use api_snowflake_rest_sessions::session::{SESSION_EXPIRATION_SECONDS, SessionStore}; use axum::middleware; use axum::{ Json, Router, @@ -41,8 +43,6 @@ use tracing_subscriber::fmt::format::FmtSpan; use tracing_subscriber::{Layer, layer::SubscriberExt, util::SubscriberInitExt}; use utoipa::OpenApi; use utoipa_swagger_ui::SwaggerUi; - -use crate::metastore_config::MetastoreBootstrapConfig; // use core_sqlite::SqliteDb; #[cfg(feature = "alloc-tracing")] @@ -166,6 +166,19 @@ async fn async_main( ); tracing::info!("Execution service created"); + let session_store = SessionStore::new(execution_svc.clone()); + + tokio::task::spawn({ + let session_store = session_store.clone(); + async move { + session_store + .continuously_delete_expired(tokio::time::Duration::from_secs( + SESSION_EXPIRATION_SECONDS, + )) + .await; + } + }); + let snowflake_state = SnowflakeAppState { execution_svc: execution_svc.clone(), config: snowflake_rest_cfg,