todo:put_object_part

This commit is contained in:
weisd
2024-07-09 10:47:44 +08:00
parent 16f7368514
commit 80688be059
3 changed files with 31 additions and 9 deletions

View File

@@ -24,7 +24,7 @@ use crate::{
endpoint::{Endpoint, Endpoints},
file_meta::FileMeta,
format::{DistributionAlgoVersion, FormatV3},
store_api::FileInfo,
store_api::{FileInfo, RawFileInfo},
utils,
};
@@ -218,6 +218,7 @@ impl LocalDisk {
Ok(())
}
/// read xl.meta raw data
async fn read_raw(
&self,
bucket: &str,
@@ -480,7 +481,7 @@ impl DiskAPI for LocalDisk {
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 {
self.rename_all(&src_data_path, &dst_data_path, &skipParent).await?;
}
@@ -566,7 +567,7 @@ impl DiskAPI for LocalDisk {
org_volume: &str,
volume: &str,
path: &str,
version_id: &str,
version_id: Uuid,
opts: ReadOptions,
) -> Result<FileInfo> {
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?;
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 })
}
}

View File

@@ -4,8 +4,9 @@ use anyhow::{Error, Result};
use bytes::Bytes;
use time::OffsetDateTime;
use tokio::io::DuplexStream;
use uuid::Uuid;
use crate::store_api::FileInfo;
use crate::store_api::{FileInfo, RawFileInfo};
#[async_trait::async_trait]
pub trait DiskAPI: Debug + Send + Sync + 'static {
@@ -34,9 +35,10 @@ pub trait DiskAPI: Debug + Send + Sync + 'static {
org_volume: &str,
volume: &str,
path: &str,
version_id: &str,
version_id: Uuid,
opts: ReadOptions,
) -> Result<FileInfo>;
async fn read_xl(&self, volume: &str, path: &str, read_data: bool) -> Result<RawFileInfo>;
}
pub struct VolumeInfo {

View File

@@ -13,6 +13,8 @@ pub const BLOCK_SIZE_V2: usize = 1048576; // 1M
#[derive(Debug, Clone)]
pub struct FileInfo {
pub name: String,
pub volume: String,
pub version_id: Uuid,
pub erasure: ErasureInfo,
pub deleted: bool,
@@ -20,7 +22,7 @@ pub struct FileInfo {
pub data_dir: Uuid,
pub mod_time: OffsetDateTime,
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.
}
@@ -42,6 +44,8 @@ impl Default for FileInfo {
size: Default::default(),
data: Default::default(),
fresh: Default::default(),
name: Default::default(),
volume: Default::default(),
}
}
}
@@ -62,7 +66,7 @@ impl FileInfo {
};
Self {
erasure: ErasureInfo {
algorithm: ERASURE_ALGORITHM,
algorithm: String::from(ERASURE_ALGORITHM),
data_blocks: data_blocks,
parity_blocks: parity_blocks,
block_size: BLOCK_SIZE_V2,
@@ -89,11 +93,15 @@ impl FileInfo {
}
}
pub struct RawFileInfo {
pub buf: Vec<u8>,
}
#[derive(Debug, Default, Clone)]
// ErasureInfo holds erasure coding and bitrot related information.
pub struct ErasureInfo {
// 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
pub data_blocks: usize,
// ParityBlocks is the number of parity blocks for erasure-coding