mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-29 08:27:06 +00:00
todo:put_object_part
This commit is contained in:
+16
-4
@@ -24,7 +24,7 @@ use crate::{
|
|||||||
endpoint::{Endpoint, Endpoints},
|
endpoint::{Endpoint, Endpoints},
|
||||||
file_meta::FileMeta,
|
file_meta::FileMeta,
|
||||||
format::{DistributionAlgoVersion, FormatV3},
|
format::{DistributionAlgoVersion, FormatV3},
|
||||||
store_api::FileInfo,
|
store_api::{FileInfo, RawFileInfo},
|
||||||
utils,
|
utils,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -218,6 +218,7 @@ impl LocalDisk {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// read xl.meta raw data
|
||||||
async fn read_raw(
|
async fn read_raw(
|
||||||
&self,
|
&self,
|
||||||
bucket: &str,
|
bucket: &str,
|
||||||
@@ -480,7 +481,7 @@ impl DiskAPI for LocalDisk {
|
|||||||
|
|
||||||
fs::write(&src_file_path, fm_data).await?;
|
fs::write(&src_file_path, fm_data).await?;
|
||||||
|
|
||||||
let no_inline = src_data_path.has_root() && fi.data.is_empty() && fi.size > 0;
|
let no_inline = src_data_path.has_root() && fi.data.is_none() && fi.size > 0;
|
||||||
if no_inline {
|
if no_inline {
|
||||||
self.rename_all(&src_data_path, &dst_data_path, &skipParent).await?;
|
self.rename_all(&src_data_path, &dst_data_path, &skipParent).await?;
|
||||||
}
|
}
|
||||||
@@ -566,7 +567,7 @@ impl DiskAPI for LocalDisk {
|
|||||||
org_volume: &str,
|
org_volume: &str,
|
||||||
volume: &str,
|
volume: &str,
|
||||||
path: &str,
|
path: &str,
|
||||||
version_id: &str,
|
version_id: Uuid,
|
||||||
opts: ReadOptions,
|
opts: ReadOptions,
|
||||||
) -> Result<FileInfo> {
|
) -> Result<FileInfo> {
|
||||||
let file_path = self.get_object_path(volume, path)?;
|
let file_path = self.get_object_path(volume, path)?;
|
||||||
@@ -576,7 +577,18 @@ impl DiskAPI for LocalDisk {
|
|||||||
|
|
||||||
let (data, _) = self.read_raw(volume, file_dir, file_path, read_data).await?;
|
let (data, _) = self.read_raw(volume, file_dir, file_path, read_data).await?;
|
||||||
|
|
||||||
unimplemented!()
|
let meta = FileMeta::unmarshal(&data)?;
|
||||||
|
|
||||||
|
let fi = meta.into_fileinfo(volume, path, version_id, false, true)?;
|
||||||
|
Ok(fi)
|
||||||
|
}
|
||||||
|
async fn read_xl(&self, volume: &str, path: &str, read_data: bool) -> Result<RawFileInfo> {
|
||||||
|
let file_path = self.get_object_path(volume, path)?;
|
||||||
|
let file_dir = self.get_bucket_path(volume)?;
|
||||||
|
|
||||||
|
let (buf, _) = self.read_raw(volume, file_dir, file_path, read_data).await?;
|
||||||
|
|
||||||
|
Ok(RawFileInfo { buf })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,9 @@ use anyhow::{Error, Result};
|
|||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use time::OffsetDateTime;
|
use time::OffsetDateTime;
|
||||||
use tokio::io::DuplexStream;
|
use tokio::io::DuplexStream;
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
use crate::store_api::FileInfo;
|
use crate::store_api::{FileInfo, RawFileInfo};
|
||||||
|
|
||||||
#[async_trait::async_trait]
|
#[async_trait::async_trait]
|
||||||
pub trait DiskAPI: Debug + Send + Sync + 'static {
|
pub trait DiskAPI: Debug + Send + Sync + 'static {
|
||||||
@@ -34,9 +35,10 @@ pub trait DiskAPI: Debug + Send + Sync + 'static {
|
|||||||
org_volume: &str,
|
org_volume: &str,
|
||||||
volume: &str,
|
volume: &str,
|
||||||
path: &str,
|
path: &str,
|
||||||
version_id: &str,
|
version_id: Uuid,
|
||||||
opts: ReadOptions,
|
opts: ReadOptions,
|
||||||
) -> Result<FileInfo>;
|
) -> Result<FileInfo>;
|
||||||
|
async fn read_xl(&self, volume: &str, path: &str, read_data: bool) -> Result<RawFileInfo>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct VolumeInfo {
|
pub struct VolumeInfo {
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ pub const BLOCK_SIZE_V2: usize = 1048576; // 1M
|
|||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct FileInfo {
|
pub struct FileInfo {
|
||||||
|
pub name: String,
|
||||||
|
pub volume: String,
|
||||||
pub version_id: Uuid,
|
pub version_id: Uuid,
|
||||||
pub erasure: ErasureInfo,
|
pub erasure: ErasureInfo,
|
||||||
pub deleted: bool,
|
pub deleted: bool,
|
||||||
@@ -20,7 +22,7 @@ pub struct FileInfo {
|
|||||||
pub data_dir: Uuid,
|
pub data_dir: Uuid,
|
||||||
pub mod_time: OffsetDateTime,
|
pub mod_time: OffsetDateTime,
|
||||||
pub size: usize,
|
pub size: usize,
|
||||||
pub data: Vec<u8>,
|
pub data: Option<Vec<u8>>,
|
||||||
pub fresh: bool, // indicates this is a first time call to write FileInfo.
|
pub fresh: bool, // indicates this is a first time call to write FileInfo.
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,6 +44,8 @@ impl Default for FileInfo {
|
|||||||
size: Default::default(),
|
size: Default::default(),
|
||||||
data: Default::default(),
|
data: Default::default(),
|
||||||
fresh: Default::default(),
|
fresh: Default::default(),
|
||||||
|
name: Default::default(),
|
||||||
|
volume: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -62,7 +66,7 @@ impl FileInfo {
|
|||||||
};
|
};
|
||||||
Self {
|
Self {
|
||||||
erasure: ErasureInfo {
|
erasure: ErasureInfo {
|
||||||
algorithm: ERASURE_ALGORITHM,
|
algorithm: String::from(ERASURE_ALGORITHM),
|
||||||
data_blocks: data_blocks,
|
data_blocks: data_blocks,
|
||||||
parity_blocks: parity_blocks,
|
parity_blocks: parity_blocks,
|
||||||
block_size: BLOCK_SIZE_V2,
|
block_size: BLOCK_SIZE_V2,
|
||||||
@@ -89,11 +93,15 @@ impl FileInfo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct RawFileInfo {
|
||||||
|
pub buf: Vec<u8>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone)]
|
#[derive(Debug, Default, Clone)]
|
||||||
// ErasureInfo holds erasure coding and bitrot related information.
|
// ErasureInfo holds erasure coding and bitrot related information.
|
||||||
pub struct ErasureInfo {
|
pub struct ErasureInfo {
|
||||||
// Algorithm is the String representation of erasure-coding-algorithm
|
// Algorithm is the String representation of erasure-coding-algorithm
|
||||||
pub algorithm: &'static str,
|
pub algorithm: String,
|
||||||
// DataBlocks is the number of data blocks for erasure-coding
|
// DataBlocks is the number of data blocks for erasure-coding
|
||||||
pub data_blocks: usize,
|
pub data_blocks: usize,
|
||||||
// ParityBlocks is the number of parity blocks for erasure-coding
|
// ParityBlocks is the number of parity blocks for erasure-coding
|
||||||
|
|||||||
Reference in New Issue
Block a user