Saltar al contenido principal

HashDownloadPipeline

HashDownloadPipeline es una clase abstracta diseñada para manejar descargas usando adaptadores de almacenamiento basados en hash (HashStorageAdapter). Orquesta el proceso de escanear directorios, computar deltas con DeltaService, descargar chunks faltantes, y reconstruir archivos.

Esta pipeline es comúnmente usada para descargas desde sistemas de almacenamiento donde los chunks se identifican por hash.


Constructor

ParámetroTipoDescripción
storageArc<dyn HashStorageAdapter>Adaptador de almacenamiento basado en hash que se usará (se crea automáticamente con el cliente).
deltaArc<dyn DeltaService>DeltaService usado para generar índices y compararlos.
reconstructionArc<dyn ReconstructionService>ReconstructionService usado para reconstrucción de archivos locales.
validationArc<dyn ValidationService>ValidationService usado para validar archivos tras reconstruirlos.
configArc<RacDeltaConfig>Configuración base del cliente.

Métodos

MétodoDevuelveDescripción
execute(local_dir, strategy, remote_index, options)Result<(), DownloadError>Realiza un proceso completo de descarga para un directorio.
load_local_index(dir)Result<RDIndex, DownloadError>Crea un rd-index.json de un directorio dado.
save_local_index(local_dir, index)Result<(), DownloadError>Este método guardará el rd-index.json en el directorio dado.
find_local_index(local_dir)Result<Option<RDIndex>, DownloadError>Buscará un rd-index.json si existe en el directorio dado.
download_all_missing_chunks(plan, target, options)Result<Arc<dyn ChunkSource>, DownloadError>Este método descargará primero todos los chunks necesarios, y los guardará temporalmente en disco o memoria.
verify_and_delete_obsolete_chunks(plan, local_dir, remote_index, chunk_source, options)Result<FileVerificationResult, DownloadError>Este método comprobará los archivos reconstruidos, verificando sus hashes y los chunks obsoletos.
update_progress(value, phase, disk_usage, speed, options)()Este método llamará a la callback de progreso dada en opciones.
change_state(state, options)()Este método llamará a la callback de estado dada en opciones.

DownloadOptions

El objeto DownloadOptions permite personalizar el comportamiento de una descarga:

pub struct DownloadOptions {
pub force: Option<bool>,
pub chunks_save_path: Option<PathBuf>,
pub use_existing_index: Option<bool>,
pub file_reconstruction_concurrency: Option<usize>,
pub in_place_reconstruction_threshold: Option<u64>,
pub on_progress:
Option<Arc<dyn Fn(DownloadPhase, f64, Option<f64>, Option<f64>) + Send + Sync>>,
pub on_state_change: Option<Arc<dyn Fn(DownloadState) + Send + Sync>>,
}
PropiedadTipoDescripción
forceOption<bool>Si es true, descarga todo. Si es false, solo los chunks nuevos y modificados se descargarán.
chunks_save_pathOption<PathBuf>Ruta donde se guardarán los chunks si la estrategia DownloadAllFirstToDisk es la seleccionada.
use_existing_indexOption<bool>Si es true, buscará primero un rd-index existente en el directorio local.
file_reconstruction_concurrencyOption<usize>Cuántos archivos se reconstruirán concurrentemente.
in_place_reconstruction_thresholdOption<u64>Tamaño mínimo de archivo (en bytes) necesarios para realizar una reconstrucción in-place en lugar de usar un archivo temporal.
on_progressOption<Arc<dyn Fn(DownloadPhase, f64, Option<f64>, Option<f64>) + Send + Sync>>Callback opcional para informar progreso.
on_state_changeOption<Arc<dyn Fn(DownloadState) + Send + Sync>>Callback opcional para cambios de estado.
pub enum DownloadState {
Downloading,
Reconstructing,
Cleaning,
Scanning,
}

pub enum DownloadPhase {
Download,
Reconstructing,
Deleting,
}

DownloadError

Enum de errores personalizado para los resultados de DownloadPipeline. (Usa thiserror)

pub enum DownloadError {
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),

#[error("Delta error: {0}")]
Delta(String),

#[error("Storage error: {0}")]
Storage(String),

#[error("Index error: {0}")]
Index(String),

#[error("Validation error: {0}")]
Validation(String),

#[error("Reconstruction error: {0}")]
Reconstruction(String),

#[error("Invalid argument: {0}")]
InvalidArgument(String),

#[error("Operation aborted")]
Aborted,

#[error("Other error: {0}")]
Other(String),
}

UpdateStrategy

Enum con diferentes estrategias para reconstruir y descargar archivos.

pub enum UpdateStrategy {
DownloadAllFirstToMemory,
StreamFromNetwork,
DownloadAllFirstToDisk,
}

Para más info, mira: Uso de la pipeline de descarga


Detalles de métodos

execute(local_dir, strategy, remote_index, options)

Realiza un proceso completo de descarga para un directorio.

Parámetros

NombreTipoDescripción
local_dir&PathDirectorio donde se descargará la nueva actualización.
strategyUpdateStrategyEstrategia a usar para la descarga y reconstrucción. Mira UpdateStrategy arriba.
remote_indexOption<RDIndex>rd-index remoto opcional. Si no se proporciona ninguno, intentará descargarlo del almacenamiento.
optionsOption<DownloadOptions>Opciones para el progreso de descarga. Mira DownloadOptions arriba.

Devuelve

Result<(), DownloadError>


load_local_index(dir)

Este método creará un rd-index.json de un directorio dado, escaneando archivos y generando hashes.

Parámetros

NombreTipoDescripción
dir&PathRuta del directorio para generar el índice.

Devuelve

Result<RDIndex, DownloadError>


save_local_index(local_dir, index)

Este método guardará el nuevo índice local en la carpeta dada.

Parámetros

NombreTipoDescripción
local_dir&PathDirectorio donde se guardará el nuevo índice.
index&RDIndexEl objeto RDIndex a guardar.

Devuelve

Result<(), DownloadError>


find_local_index(local_dir)

Este método buscará un rd-index.json si existe en el directorio dado.

Parámetros

NombreTipoDescripción
local_dir&PathRuta del directorio para buscar el índice.

Devuelve

Result<Option<RDIndex>, DownloadError>


download_all_missing_chunks(plan, target, options)

Este método descargará primero todos los chunks necesarios, y los guardará temporalmente en disco o memoria.

Devolverá un ChunkSource, los ChunkSource serán necesarios para reconstruir archivos, este método SOLO devolverá chunks sources de memoria o disco para reconstrucción offline, si quieres usar almacenamiento como S3, puedes omitir esto y usar directamente un StorageChunkSource con reconstruction.reconstructAll() si lo prefieres.

(Usar StorageChunkSource descargará los chunks y reconstruirá los archivos al mismo tiempo, concurrentemente)

Parámetros

NombreTipoDescripción
plan&DeltaPlanEl DeltaPlan generado por delta.compare de los dos rd-index.json para la descarga.
targetDownloadTargetObjetivo del ChunkSource resultante.
optionsOption<DownloadOptions>Opciones para el progreso de descarga. Mira DownloadOptions arriba.
pub enum DownloadTarget {
Memory,
Disk,
}

Devuelve

Result<Arc<dyn ChunkSource>, DownloadError>


verify_and_delete_obsolete_chunks(plan, local_dir, remote_index, chunk_source, options)

Este método comprobará los archivos reconstruidos, verificando sus hashes y los chunks obsoletos. Si aún quedan chunks obsoletos, se eliminarán y se reconstruirá el archivo de nuevo si es necesario.

Parámetros

NombreTipoDescripción
plan&DeltaPlanEl DeltaPlan generado por delta.compare de los dos rd-index.json para la descarga.
local_dir&PathRuta del directorio para comprobar archivos.
remote_index&RDIndexEl índice remoto para referencia.
chunk_sourceArc<dyn ChunkSource>ChunkSource para descargar chunks en caso de archivos inválidos. Mira ChunkSource
optionsOption<DownloadOptions>Objeto de opciones, echa un ojo a DownloadOptions arriba para más info (este método solo usa la callback)

Devuelve

Result<FileVerificationResult, DownloadError>

pub struct FileVerificationResult {
pub deleted_files: Vec<String>,
pub verified_files: Vec<String>,
pub rebuilt_files: Vec<String>,
}

update_progress(value, phase, disk_usage, speed, options)

Método que se usará internamente para llamar a la callback on_progress dada en opciones.

Parámetros

NombreTipoDescripción
valuef64Valor del progreso.
phaseDownloadPhaseFase de descarga actual (downloading o deleting).
disk_usageOption<f64>Velocidad en bytes/s para la velocidad de reconstrucción
speedOption<f64>Velocidad en bytes/s para la fase de descarga.
optionsOption<&DownloadOptions>Opciones que debe incluir la callback on_progress.

Devuelve ()


change_state(state, options)

Método que se usará internamente para llamar a la callback on_state_change dada en opciones.

Parámetros

NombreTipoDescripción
stateDownloadStateEstado actual del proceso.
optionsOption<&DownloadOptions>Opciones que debe incluir la callback on_state_change.

Devuelve ()


Relacionado