From 49d52941806f930cd855facf025295e0d85e2142 Mon Sep 17 00:00:00 2001 From: Borja Aranda Date: Mon, 17 Feb 2025 14:33:24 +0100 Subject: [PATCH] Use parking_lot mutex --- Cargo.lock | 1 + mls_validation_service/Cargo.toml | 1 + .../src/cached_signature_verifier.rs | 32 +++++++++++-------- mls_validation_service/src/config.rs | 1 + 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6bc113286..7a680f7e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3586,6 +3586,7 @@ dependencies = [ "lru", "openmls", "openmls_rust_crypto", + "parking_lot 0.12.3", "rand", "thiserror 2.0.6", "tokio", diff --git a/mls_validation_service/Cargo.toml b/mls_validation_service/Cargo.toml index a924b93ef..504bff052 100644 --- a/mls_validation_service/Cargo.toml +++ b/mls_validation_service/Cargo.toml @@ -21,6 +21,7 @@ hex = { workspace = true } lru = "0.13.0" openmls = { workspace = true } openmls_rust_crypto = { workspace = true } +parking_lot.workspace = true thiserror.workspace = true tokio = { workspace = true, features = ["signal", "rt-multi-thread"] } tonic = { workspace = true } diff --git a/mls_validation_service/src/cached_signature_verifier.rs b/mls_validation_service/src/cached_signature_verifier.rs index 634531029..4961da4fd 100644 --- a/mls_validation_service/src/cached_signature_verifier.rs +++ b/mls_validation_service/src/cached_signature_verifier.rs @@ -1,6 +1,6 @@ use lru::LruCache; +use parking_lot::Mutex; use std::num::NonZeroUsize; -use tokio::sync::Mutex; use ethers::types::{BlockNumber, Bytes}; use xmtp_id::associations::AccountId; @@ -40,7 +40,7 @@ impl SmartContractSignatureVerifier for CachedSmartContractSignatureVerifier { block_number: Option, ) -> Result { if let Some(cached_response) = { - let mut cache = self.cache.lock().await; + let mut cache = self.cache.lock(); cache.get(&hash).cloned() } { return Ok(cached_response); @@ -51,7 +51,7 @@ impl SmartContractSignatureVerifier for CachedSmartContractSignatureVerifier { .is_valid_signature(account_id, hash, signature, block_number) .await?; - let mut cache = self.cache.lock().await; + let mut cache = self.cache.lock(); cache.put(hash, response.clone()); Ok(response) @@ -67,14 +67,14 @@ mod tests { VerifierError, }; - #[test] - fn test_cache_eviction() { + #[tokio::test] + async fn test_cache_eviction() { let mut cache: LruCache = LruCache::new(NonZeroUsize::new(1).unwrap()); - let hash1 = [0u8; 32]; - let hash2 = [1u8; 32]; + let key1 = [0u8; 32]; + let key2 = [1u8; 32]; - assert_ne!(hash1, hash2); + assert_ne!(key1, key2); let val1: ValidationResponse = ValidationResponse { is_valid: true, @@ -87,16 +87,20 @@ mod tests { error: None, }; - cache.put(hash1, val1.clone()); - let response = cache.get(&hash1).unwrap(); + cache.put(key1, val1.clone()); + let response = cache.get(&key1).unwrap(); + + // key1 is correctly cached assert_eq!(response.is_valid, val1.is_valid); assert_eq!(response.block_number, val1.block_number); - cache.put(hash2, val2.clone()); - assert!(cache.get(&hash1).is_none()); + cache.put(key2, val2.clone()); + + // key1 is evicted, shouldn't exist + assert!(cache.get(&key1).is_none()); - // And key2 is correctly cached. - let response2 = cache.get(&hash2).unwrap(); + // And key2 is correctly cached + let response2 = cache.get(&key2).unwrap(); assert_eq!(response2.is_valid, val2.is_valid); assert_eq!(response2.block_number, val2.block_number); } diff --git a/mls_validation_service/src/config.rs b/mls_validation_service/src/config.rs index 76d364f7b..2440950a2 100644 --- a/mls_validation_service/src/config.rs +++ b/mls_validation_service/src/config.rs @@ -1,5 +1,6 @@ use clap::Parser; use std::num::NonZeroUsize; + // Gather the command line arguments into a struct #[derive(Parser, Debug)] #[command(about = "MLS Validation Server")]