From 8ea6f7e6278e661d7d4c27c86534e117fb4e67bd Mon Sep 17 00:00:00 2001 From: weisd Date: Sat, 19 Apr 2025 01:52:27 +0800 Subject: [PATCH] fix scstore::new bugs, stop ns_lock --- ecstore/src/set_disk.rs | 111 +++++++++++++++++++--------------------- ecstore/src/store.rs | 24 ++++----- 2 files changed, 63 insertions(+), 72 deletions(-) diff --git a/ecstore/src/set_disk.rs b/ecstore/src/set_disk.rs index 0148935e..fc73bebe 100644 --- a/ecstore/src/set_disk.rs +++ b/ecstore/src/set_disk.rs @@ -59,12 +59,7 @@ use common::error::{Error, Result}; use futures::future::join_all; use glob::Pattern; use http::HeaderMap; -use lock::{ - // drwmutex::Options, - drwmutex::Options, - namespace_lock::{new_nslock, NsLockMap}, - LockApi, -}; +use lock::{namespace_lock::NsLockMap, LockApi}; use madmin::heal_commands::{HealDriveInfo, HealResultItem}; use md5::{Digest as Md5Digest, Md5}; use rand::{ @@ -3672,33 +3667,33 @@ impl ObjectIO for SetDisks { async fn put_object(&self, bucket: &str, object: &str, data: &mut PutObjReader, opts: &ObjectOptions) -> Result { let disks = self.disks.read().await; - let mut _ns = None; - if !opts.no_lock { - let paths = vec![object.to_string()]; - let ns_lock = new_nslock( - Arc::clone(&self.ns_mutex), - self.locker_owner.clone(), - bucket.to_string(), - paths, - self.lockers.clone(), - ) - .await; - if !ns_lock - .0 - .write() - .await - .get_lock(&Options { - timeout: Duration::from_secs(5), - retry_interval: Duration::from_secs(1), - }) - .await - .map_err(|err| Error::from_string(err.to_string()))? - { - return Err(Error::from_string("can not get lock. please retry".to_string())); - } + // let mut _ns = None; + // if !opts.no_lock { + // let paths = vec![object.to_string()]; + // let ns_lock = new_nslock( + // Arc::clone(&self.ns_mutex), + // self.locker_owner.clone(), + // bucket.to_string(), + // paths, + // self.lockers.clone(), + // ) + // .await; + // if !ns_lock + // .0 + // .write() + // .await + // .get_lock(&Options { + // timeout: Duration::from_secs(5), + // retry_interval: Duration::from_secs(1), + // }) + // .await + // .map_err(|err| Error::from_string(err.to_string()))? + // { + // return Err(Error::from_string("can not get lock. please retry".to_string())); + // } - _ns = Some(ns_lock); - } + // _ns = Some(ns_lock); + // } let mut user_defined = opts.user_defined.clone().unwrap_or_default(); @@ -4165,33 +4160,33 @@ impl StorageAPI for SetDisks { unimplemented!() } async fn get_object_info(&self, bucket: &str, object: &str, opts: &ObjectOptions) -> Result { - let mut _ns = None; - if !opts.no_lock { - let paths = vec![object.to_string()]; - let ns_lock = new_nslock( - Arc::clone(&self.ns_mutex), - self.locker_owner.clone(), - bucket.to_string(), - paths, - self.lockers.clone(), - ) - .await; - if !ns_lock - .0 - .write() - .await - .get_lock(&Options { - timeout: Duration::from_secs(5), - retry_interval: Duration::from_secs(1), - }) - .await - .map_err(|err| Error::from_string(err.to_string()))? - { - return Err(Error::from_string("can not get lock. please retry".to_string())); - } + // let mut _ns = None; + // if !opts.no_lock { + // let paths = vec![object.to_string()]; + // let ns_lock = new_nslock( + // Arc::clone(&self.ns_mutex), + // self.locker_owner.clone(), + // bucket.to_string(), + // paths, + // self.lockers.clone(), + // ) + // .await; + // if !ns_lock + // .0 + // .write() + // .await + // .get_lock(&Options { + // timeout: Duration::from_secs(5), + // retry_interval: Duration::from_secs(1), + // }) + // .await + // .map_err(|err| Error::from_string(err.to_string()))? + // { + // return Err(Error::from_string("can not get lock. please retry".to_string())); + // } - _ns = Some(ns_lock); - } + // _ns = Some(ns_lock); + // } let (fi, _, _) = self.get_object_fileinfo(bucket, object, opts, false).await?; // warn!("get object_info fi {:?}", &fi); diff --git a/ecstore/src/store.rs b/ecstore/src/store.rs index 037f82c9..4bd2067f 100644 --- a/ecstore/src/store.rs +++ b/ecstore/src/store.rs @@ -521,28 +521,24 @@ impl ECStore { } } - let mut server_pools = Vec::new(); + let mut server_pools = vec![PoolAvailableSpace::default(); self.pools.len()]; for (i, zinfo) in infos.iter().enumerate() { if zinfo.is_empty() { - server_pools.push(PoolAvailableSpace { + server_pools[i] = PoolAvailableSpace { index: i, ..Default::default() - }); + }; continue; } - if !is_meta_bucketname(bucket) { - let avail = has_space_for(zinfo, size).await.unwrap_or_default(); + if !is_meta_bucketname(bucket) && !has_space_for(zinfo, size).await.unwrap_or_default() { + server_pools[i] = PoolAvailableSpace { + index: i, + ..Default::default() + }; - if !avail { - server_pools.push(PoolAvailableSpace { - index: i, - ..Default::default() - }); - - continue; - } + continue; } let mut available = 0; @@ -2530,7 +2526,7 @@ async fn get_disk_infos(disks: &[Option]) -> Vec> { res } -#[derive(Debug, Default)] +#[derive(Debug, Default, Clone)] pub struct PoolAvailableSpace { pub index: usize, pub available: u64, // in bytes