From 23c23fd770146c1e34b349dc9f255328331f3f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A8=D0=B0=D1=82=D1=83=D0=BD=D0=BE=D0=B2=20=D0=90=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=BD?= Date: Tue, 7 May 2024 00:35:01 +0300 Subject: [PATCH] Add cache --- Cargo.lock | 146 +++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/core/file_utils.rs | 24 ++++++- 3 files changed, 170 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 8588d86..dcda5ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -78,6 +78,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "async-lock" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +dependencies = [ + "event-listener 4.0.3", + "event-listener-strategy", + "pin-project-lite", +] + [[package]] name = "async-trait" version = "0.1.80" @@ -283,6 +294,15 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -305,6 +325,15 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +[[package]] +name = "crossbeam-channel" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-epoch" version = "0.9.18" @@ -478,6 +507,38 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite", +] + [[package]] name = "fastrand" version = "2.1.0" @@ -948,6 +1009,16 @@ version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.21" @@ -1053,6 +1124,30 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "moka" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e0d88686dc561d743b40de8269b26eaf0dc58781bde087b0984646602021d08" +dependencies = [ + "async-lock", + "async-trait", + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "event-listener 5.3.0", + "futures-util", + "once_cell", + "parking_lot", + "quanta", + "rustc_version", + "smallvec", + "tagptr", + "thiserror", + "triomphe", + "uuid", +] + [[package]] name = "multer" version = "3.0.0" @@ -1206,6 +1301,35 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + +[[package]] +name = "parking_lot" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.5", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -1373,6 +1497,15 @@ dependencies = [ "erasable", ] +[[package]] +name = "redox_syscall" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +dependencies = [ + "bitflags 2.5.0", +] + [[package]] name = "regex" version = "1.10.4" @@ -1887,6 +2020,12 @@ dependencies = [ "libc", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "take_mut" version = "0.2.2" @@ -1908,6 +2047,7 @@ dependencies = [ "axum_typed_multipart", "dotenv", "futures", + "moka", "once_cell", "reqwest 0.11.23", "sentry", @@ -2239,6 +2379,12 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "triomphe" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" + [[package]] name = "try-lock" version = "0.2.5" diff --git a/Cargo.toml b/Cargo.toml index 576061e..8073cd5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,3 +32,4 @@ reqwest = { version = "0.11.10", features = [ "stream", "multipart", ], default-features = false } +moka = { version = "0.12.7", features = ["future"] } diff --git a/src/core/file_utils.rs b/src/core/file_utils.rs index 515d3ef..ecb91a5 100644 --- a/src/core/file_utils.rs +++ b/src/core/file_utils.rs @@ -2,16 +2,18 @@ use std::pin::Pin; use axum::body::Bytes; use futures::TryStreamExt; +use once_cell::sync::Lazy; use serde::Serialize; use teloxide::{ net::Download, requests::Requester, - types::{ChatId, InputFile, MessageId}, + types::{ChatId, InputFile, MessageId, Recipient}, Bot, }; use tokio::io::AsyncRead; use tokio_util::compat::FuturesAsyncReadCompatExt; use tracing::log; +use moka::future::Cache; use super::bot::ROUND_ROBIN_BOT; use crate::config::CONFIG; @@ -28,6 +30,24 @@ pub struct MessageInfo { pub message_id: i32, } +pub static TEMP_FILES_CACHE: Lazy> = Lazy::new(|| { + Cache::builder() + .time_to_idle(std::time::Duration::from_secs(16)) + .max_capacity(4098) + .async_eviction_listener(|_data_id, message_id, _cause| { + Box::pin(async move { + let bot = ROUND_ROBIN_BOT.get_bot(); + let _ = bot + .delete_message( + Recipient::Id(ChatId(CONFIG.telegram_temp_chat_id)), + message_id, + ) + .await; + }) + }) + .build() +}); + pub async fn upload_file( file: Bytes, filename: String, @@ -79,6 +99,8 @@ pub async fn download_file(chat_id: i64, message_id: i32) -> Option v.path, Err(err) => {