La riscrittura di un oggetto in Cloud Storage copia o trasforma un oggetto esistente, ad esempio spostandolo da una località all'altra, ruotando la relativa chiave di crittografia o modificando la relativa classe di archiviazione. A seconda delle dimensioni dell'oggetto e dei parametri di riscrittura, Cloud Storage potrebbe completare l'operazione in una singola chiamata o restituire un avanzamento intermedio con un rewrite_token. Quando una chiamata restituisce un rewrite_token, passa il token alle richieste successive fino al completamento della riscrittura.
Questo documento mostra come configurare una richiesta di riscrittura e gestire il loop di riscrittura utilizzando l'helper rewrite_until_done o un loop manuale nelle librerie client di Cloud per Rust. Se non hai mai utilizzato la libreria client, consulta prima Utilizzo di Cloud Storage con Rust.
Prima di iniziare
Prima di eseguire il codice in questo documento, completa i seguenti prerequisiti:
- Crea o seleziona un progettoGoogle Cloud con la fatturazione abilitata.
- Crea un bucket Cloud Storage di test dedicato nel tuo progetto.
- Configura le Credenziali predefinite dell'applicazione per il tuo ambiente.
- Concedi alla tua entità un ruolo Identity and Access Management (IAM) con l'autorizzazione per leggere, scrivere ed eliminare oggetti nel bucket, ad esempio Storage Admin (
roles/storage.admin).
Dipendenze
Aggiungi la libreria client di Cloud Storage e i crate di supporto al file Cargo.toml:
cargo add google-cloud-storage google-cloud-gax anyhow bytes
cargo add tokio --features macros,rt-multi-thread
Prepara il client e riscrivi la richiesta
Sia l'helper automatico che il loop manuale iniziano da un client StorageControl e un generatore di richieste RewriteObject configurati. All'interno di un ambito che accetta bucket_name nel formato projects/_/buckets/BUCKET_ID, completa i seguenti passaggi:
Inizializza un client
StorageControlcon una policy di ripetizione. Ti consigliamo di concedere almeno 30 secondi per richiesta. Questo esempio utilizzaRetryableErrorscon un limite di 5 tentativi e nessun limite di tempo complessivo per operazione:Crea il generatore di richieste
rewrite_object, contrassegna la richiesta come idempotente in modo che il client possa riprovare in caso di errori temporanei e imposta i nomi dei bucket e degli oggetti di origine e di destinazione:(Facoltativo) Limita il numero massimo di byte riscritti per chiamata in modo che le singole richieste restituiscano l'avanzamento più velocemente anziché richiedere un timeout della richiesta più lungo. Questo esempio imposta un limite ridotto di 1 MiB per forzare più iterazioni. Utilizza un valore più elevato in produzione:
(Facoltativo) Specifica i metadati dell'oggetto di destinazione, ad esempio modificando la classe di archiviazione in Nearline (
NEARLINE):
Esegui automaticamente il ciclo di riscrittura
Per la maggior parte dei casi d'uso, porta il tratto RewriteObjectExt nell'ambito e chiama rewrite_until_done sul generatore di richieste. Questo helper gestisce il rewrite_token tra le iterazioni e si risolve nei metadati Object di destinazione al termine della riscrittura:
Esegui manualmente il ciclo di riscrittura
Se devi registrare i conteggi dei byte intermedi, controllare l'avanzamento o riprendere una riscrittura da un altro processo, gestisci manualmente il loop di riscrittura:
Definisci una funzione helper che invia una singola richiesta
RewriteObject, registra l'avanzamento e restituisce i metadatiObjectcompletati quandoresp.doneètrueo ilrewrite_tokensuccessivo:Chiama l'helper in un loop, clonando il generatore di richieste a ogni iterazione e passando il token restituito a
set_rewrite_tokenogni volta chemake_one_requestrestituisceRewriteProgress::Incomplete:
Completamento codice
L'esempio seguente carica un oggetto di origine di 3 MiB e lo riscrive nella classe di archiviazione Nearline Storage in incrementi di 1 MiB utilizzando il loop manuale. Al termine della riscrittura, l'esempio elimina gli oggetti di test e il bucket di test vuoto:
L'output è simile al seguente e mostra l'avanzamento in tre iterazioni e i metadati dell'oggetto di destinazione:
PROGRESS: total_bytes_rewritten=1048576; object_size=3145728
PROGRESS: total_bytes_rewritten=2097152; object_size=3145728
DONE: total_bytes_rewritten=3145728; object_size=3145728
dest_object=Object { name: "rewrite-object-clone", ... }
Esegui la pulizia
Se l'esecuzione dell'esempio termina in anticipo o se esegui singoli snippet senza l'helper di pulizia, elimina tutti gli oggetti di test rimanenti ed elimina il bucket di test al termine, in modo da non incorrere in addebiti continui sul tuo account Google Cloud .