Saltar al contenido principal

UrlDownloadPipeline

UrlDownloadPipeline es una clase abstracta diseñada para manejar subidas usando adaptadores de almacenamiento basados en URLs (UrlStorageAdapter). A diferencia de HashDownloadPipeline, esta pipeline da por hecho que el plan delta (qué chunks descargar) es calculado externamente y proporcionado a la pipeline.

Esta pipeline es comúnmente usada para los sistemas de almacenamiento remotos donde los chunks tienen una URL dedicada para la descarga.


Constructor

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

Métodos

MétodoDevuelveDescripción
execute(local_dir, urls, strategy, plan, options)Result<(), DownloadError>Realiza un proceso completo de descarga para el directorio usando urls.
save_local_index(local_dir, index)Result<(), DownloadError>Este método guardará el nuevo índice local en la carpeta dada.
load_local_index(dir)Result<RDIndex, DownloadError>Creará un rd-index.json del directorio dado.
find_local_index(local_dir)Result<Option<RDIndex>, DownloadError>Buscará un rd-index.json en la carpeta dada si existe.
download_all_missing_chunks(download_urls, target, options)Result<Arc<dyn ChunkSource>, DownloadError>Este método descargará primero todos los chunks necesarios vía urls, 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, urls, strategy, plan, options)

Realiza un proceso completo de descarga para el directorio vía urls.

Parámetros

NombreTipoDescripción
local_dir&PathDirectorio donde se descargará todo.
urls.download_urlsHashMap<String, ChunkUrlInfo>Las urls identificadas por hash para descargar los chunks. Mira ChunkUrlInfo abajo.
urls.index_urlStringUrl para descargar el rd-index.json remoto.
strategyUpdateStrategyEstrategia a usar para descargar y reconstruir. Mira UpdateStrategy
planOption<DeltaPlan>DeltaPlan opcional para referencia, si no se proporciona ninguno, se intentará generar.
optionsOption<DownloadOptions>Opciones para el proceso de descarga. Mira DownloadOptions arriba.
pub struct ChunkUrlInfo {
pub url: String,
pub offset: u64,
pub size: u64,
pub file_path: String,
}

Echa un ojo a ChunkUrlInfo

Devuelve

Result<(), 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 el nuevo índice será guardado.
index&RDIndexEl objeto RDIndex a guardar.

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>


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(download_urls, 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
downloadUrlsHashMap<String, ChunkUrlInfo>Las urls identificadas por hash para descargar los chunks. Mira ChunkUrlInfo arriba.
targetDownloadTargetObjetivo del ChunkSource resultante.
optionsOption<DownloadOptions>Opciones para el proceso 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 será usado internamente para llamar a la callback on_progress dada en opciones.

Parámetros

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

Devuelve ()


change_state(state, options)

Método que será usado 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