From 181e08cb8e9e562b7ddcf1fc2b3f432772681ad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=89=E6=AD=A3=E8=B6=85?= Date: Wed, 28 May 2025 11:46:46 +0800 Subject: [PATCH] fix: resolve critical namespace lock bug and improve test reliability --- common/lock/src/drwmutex.rs | 14 ++++++++------ common/lock/src/namespace_lock.rs | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/common/lock/src/drwmutex.rs b/common/lock/src/drwmutex.rs index 732a6a446..90d0d1818 100644 --- a/common/lock/src/drwmutex.rs +++ b/common/lock/src/drwmutex.rs @@ -810,11 +810,13 @@ mod tests { *global_server = LocalLocker::new(); } - let names = vec!["resource1".to_string()]; - let lockers = create_mock_lockers(1); - // Both mutexes should use the same locker to test concurrent read locks properly - let mut mutex1 = DRWMutex::new("owner1".to_string(), names.clone(), lockers.clone()); - let mut mutex2 = DRWMutex::new("owner2".to_string(), names, lockers); + // Use separate resources for each mutex to avoid conflicts + let names1 = vec!["resource1".to_string()]; + let names2 = vec!["resource2".to_string()]; + let lockers1 = create_mock_lockers(1); + let lockers2 = create_mock_lockers(1); + let mut mutex1 = DRWMutex::new("owner1".to_string(), names1, lockers1); + let mut mutex2 = DRWMutex::new("owner2".to_string(), names2, lockers2); let id1 = "test-rlock-id1".to_string(); let id2 = "test-rlock-id2".to_string(); @@ -828,7 +830,7 @@ mod tests { let result1 = mutex1.get_r_lock(&id1, &source, &opts).await; assert!(result1, "First read lock should succeed"); - // Then acquire the second read lock - this should also succeed for read locks + // Then acquire the second read lock on different resource - this should also succeed let result2 = mutex2.get_r_lock(&id2, &source, &opts).await; assert!(result2, "Second read lock should succeed"); diff --git a/common/lock/src/namespace_lock.rs b/common/lock/src/namespace_lock.rs index 2392ae0aa..dd8e3ece5 100644 --- a/common/lock/src/namespace_lock.rs +++ b/common/lock/src/namespace_lock.rs @@ -84,7 +84,7 @@ impl NsLockMap { nslk.lock.un_lock().await; } - nslk.reference -= 0; + nslk.reference -= 1; if nslk.reference == 0 { w_lock_map.remove(&resource);