Der Cloud Storage-Client in den Cloud-Clientbibliotheken für Rust schreibt Objekte, indem er Nutzlastblöcke aus einem Typ abruft, der das StreamingSource-Trait implementiert.
Wenn Ihre Anwendung beim Generieren oder Streamen von Daten einen Fehler erkennt, wird die Clientbibliothek durch die Rückgabe eines Fehlers aus Ihrer StreamingSource-Implementierung daran gehindert, die Objekterstellung abzuschließen.
In diesem Dokument wird beschrieben, wie Sie einen benutzerdefinierten Fehlertyp definieren und StreamingSource implementieren, um diesen Fehler während des Streams zurückzugeben. Außerdem prüfen Sie, ob der fehlgeschlagene Upload Ihren Fehler zurückgibt, ohne das Objekt zu erstellen. Wenn Sie die Clientbibliothek noch nicht kennen, lesen Sie zuerst Cloud Storage mit Rust verwenden.
Hinweis
Bevor Sie den Code in diesem Dokument ausführen, müssen die folgenden Voraussetzungen erfüllt sein:
- Erstellen oder wählen Sie ein Google Cloud -Projekt mit aktivierter Abrechnung aus.
- Erstellen Sie einen Cloud Storage-Bucket in Ihrem Projekt.
- Konfigurieren Sie die Standardanmeldedaten für Anwendungen und weisen Sie Ihrem Hauptkonto eine IAM-Rolle (Identity and Access Management) mit der Berechtigung zum Erstellen von Objekten im Bucket zu, z. B. Storage-Objekt-Nutzer (
roles/storage.objectUser).
Abhängigkeiten
Fügen Sie die Cloud Storage-Clientbibliothek und die unterstützenden Crates der Datei Cargo.toml hinzu:
cargo add google-cloud-storage anyhow bytes
Benutzerdefinierten Fehlertyp erstellen
Wenn Sie einen Objektschreibvorgang vor dem Abschluss abbrechen möchten, muss Ihre StreamingSource-Implementierung einen Fehler zurückgeben, der std::error::Error + Send + Sync + 'static implementiert. Sie können einen beliebigen vorhandenen Fehlertyp verwenden, der diese Grenzen erfüllt, oder ein benutzerdefiniertes Enum für Ihre Anwendung definieren. Führen Sie die folgenden Schritte aus, um ein benutzerdefiniertes Fehler-Enum zu definieren:
Definieren Sie ein benutzerdefiniertes Fehler-Enum (
MyError):Implementieren Sie das Standardmerkmal
Error, damit die Clientbibliothek den Fehler als zugrunde liegende Ursache beibehalten kann:Implementiere das für
std::error::ErrorerforderlicheDisplay-Attribut:
Benutzerdefinierte Streamingquelle implementieren
Erstellen Sie als Nächstes einen Typ, der synthetische Blöcke generiert und nach 41 Blöcken einen Fehler zurückgibt, damit der Upload vor dem Abschluss beendet wird. Gehen Sie folgendermaßen vor:
Definieren Sie eine Struktur, um den Chunk-Zähler zu verfolgen:
Implementieren Sie
StreamingSourcefürMySource, verknüpfen Sietype Error = MyErrorund geben SieSome(Err(MyError::ExpectedProblem))bei Iteration 42 zurück:
Wenn next den Wert Some(Err(...)) zurückgibt, liest die Clientbibliothek nicht mehr aus der Quelle und bricht die Schreibanfrage ab, ohne das Objekt abzuschließen.
Upload versuchen und Fehler prüfen
Versuchen Sie nach der Implementierung von StreamingSource, ein gepuffertes Objekt zu schreiben, und prüfen Sie, ob der Client einen Serialisierungsfehler zurückgibt, der MyError umschließt. Da MySource eine Single-Pass-Quelle ist, die Seek nicht implementiert, starten Sie den Schreibvorgang mit send_buffered anstelle von send_unbuffered.
Führen Sie in einer async-Funktion, die bucket_name im Format projects/_/buckets/BUCKET_ID akzeptiert, die folgenden Schritte aus:
Initialisieren Sie einen
Storage-Client:Starten Sie den gepufferten Objektschreibvorgang mit
MySource::default()als Nutzlastquelle:Prüfen Sie, ob der Upload mit einem Serialisierungsfehler fehlschlägt, dessen Quellfehler
MyErrorist:Drücken Sie
Ok(()), um die Funktion abzuschließen:
Wenn Sie attempt_upload ausführen, wird eine Upload result Err(...)-Nachricht mit MyError::ExpectedProblem ausgegeben. Die Assertions bestätigen, dass der Client den Upload beendet und einen Serialisierungsfehler zurückgegeben hat, der MyError umschließt. Da der Schreibvorgang vor dem Abschluss abgebrochen wurde, erstellt Cloud Storage das Objekt expect-error nicht im Bucket.
Bereinigen
Auch wenn durch den abgebrochenen Schreibvorgang kein Objekt erstellt wird, sollten Sie alle Testobjekte löschen, die Sie für dieses Dokument erstellt haben. Wenn Sie die Testressourcen nach Abschluss löschen, vermeiden Sie laufende Kosten.
Vollständiger Code
Im folgenden Beispiel werden alle vorherigen Schritte zu einem vollständigen Modul kombiniert: