El cliente de Cloud Storage en las bibliotecas cliente de Cloud para Rust escribe objetos
extrayendo fragmentos de carga útil de un tipo que implementa el atributo StreamingSource.
Si tu aplicación detecta una condición de error mientras genera o transmite
datos, la devolución de un error de tu implementación de StreamingSource impide que la
biblioteca cliente finalice la creación del objeto.
En este documento, se muestra cómo definir un tipo de error personalizado y, luego, implementar
StreamingSource para devolver ese error a mitad de la transmisión. También debes verificar que la
carga con errores devuelva tu error sin crear el objeto. Si es la primera vez que usas
la biblioteca cliente, consulta
Usa Cloud Storage con Rust primero.
Antes de comenzar
Antes de ejecutar el código de este documento, completa los siguientes requisitos previos:
- Crea o selecciona un proyecto deGoogle Cloud con la facturación habilitada.
- Crea un bucket de Cloud Storage en tu proyecto.
- Configura las credenciales predeterminadas de la aplicación y otorga a tu principal un
rol de Identity and Access Management (IAM) con permiso para crear objetos en el
bucket, como Usuario de objetos de almacenamiento (
roles/storage.objectUser).
Dependencias
Agrega la biblioteca cliente de Cloud Storage y los crates de compatibilidad a tu
archivo Cargo.toml:
cargo add google-cloud-storage anyhow bytes
Crea un tipo de error personalizado
Para cancelar una escritura de objeto antes de la finalización, tu implementación de StreamingSource debe mostrar un error que implemente std::error::Error + Send + Sync + 'static. Puedes usar cualquier
tipo de error existente que cumpla con estos límites o definir una enumeración personalizada para tu
aplicación. Sigue estos pasos para definir una enumeración de errores personalizada:
Define un enum de error personalizado (
MyError):Implementa el atributo estándar
Errorpara que la biblioteca cliente pueda conservar tu error como la causa subyacente:Implementa el atributo
Displayque requierestd::error::Error:
Implementa una fuente de transmisión personalizada
A continuación, crea un tipo que genere fragmentos sintéticos y devuelva un error después de 41 fragmentos para que la carga se detenga antes de completarse. Completa los siguientes pasos:
Define un struct para hacer un seguimiento del contador de fragmentos:
Implementa
StreamingSourceparaMySource, asociandotype Error = MyErrory devolviendoSome(Err(MyError::ExpectedProblem))en la iteración 42:
Cuando next devuelve Some(Err(...)), la biblioteca cliente deja de leer desde la
fuente y cancela la solicitud de escritura sin finalizar el objeto.
Intenta realizar la carga y, luego, inspecciona el error
Después de implementar StreamingSource, intenta escribir un objeto almacenado en búfer y verifica
que el cliente devuelva un error de serialización que contenga MyError. Debido a que MySource es una fuente de un solo paso que no implementa Seek, inicia la escritura con send_buffered en lugar de send_unbuffered.
Dentro de una función async que acepte bucket_name en el formato
projects/_/buckets/BUCKET_ID, completa los siguientes
pasos:
Inicializa un cliente de
Storage:Inicia la escritura del objeto almacenado en búfer con
MySource::default()como la fuente de carga útil:Verifica que la carga falle con un error de serialización cuyo error de origen sea
MyError:Devuelve
Ok(())para completar la función:
Cuando ejecutas attempt_upload, se imprime un mensaje Upload result Err(...)
que contiene MyError::ExpectedProblem. Las aserciones verifican que el cliente
detuvo la carga y devolvió un error de serialización que une MyError. Debido a que
la escritura se canceló antes de la finalización, Cloud Storage no
crea el objeto expect-error en el bucket.
Realiza una limpieza
Aunque la escritura cancelada no crea un objeto, borra los objetos de prueba que creaste para este documento. Borra los recursos de prueba cuando termines para evitar cargos continuos.
Completar código
En el siguiente ejemplo, se combinan todos los pasos anteriores en un módulo completo:
¿Qué sigue?
- Obtén información para enviar datos en las operaciones de escritura de objetos de Cloud Storage.