{"record":{"id":"17a9af69cfa82fd3","repo":"influxdata/influxdb","slug":"failed-to-upload-to-object-storage-0","errorCode":null,"errorMessage":"failed to upload to object storage: {0}","messagePattern":"failed to upload to object storage: (.+?)","errorType":"error_code","errorClass":"UploadError","httpStatus":null,"severity":"error","filePath":"core/parquet_file/src/storage.rs","lineNumber":58,"sourceCode":"\n/// Errors returned during a Parquet \"put\" operation, covering [`RecordBatch`]\n/// pull from the provided stream, encoding, and finally uploading the bytes to\n/// the object store.\n///\n/// [`RecordBatch`]: arrow::record_batch::RecordBatch\n#[derive(Debug, Error)]\npub enum UploadError {\n    /// A codec failure during serialisation.\n    #[error(transparent)]\n    Serialise(#[from] CodecError),\n\n    /// An error during Parquet metadata conversion when attempting to\n    /// instantiate a valid [`IoxParquetMetaData`] instance.\n    #[error(\"failed to construct IOx parquet metadata: {0}\")]\n    Metadata(crate::metadata::Error),\n\n    /// Uploading the Parquet file to object store failed.\n    #[error(\"failed to upload to object storage: {0}\")]\n    Upload(#[from] object_store::Error),\n\n    /// Error in configuration.\n    #[error(\"failed to properly configure parquet upload: {0}\")]\n    Config(#[from] DataFusionError),\n}\n\nimpl From<UploadError> for DataFusionError {\n    fn from(value: UploadError) -> Self {\n        match value {\n            UploadError::Serialise(e) => {\n                Self::Context(String::from(\"serialize\"), Box::new(e.into()))\n            }\n            UploadError::Metadata(e) => Self::External(Box::new(e)),\n            UploadError::Upload(e) => Self::ObjectStore(Box::new(e)),\n            UploadError::Config(e) => Self::External(e.into()),\n        }\n    }","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/core/parquet_file/src/storage.rs#L40-L76","documentation":"UploadError::Upload, a #[from] object_store::Error wrapper raised when uploading the Parquet file to object storage fails. Any object_store client failure (network, permissions, quota, throttling) is surfaced here.","triggerScenarios":"put/multipart upload call to the configured object store (S3, GCS, Azure, local) returns an error during the parquet upload path.","commonSituations":"Expired or missing cloud credentials, bucket not existing, network outages, rate limiting (SlowDown/Throttling), disk full for local stores, object size limits exceeded.","solutions":["Check the wrapped object_store::Error source for the provider-specific cause","Verify credentials and bucket/container configuration for the object store","Retry the upload with backoff if the error is transient (5xx, throttling, timeout)","Confirm network connectivity and that the target path respects store naming/size rules"],"exampleFix":"// before: single attempt\nstore.put(&path, payload).await?;\n// after: bounded retry with backoff\nbackoff::retry(_backoff::ExponentialBackoff::default(), || async {\n    match store.put(&path, payload.clone()).await {\n        Ok(_) => Ok(()),\n        Err(e) if e.is_timeout() || is_throttling(&e) => Err(backoff::Error::transient(e)),\n        Err(e) => Err(backoff::Error::permanent(e)),\n    }\n}).await?;","handlingStrategy":"retry","validationCode":"// pre-flight: verify credentials/bucket before writing\nstore.head(&Location::from_url(&bucket_probe_url)).await?;","typeGuard":null,"tryCatchPattern":"match res {\n    Err(UploadError::Upload(e)) if is_transient(&e) => {\n        retry_with_backoff(upload_closure).await?\n    }\n    other => other?,\n}","preventionTips":["Configure retry with exponential backoff for transient object-store errors","Rotate and validate cloud credentials before long-running jobs","Monitor object-store error rates and quotas (throttling, payload limits)"],"tags":["object-storage","upload","network","s3"],"backgroundTag":"http-error-response","analyzedSha":"06200ef96ba82c5f6727e5038a83af8e722c6875","analyzedAt":"2026-09-19T12:55:30.003Z","contentChangedAt":"2026-09-19T12:55:30.003Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}