diff --git a/TODO.md b/TODO.md index 344f23eb3..378b13c23 100644 --- a/TODO.md +++ b/TODO.md @@ -17,6 +17,8 @@ - [x] 创建 CreateBucket - [x] 列表 ListBuckets - [ ] 桶下面的文件列表 ListObjects + - [x] 简单实现功能 + - [ ] 优化并发读取 - [ ] 删除 - [x] 详情 HeadBucket - [ ] 文件操作 diff --git a/ecstore/src/disk/local.rs b/ecstore/src/disk/local.rs index 074fce5c5..9de369ac8 100644 --- a/ecstore/src/disk/local.rs +++ b/ecstore/src/disk/local.rs @@ -877,6 +877,7 @@ impl DiskAPI for LocalDisk { async fn delete_volume(&self, volume: &str) -> Result<()> { let p = self.get_bucket_path(volume)?; + // TODO: 不能用递归删除,如果目录下面有文件,返回errVolumeNotEmpty fs::remove_dir_all(&p).await?; Ok(()) diff --git a/ecstore/src/peer.rs b/ecstore/src/peer.rs index ed92f68a0..7329923cb 100644 --- a/ecstore/src/peer.rs +++ b/ecstore/src/peer.rs @@ -368,6 +368,8 @@ impl PeerS3Client for LocalPeerS3Client { } } + // TODO: errVolumeNotEmpty 不删除,把已经删除的重新创建 + // TODO: reduceWriteQuorumErrs Ok(()) diff --git a/ecstore/src/store.rs b/ecstore/src/store.rs index bb0b5344c..bbcc49fa2 100644 --- a/ecstore/src/store.rs +++ b/ecstore/src/store.rs @@ -1,6 +1,6 @@ use crate::{ bucket_meta::BucketMetadata, - disk::{error::DiskError, DiskOption, DiskStore, WalkDirOptions, RUSTFS_META_BUCKET}, + disk::{error::DiskError, DeleteOptions, DiskOption, DiskStore, WalkDirOptions, BUCKET_META_PREFIX, RUSTFS_META_BUCKET}, disks_layout::DisksLayout, endpoints::EndpointServerPools, error::{Error, Result}, @@ -16,7 +16,7 @@ use futures::future::join_all; use http::HeaderMap; use s3s::{dto::StreamingBlob, Body}; use std::collections::{HashMap, HashSet}; -use tracing::warn; +use tracing::{debug, warn}; use uuid::Uuid; #[derive(Debug)] @@ -190,6 +190,43 @@ impl ECStore { Ok(ress) } + + async fn delete_all(&self, bucket: &str, prefix: &str) -> Result<()> { + let mut futures = Vec::new(); + for sets in self.pools.iter() { + for set in sets.disk_set.iter() { + for disk in set.disks.iter() { + if disk.is_none() { + continue; + } + + let disk = disk.as_ref().unwrap(); + futures.push(disk.delete( + bucket, + prefix, + DeleteOptions { + recursive: true, + immediate: false, + }, + )); + } + } + } + let results = join_all(futures).await; + + let mut errs = Vec::new(); + + for res in results { + match res { + Ok(_) => errs.push(None), + Err(e) => errs.push(Some(e)), + } + } + + debug!("store delete_all errs {:?}", errs); + + Ok(()) + } } #[derive(Debug, Default)] @@ -381,6 +418,9 @@ impl StorageAPI for ECStore { async fn delete_bucket(&self, bucket: &str) -> Result<()> { self.peer_sys.delete_bucket(bucket).await?; + // 删除meta + self.delete_all(RUSTFS_META_BUCKET, format!("{}/{}", BUCKET_META_PREFIX, bucket).as_str()) + .await?; Ok(()) } } diff --git a/rustfs/src/storage/ecfs.rs b/rustfs/src/storage/ecfs.rs index 223ddf9f2..8e8f53db5 100644 --- a/rustfs/src/storage/ecfs.rs +++ b/rustfs/src/storage/ecfs.rs @@ -20,7 +20,6 @@ use s3s::S3; use s3s::{S3Request, S3Response}; use std::fmt::Debug; use std::str::FromStr; -use tracing::warn; use transform_stream::AsyncTryStream; use ecstore::error::Result;