From df258c6ed3cbb92b7a03acb81d73106ff21d0dd6 Mon Sep 17 00:00:00 2001 From: "Nathan.fooo" <86001920+appflowy@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:15:19 +0800 Subject: [PATCH] fix: memory leak of workspace middleware (#337) --- src/middleware/access_control_mw.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/middleware/access_control_mw.rs b/src/middleware/access_control_mw.rs index 4603a9e9..00b1fef1 100644 --- a/src/middleware/access_control_mw.rs +++ b/src/middleware/access_control_mw.rs @@ -10,6 +10,8 @@ use async_trait::async_trait; use futures_util::future::LocalBoxFuture; use actix_web::web::Data; +use dashmap::DashMap; +use once_cell::sync::Lazy; use std::collections::HashMap; use std::future::{ready, Ready}; use std::ops::{Deref, DerefMut}; @@ -20,6 +22,8 @@ use crate::state::AppState; use app_error::AppError; use uuid::Uuid; +static RESOURCE_DEF_CACHE: Lazy> = Lazy::new(DashMap::new); + #[derive(Debug, Clone, Eq, PartialEq, Hash)] pub enum AccessResource { Workspace, @@ -176,11 +180,16 @@ where fn call(&self, mut req: ServiceRequest) -> Self::Future { let path = req.match_pattern().map(|pattern| { - let resource_ref = ResourceDef::new(pattern); + // Create ResourceDef will cause memory leak, so we use the cache to store the ResourceDef let mut path = req.match_info().clone(); - resource_ref.capture_match_info(&mut path); + RESOURCE_DEF_CACHE + .entry(pattern.to_owned()) + .or_insert_with(|| ResourceDef::new(pattern)) + .value() + .capture_match_info(&mut path); path }); + match path { None => { let fut = self.service.call(req);