[pbs-devel] [PATCH proxmox-backup v9 15/46] datastore: local chunk reader: read chunks based on backend
Lukas Wagner
l.wagner at proxmox.com
Mon Jul 21 15:36:46 CEST 2025
On Mon Jul 21, 2025 at 3:12 PM CEST, Hannes Laimer wrote:
>> #[derive(Clone)]
>> pub struct LocalChunkReader {
>> store: Arc<DataStore>,
>> + backend: DatastoreBackend,
>> crypt_config: Option<Arc<CryptConfig>>,
>> crypt_mode: CryptMode,
>> }
>> @@ -24,8 +28,11 @@ impl LocalChunkReader {
>> crypt_config: Option<Arc<CryptConfig>>,
>> crypt_mode: CryptMode,
>> ) -> Self {
>> + // TODO: Error handling!
>> + let backend = store.backend().unwrap();
>
> Was this missed, or was this intentionally left in?
> I feel like we don't want to panic here :P
> (correct me if I'm wrong, but I think we would whenever anything goes
> wrong when connecting to s3?)
>
Good catch! I remember spotting this during my review, but somehow
forgot to note it down in my email, my bad.
>> Self {
>> store,
>> + backend,
>> crypt_config,
>> crypt_mode,
>> }
>> @@ -47,10 +54,26 @@ impl LocalChunkReader {
>> }
>> }
>>
>> +async fn fetch(s3_client: Arc<S3Client>, digest: &[u8; 32]) -> Result<DataBlob, Error> {
>> + let object_key = crate::s3::object_key_from_digest(digest)?;
>> + if let Some(response) = s3_client.get_object(object_key).await? {
>> + let bytes = response.content.collect().await?.to_bytes();
>> + DataBlob::from_raw(bytes.to_vec())
>> + } else {
>> + bail!("no object with digest {}", hex::encode(digest));
>> + }
>> +}
>> +
>> impl ReadChunk for LocalChunkReader {
>> fn read_raw_chunk(&self, digest: &[u8; 32]) -> Result<DataBlob, Error> {
>> - let chunk = self.store.load_chunk(digest)?;
>> + let chunk = match &self.backend {
>> + DatastoreBackend::Filesystem => self.store.load_chunk(digest)?,
>> + DatastoreBackend::S3(s3_client) => {
>> + proxmox_async::runtime::block_on(fetch(Arc::clone(s3_client), digest))?
>> + }
>> + };
>> self.ensure_crypt_mode(chunk.crypt_mode()?)?;
>> +
>> Ok(chunk)
>> }
>>
>> @@ -69,11 +92,14 @@ impl AsyncReadChunk for LocalChunkReader {
>> digest: &'a [u8; 32],
>> ) -> Pin<Box<dyn Future<Output = Result<DataBlob, Error>> + Send + 'a>> {
>> Box::pin(async move {
>> - let (path, _) = self.store.chunk_path(digest);
>> -
>> - let raw_data = tokio::fs::read(&path).await?;
>> -
>> - let chunk = DataBlob::load_from_reader(&mut &raw_data[..])?;
>> + let chunk = match &self.backend {
>> + DatastoreBackend::Filesystem => {
>> + let (path, _) = self.store.chunk_path(digest);
>> + let raw_data = tokio::fs::read(&path).await?;
>> + DataBlob::load_from_reader(&mut &raw_data[..])?
>> + }
>> + DatastoreBackend::S3(s3_client) => fetch(Arc::clone(s3_client), digest).await?,
>> + };
>> self.ensure_crypt_mode(chunk.crypt_mode()?)?;
>>
>> Ok(chunk)
>
>
>
> _______________________________________________
> pbs-devel mailing list
> pbs-devel at lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
More information about the pbs-devel
mailing list