WriteError

Enum WriteError 

Source
#[non_exhaustive]
pub enum WriteError { UnexpectedRewind { offset: u64, persisted: u64, }, TooMuchProgress { sent: u64, persisted: u64, }, ChecksumMismatch { mismatch: ChecksumMismatch, object: Box<Object>, }, }
Expand description

An unrecoverable problem in the upload protocol.

§Example

use std::error::Error as _;
let writer = client
    .write_object("projects/_/buckets/my-bucket", "my-object", "hello world")
    .set_if_generation_not_match(0);
match writer.send_buffered().await {
    Ok(object) => println!("Successfully created the object {object:?}"),
    Err(error) if error.is_serialization() => {
        println!("Some problem {error:?} sending the data to the service");
        if let Some(m) = error.source().and_then(|e| e.downcast_ref::<WriteError>()) {
            println!("{m}");
        }
    },
    Err(e) => return Err(e.into()), // not handled in this example
}

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

UnexpectedRewind

The service has “uncommitted” previously persisted bytes.

§Troubleshoot

In the resumable upload protocol the service reports how many bytes are persisted. This error indicates that the service previously reported more bytes as persisted than in the latest report. This could indicate:

  • a corrupted message from the service, either the earlier message reporting more bytes persisted than actually are, or the current message indicating fewer bytes persisted.
  • a bug in the service, where it reported bytes as persisted when they were not.
  • a bug in the client, maybe storing the incorrect byte count, or parsing the messages incorrectly.

All of these conditions indicate a bug, and in Rust it is idiomatic to panic!() when a bug is detected. However, in this case it seems more appropriate to report the problem, as the client library cannot determine the location of the bug.

Fields

§offset: u64
§persisted: u64
§

TooMuchProgress

The service reports more bytes persisted than sent.

§Troubleshoot

Most likely this indicates that two concurrent uploads are using the same session. Review your application design to avoid concurrent uploads.

It is possible that this indicates a bug in the service, client, or messages corrupted in transit.

Fields

§sent: u64
§persisted: u64
§

ChecksumMismatch

The checksums reported by the service do not match the expected checksums.

§Troubleshoot

The client library compares the CRC32C checksum and/or MD5 hash of the uploaded data against the hash reported by the service at the end of the upload. This error indicates the hashes did not match.

If you provided known values for these checksums verify those values are correct.

Otherwise, this is probably a data corruption problem. These are notoriously difficult to root cause. They probably indicate faulty equipment, such as the physical machine hosting your client, the network elements between your client and the service, or the physical machine hosting the service.

If possible, resend the data from a different machine.

Fields

§object: Box<Object>

Trait Implementations§

Source§

impl Debug for WriteError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for WriteError

Source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Error for WriteError

1.30.0 · Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T> ToStringFallible for T
where T: Display,

Source§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more