From 47018b4cff538c3d485a8b1d522dbe080af02dd9 Mon Sep 17 00:00:00 2001 From: naskya <m@naskya.net> Date: Thu, 1 Aug 2024 16:49:06 +0900 Subject: [PATCH] chore (backend-rs): set cache ttl --- packages/backend-rs/index.d.ts | 2 -- packages/backend-rs/index.js | 1 - packages/backend-rs/src/cache/bare.rs | 14 +++++++++-- packages/backend-rs/src/config/meta.rs | 11 +++++---- .../src/federation/nodeinfo/generate.rs | 23 +++++-------------- packages/backend-rs/src/misc/should_nyaify.rs | 6 +---- .../backend-rs/src/service/antenna/mod.rs | 2 +- packages/backend/src/boot/master.ts | 7 ------ 8 files changed, 26 insertions(+), 40 deletions(-) diff --git a/packages/backend-rs/index.d.ts b/packages/backend-rs/index.d.ts index 37c07f2f6a..10060ccc5a 100644 --- a/packages/backend-rs/index.d.ts +++ b/packages/backend-rs/index.d.ts @@ -1455,8 +1455,6 @@ export declare function updateAntennasOnNewNote(note: Note, noteAuthor: Acct, no export declare function updateMetaCache(): Promise<void> -export declare function updateNodeinfoCache(): Promise<void> - /** Usage statistics for this server. */ export interface Usage { users: Users diff --git a/packages/backend-rs/index.js b/packages/backend-rs/index.js index f7458cb3b0..b2ea8e0c4b 100644 --- a/packages/backend-rs/index.js +++ b/packages/backend-rs/index.js @@ -457,7 +457,6 @@ module.exports.unwatchNote = nativeBinding.unwatchNote module.exports.updateAntennaCache = nativeBinding.updateAntennaCache module.exports.updateAntennasOnNewNote = nativeBinding.updateAntennasOnNewNote module.exports.updateMetaCache = nativeBinding.updateMetaCache -module.exports.updateNodeinfoCache = nativeBinding.updateNodeinfoCache module.exports.UserEmojiModPerm = nativeBinding.UserEmojiModPerm module.exports.UserEvent = nativeBinding.UserEvent module.exports.UserProfileFfvisibility = nativeBinding.UserProfileFfvisibility diff --git a/packages/backend-rs/src/cache/bare.rs b/packages/backend-rs/src/cache/bare.rs index a6af17e0b8..a1b17b8789 100644 --- a/packages/backend-rs/src/cache/bare.rs +++ b/packages/backend-rs/src/cache/bare.rs @@ -14,13 +14,23 @@ struct TimedData<T: Clone> { } impl<T: Clone> Cache<T> { - pub const fn new(ttl: Option<Duration>) -> Self { + pub const fn new() -> Self { Self { cache: Mutex::new(TimedData { value: None, last_updated: DateTime::UNIX_EPOCH, }), - ttl, + ttl: None, + } + } + + pub const fn new_with_ttl(ttl: Duration) -> Self { + Self { + cache: Mutex::new(TimedData { + value: None, + last_updated: DateTime::UNIX_EPOCH, + }), + ttl: Some(ttl), } } diff --git a/packages/backend-rs/src/config/meta.rs b/packages/backend-rs/src/config/meta.rs index f0d7beddf8..18e0c874da 100644 --- a/packages/backend-rs/src/config/meta.rs +++ b/packages/backend-rs/src/config/meta.rs @@ -1,26 +1,27 @@ //! Server information use crate::{cache::Cache, database::db_conn, model::entity::meta}; +use chrono::Duration; use sea_orm::{prelude::*, ActiveValue}; type Meta = meta::Model; -static INSTANCE_META_CACHE: Cache<Meta> = Cache::new(None); +static INSTANCE_META_CACHE: Cache<Meta> = Cache::new_with_ttl(Duration::minutes(5)); #[macros::export(js_name = "fetchMeta")] pub async fn local_server_info() -> Result<Meta, DbErr> { - local_server_info_impl(true).await + local_server_info_impl(false).await } #[macros::export(js_name = "updateMetaCache")] pub async fn update() -> Result<(), DbErr> { - local_server_info_impl(false).await?; + local_server_info_impl(true).await?; Ok(()) } -async fn local_server_info_impl(use_cache: bool) -> Result<Meta, DbErr> { +async fn local_server_info_impl(force_update_cache: bool) -> Result<Meta, DbErr> { // try using cache - if use_cache { + if !force_update_cache { if let Some(cache) = INSTANCE_META_CACHE.get() { return Ok(cache); } diff --git a/packages/backend-rs/src/federation/nodeinfo/generate.rs b/packages/backend-rs/src/federation/nodeinfo/generate.rs index 430e5a1e7a..58baa7d64c 100644 --- a/packages/backend-rs/src/federation/nodeinfo/generate.rs +++ b/packages/backend-rs/src/federation/nodeinfo/generate.rs @@ -8,11 +8,12 @@ use crate::{ misc, model::entity::{note, user}, }; +use chrono::Duration; use sea_orm::prelude::*; use serde_json::json; use std::collections::HashMap; -static NODEINFO_CACHE: Cache<Nodeinfo21> = Cache::new(None); +static NODEINFO_CACHE: Cache<Nodeinfo21> = Cache::new_with_ttl(Duration::hours(1)); /// Fetches the number of total/active local users and local posts. /// @@ -122,11 +123,10 @@ async fn generate_nodeinfo_2_1() -> Result<Nodeinfo21, DbErr> { }) } -async fn nodeinfo_2_1_impl(use_cache: bool) -> Result<Nodeinfo21, DbErr> { - if use_cache { - if let Some(nodeinfo) = NODEINFO_CACHE.get() { - return Ok(nodeinfo); - } +/// Returns NodeInfo (version 2.1) of the local server. +pub async fn nodeinfo_2_1() -> Result<Nodeinfo21, DbErr> { + if let Some(nodeinfo) = NODEINFO_CACHE.get() { + return Ok(nodeinfo); } let nodeinfo = generate_nodeinfo_2_1().await?; @@ -137,11 +137,6 @@ async fn nodeinfo_2_1_impl(use_cache: bool) -> Result<Nodeinfo21, DbErr> { Ok(nodeinfo) } -/// Returns NodeInfo (version 2.1) of the local server. -pub async fn nodeinfo_2_1() -> Result<Nodeinfo21, DbErr> { - nodeinfo_2_1_impl(true).await -} - /// Returns NodeInfo (version 2.0) of the local server. pub async fn nodeinfo_2_0() -> Result<Nodeinfo20, DbErr> { Ok(nodeinfo_2_1().await?.into()) @@ -166,9 +161,3 @@ pub async fn nodeinfo_2_1_as_json() -> Result<serde_json::Value, Error> { pub async fn nodeinfo_2_0_as_json() -> Result<serde_json::Value, Error> { Ok(serde_json::to_value(nodeinfo_2_0().await?)?) } - -#[macros::ts_export(js_name = "updateNodeinfoCache")] -pub async fn update_cache() -> Result<(), DbErr> { - nodeinfo_2_1_impl(false).await?; - Ok(()) -} diff --git a/packages/backend-rs/src/misc/should_nyaify.rs b/packages/backend-rs/src/misc/should_nyaify.rs index 6b71068eb5..9f609c69a3 100644 --- a/packages/backend-rs/src/misc/should_nyaify.rs +++ b/packages/backend-rs/src/misc/should_nyaify.rs @@ -1,10 +1,6 @@ //! Determine whether to enable the cat language conversion -use crate::{ - cache, - database::db_conn, - model::entity::user, -}; +use crate::{cache, database::db_conn, model::entity::user}; use sea_orm::{DbErr, EntityTrait, QuerySelect, SelectColumns}; #[macros::errors] diff --git a/packages/backend-rs/src/service/antenna/mod.rs b/packages/backend-rs/src/service/antenna/mod.rs index e90693c6ac..975b1a66d8 100644 --- a/packages/backend-rs/src/service/antenna/mod.rs +++ b/packages/backend-rs/src/service/antenna/mod.rs @@ -6,7 +6,7 @@ use crate::{cache::Cache, database::db_conn, model::entity::antenna}; use sea_orm::prelude::*; use std::sync::Arc; -static ANTENNAS_CACHE: Cache<Arc<[antenna::Model]>> = Cache::new(None); +static ANTENNAS_CACHE: Cache<Arc<[antenna::Model]>> = Cache::new(); async fn update() -> Result<Arc<[antenna::Model]>, DbErr> { tracing::debug!("updating cache"); diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts index 801d2cf5fa..0585f34bc1 100644 --- a/packages/backend/src/boot/master.ts +++ b/packages/backend/src/boot/master.ts @@ -7,8 +7,6 @@ import { greet, removeOldAttestationChallenges, showServerInfo, - updateMetaCache, - updateNodeinfoCache, type Config, } from "backend-rs"; import { config } from "@/config.js"; @@ -29,7 +27,6 @@ export async function masterMain() { showEnvironment(); showNodejsVersion(); await connectDb(); - await updateMetaCache(); } catch (e) { bootLogger.error( `Fatal error occurred during initialization:\n${inspect(e)}`, @@ -51,10 +48,6 @@ export async function masterMain() { import("../daemons/server-stats.js").then((x) => x.default()); import("../daemons/queue-stats.js").then((x) => x.default()); - // Update meta cache every 5 minitues - setInterval(() => updateMetaCache(), 1000 * 60 * 5); - // Update nodeinfo cache every hour - setInterval(() => updateNodeinfoCache(), 1000 * 60 * 60); // Remove old attestation challenges setInterval(() => removeOldAttestationChallenges(), 1000 * 60 * 30); }