mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-13 08:36:54 +00:00
refactor: NamespaceLock (nslock), AHM→Heal Crate, and Lock/Clippy Fixes (#1664)
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: weisd <2057561+weisd@users.noreply.github.com> Co-authored-by: houseme <housemecn@gmail.com>
This commit is contained in:
+11
-132
@@ -17,6 +17,8 @@
|
||||
// ============================================================================
|
||||
|
||||
// Application Layer Modules
|
||||
pub mod distributed_lock;
|
||||
pub mod local_lock;
|
||||
pub mod namespace;
|
||||
|
||||
// Abstraction Layer Modules
|
||||
@@ -27,7 +29,6 @@ pub mod fast_lock;
|
||||
|
||||
// Core Modules
|
||||
pub mod error;
|
||||
pub mod guard;
|
||||
pub mod types;
|
||||
|
||||
// ============================================================================
|
||||
@@ -38,6 +39,7 @@ pub mod types;
|
||||
pub use crate::{
|
||||
// Client interfaces
|
||||
client::{LockClient, local::LocalClient},
|
||||
distributed_lock::DistributedLockGuard,
|
||||
// Error types
|
||||
error::{LockError, Result},
|
||||
// Fast Lock System exports
|
||||
@@ -45,9 +47,8 @@ pub use crate::{
|
||||
BatchLockRequest, BatchLockResult, DisabledLockManager, FastLockGuard, FastObjectLockManager, LockManager, LockMode,
|
||||
LockResult, ObjectKey, ObjectLockInfo, ObjectLockRequest, metrics::AggregatedMetrics,
|
||||
},
|
||||
guard::LockGuard,
|
||||
// Main components
|
||||
namespace::{NamespaceLock, NamespaceLockManager},
|
||||
namespace::{NamespaceLock, NamespaceLockGuard, NamespaceLockWrapper},
|
||||
// Core types
|
||||
types::{
|
||||
HealthInfo, HealthStatus, LockId, LockInfo, LockMetadata, LockPriority, LockRequest, LockResponse, LockStats, LockStatus,
|
||||
@@ -81,6 +82,7 @@ use std::sync::Arc;
|
||||
use std::sync::OnceLock;
|
||||
|
||||
/// Enum wrapper for different lock manager implementations
|
||||
#[derive(Debug)]
|
||||
pub enum GlobalLockManager {
|
||||
Enabled(Arc<FastObjectLockManager>),
|
||||
Disabled(DisabledLockManager),
|
||||
@@ -157,51 +159,23 @@ impl LockManager for GlobalLockManager {
|
||||
|
||||
async fn acquire_read_lock(
|
||||
&self,
|
||||
bucket: impl Into<Arc<str>> + Send,
|
||||
object: impl Into<Arc<str>> + Send,
|
||||
key: ObjectKey,
|
||||
owner: impl Into<Arc<str>> + Send,
|
||||
) -> std::result::Result<FastLockGuard, LockResult> {
|
||||
match self {
|
||||
Self::Enabled(manager) => manager.acquire_read_lock(bucket, object, owner).await,
|
||||
Self::Disabled(manager) => manager.acquire_read_lock(bucket, object, owner).await,
|
||||
}
|
||||
}
|
||||
|
||||
async fn acquire_read_lock_versioned(
|
||||
&self,
|
||||
bucket: impl Into<Arc<str>> + Send,
|
||||
object: impl Into<Arc<str>> + Send,
|
||||
version: impl Into<Arc<str>> + Send,
|
||||
owner: impl Into<Arc<str>> + Send,
|
||||
) -> std::result::Result<FastLockGuard, LockResult> {
|
||||
match self {
|
||||
Self::Enabled(manager) => manager.acquire_read_lock_versioned(bucket, object, version, owner).await,
|
||||
Self::Disabled(manager) => manager.acquire_read_lock_versioned(bucket, object, version, owner).await,
|
||||
Self::Enabled(manager) => manager.acquire_read_lock(key, owner).await,
|
||||
Self::Disabled(manager) => manager.acquire_read_lock(key, owner).await,
|
||||
}
|
||||
}
|
||||
|
||||
async fn acquire_write_lock(
|
||||
&self,
|
||||
bucket: impl Into<Arc<str>> + Send,
|
||||
object: impl Into<Arc<str>> + Send,
|
||||
key: ObjectKey,
|
||||
owner: impl Into<Arc<str>> + Send,
|
||||
) -> std::result::Result<FastLockGuard, LockResult> {
|
||||
match self {
|
||||
Self::Enabled(manager) => manager.acquire_write_lock(bucket, object, owner).await,
|
||||
Self::Disabled(manager) => manager.acquire_write_lock(bucket, object, owner).await,
|
||||
}
|
||||
}
|
||||
|
||||
async fn acquire_write_lock_versioned(
|
||||
&self,
|
||||
bucket: impl Into<Arc<str>> + Send,
|
||||
object: impl Into<Arc<str>> + Send,
|
||||
version: impl Into<Arc<str>> + Send,
|
||||
owner: impl Into<Arc<str>> + Send,
|
||||
) -> std::result::Result<FastLockGuard, LockResult> {
|
||||
match self {
|
||||
Self::Enabled(manager) => manager.acquire_write_lock_versioned(bucket, object, version, owner).await,
|
||||
Self::Disabled(manager) => manager.acquire_write_lock_versioned(bucket, object, version, owner).await,
|
||||
Self::Enabled(manager) => manager.acquire_write_lock(key, owner).await,
|
||||
Self::Disabled(manager) => manager.acquire_write_lock(key, owner).await,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -290,98 +264,3 @@ pub fn get_global_fast_lock_manager() -> Arc<FastObjectLockManager> {
|
||||
panic!("Cannot get FastObjectLockManager when locks are disabled. Use get_global_lock_manager() instead.");
|
||||
})
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Convenience Functions
|
||||
// ============================================================================
|
||||
|
||||
/// Create a new namespace lock
|
||||
pub fn create_namespace_lock(namespace: String, _distributed: bool) -> NamespaceLock {
|
||||
// The distributed behavior is now determined by the type of clients added to the NamespaceLock
|
||||
// This function just creates an empty NamespaceLock
|
||||
NamespaceLock::new(namespace)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_global_lock_manager_basic() {
|
||||
let manager = get_global_lock_manager();
|
||||
|
||||
// Should be able to acquire locks
|
||||
let guard = manager.acquire_read_lock("bucket", "object", "owner").await;
|
||||
assert!(guard.is_ok());
|
||||
|
||||
// Test metrics
|
||||
let _metrics = manager.get_metrics();
|
||||
// Even if locks are disabled, metrics should be available (empty or real)
|
||||
// shard_count is usize so always >= 0
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_disabled_manager_direct() {
|
||||
let manager = DisabledLockManager::new();
|
||||
|
||||
// All operations should succeed immediately
|
||||
let guard = manager.acquire_read_lock("bucket", "object", "owner").await;
|
||||
assert!(guard.is_ok());
|
||||
assert!(guard.unwrap().is_disabled());
|
||||
|
||||
// Metrics should be empty
|
||||
let metrics = manager.get_metrics();
|
||||
assert!(metrics.is_empty());
|
||||
assert_eq!(manager.total_lock_count(), 0);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_enabled_manager_direct() {
|
||||
let manager = FastObjectLockManager::new();
|
||||
|
||||
// Operations should work normally
|
||||
let guard = manager.acquire_read_lock("bucket", "object", "owner").await;
|
||||
assert!(guard.is_ok());
|
||||
assert!(!guard.unwrap().is_disabled());
|
||||
|
||||
// Should have real metrics
|
||||
let _metrics = manager.get_metrics();
|
||||
// Note: total_lock_count might be > 0 due to previous lock acquisition
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_global_manager_enum_wrapper() {
|
||||
// Test the GlobalLockManager enum directly
|
||||
let enabled_manager = GlobalLockManager::Enabled(Arc::new(FastObjectLockManager::new()));
|
||||
let disabled_manager = GlobalLockManager::Disabled(DisabledLockManager::new());
|
||||
|
||||
assert!(!enabled_manager.is_disabled());
|
||||
assert!(disabled_manager.is_disabled());
|
||||
|
||||
// Test trait methods work for both
|
||||
let enabled_guard = enabled_manager.acquire_read_lock("bucket", "obj", "owner").await;
|
||||
let disabled_guard = disabled_manager.acquire_read_lock("bucket", "obj", "owner").await;
|
||||
|
||||
assert!(enabled_guard.is_ok());
|
||||
assert!(disabled_guard.is_ok());
|
||||
|
||||
assert!(!enabled_guard.unwrap().is_disabled());
|
||||
assert!(disabled_guard.unwrap().is_disabled());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_batch_operations_work() {
|
||||
let manager = get_global_lock_manager();
|
||||
|
||||
let batch = BatchLockRequest::new("owner")
|
||||
.add_read_lock("bucket", "obj1")
|
||||
.add_write_lock("bucket", "obj2");
|
||||
|
||||
let result = manager.acquire_locks_batch(batch).await;
|
||||
|
||||
// Should succeed regardless of whether locks are enabled or disabled
|
||||
assert!(result.all_acquired);
|
||||
assert_eq!(result.successful_locks.len(), 2);
|
||||
assert!(result.failed_locks.is_empty());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user