O cliente do Cloud Storage nas bibliotecas de cliente do Cloud para Rust grava objetos
extraindo blocos de payload de um tipo que implementa a característica StreamingSource.
Se o aplicativo detectar uma condição de erro ao gerar ou transmitir
dados, o retorno de um erro da implementação de StreamingSource impedirá que a
biblioteca de cliente finalize a criação do objeto.
Neste documento, mostramos como definir um tipo de erro personalizado e implementar
StreamingSource para retornar esse erro no meio do stream. Você também verifica se o
upload com falha retorna o erro sem criar o objeto. Se você não conhece
a biblioteca de cliente, consulte
Como usar o Cloud Storage com Rust primeiro.
Antes de começar
Antes de executar o código neste documento, conclua os seguintes pré-requisitos:
- Crie ou selecione um projeto doGoogle Cloud com o faturamento ativado.
- Crie um bucket do Cloud Storage no projeto.
- Configure o Application Default Credentials e conceda ao principal um
papel do Identity and Access Management (IAM) com permissão para criar objetos no
bucket, como Usuário de objetos do Storage (
roles/storage.objectUser).
Dependências
Adicione a biblioteca de cliente do Cloud Storage e os crates de suporte ao arquivo
Cargo.toml:
cargo add google-cloud-storage anyhow bytes
Criar um tipo de erro personalizado
Para cancelar uma gravação de objeto antes da finalização, sua implementação de StreamingSource precisa retornar um erro que implemente std::error::Error + Send + Sync + 'static. É possível usar qualquer
tipo de erro que atenda a esses limites ou definir um tipo enumerado personalizado para o
aplicativo. Siga as etapas abaixo para definir um tipo enumerado de erro personalizado:
Defina um tipo enumerado de erro personalizado (
MyError):Implemente a característica padrão
Errorpara que a biblioteca de cliente possa preservar o erro como a causa subjacente:Implemente a característica
Displayexigida porstd::error::Error:
Implementar uma fonte de streaming personalizada
Em seguida, crie um tipo que gere blocos sintéticos e retorne um erro após 41 blocos para que o upload seja interrompido antes da conclusão. Siga estas etapas:
Defina uma struct para rastrear o contador de blocos:
Implemente
StreamingSourceparaMySource, associandotype Error = MyErrore retornandoSome(Err(MyError::ExpectedProblem))na iteração 42:
Quando next retorna Some(Err(...)), a biblioteca de cliente para de ler da
origem e cancela a solicitação de gravação sem finalizar o objeto.
Tentar fazer o upload e inspecionar o erro
Depois de implementar StreamingSource, tente uma gravação de objeto em buffer e verifique
se o cliente retorna um erro de serialização que envolve MyError. Como
MySource é uma fonte de passagem única que não implementa Seek, inicie a
gravação com send_buffered em vez de send_unbuffered.
Em uma função async que aceita bucket_name no formato
projects/_/buckets/BUCKET_ID, siga estas
etapas:
Inicialize um cliente
Storage:Inicie a gravação do objeto em buffer usando
MySource::default()como a origem do payload:Verifique se o upload falha com um erro de serialização em que o erro de origem é
MyError:Retorne
Ok(())para concluir a função:
Quando você executa attempt_upload, ele mostra uma mensagem Upload result Err(...)
contendo MyError::ExpectedProblem. As declarações verificam se o cliente
interrompeu o upload e retornou um erro de serialização que envolve MyError. Como
a gravação foi cancelada antes da finalização, o Cloud Storage não
cria o objeto expect-error no bucket.
Limpar
Embora a gravação cancelada não crie um objeto, exclua todos os objetos de teste criados para este documento. Excluir os recursos de teste quando terminar evita cobranças contínuas.
Preencher código
O exemplo a seguir combina todas as etapas anteriores em um módulo completo: