error.rs (20869B)
1 //! Stable, secret-safe storage failures. 2 3 use core::fmt; 4 5 /// Backend-neutral storage failure. 6 #[non_exhaustive] 7 #[derive(Clone, Debug, Eq, PartialEq)] 8 pub enum Error { 9 InvalidAuthoredOperation, 10 InvalidAuthoredArtifact, 11 InvalidAuthoredTransition, 12 InvalidAuthoredDeliveryPlan, 13 InvalidAuthoredDraft, 14 DraftRevisionConflict, 15 DraftNotFound, 16 CorruptAuthoredDraft, 17 DeliveryPlanClaimConflict, 18 DeliveryAttemptOverflow, 19 InvalidWorkClaim, 20 InvalidWorkFailure, 21 InvalidRetrySchedule, 22 InvalidSourceGeneration, 23 InvalidEventSequence, 24 InvalidEventQueryLimit, 25 EmptyEventQueryIds, 26 TooManyEventQueryIds, 27 DuplicateEventQueryId, 28 AdmissionEventMismatch, 29 AdmissionRegression, 30 EventConflict, 31 EventPageLimitExceeded, 32 CursorGenerationMismatch, 33 SourceGenerationChanged, 34 EventNotFound, 35 CorruptStoredEvent, 36 BackendUnavailable, 37 /// Capacity is exhausted; reconcile prior effects before retrying the same operation. 38 SpaceInsufficient, 39 InvalidOperationInstanceId, 40 InvalidIdempotencyKey, 41 InvalidOperationTimestamp, 42 InvalidJournalRevision, 43 InvalidRecoveryAttempt, 44 InvalidRecoveryDeadline, 45 InvalidJournalQueryLimit, 46 IdempotencyConflict, 47 OperationNotFound, 48 OperationIdentityMismatch, 49 JournalRevisionConflict, 50 InvalidJournalTransition, 51 JournalOperationCommitted, 52 CorruptJournalRecord, 53 InvalidOutboxItemId, 54 InvalidOutboxRevision, 55 InvalidOutboxTimestamp, 56 InvalidOutboxLease, 57 InvalidOutboxLeaseOwner, 58 InvalidOutboxClaimLimit, 59 InvalidDeliveryAttempt, 60 InvalidDeliveryEvidence, 61 OutboxItemNotFound, 62 OutboxItemNotReady, 63 OutboxItemTerminal, 64 OutboxPlanConflict, 65 OutboxLeaseConflict, 66 OutboxLeaseExpired, 67 OutboxRevisionConflict, 68 CorruptOutboxRecord, 69 InvalidProjectionId, 70 InvalidProjectionGeneration, 71 InvalidProjectionRevision, 72 InvalidProjectionTimestamp, 73 InvalidProjectionInvalidation, 74 ProjectionCheckpointMismatch, 75 ProjectionCheckpointRegression, 76 ProjectionRevisionConflict, 77 InvalidRebuildTicketId, 78 InvalidRebuildTransition, 79 RebuildTicketTerminal, 80 InvalidEventIndexShardId, 81 InvalidEventIndexRange, 82 InvalidEventIndexArtifactPath, 83 InvalidEventIndexShardCount, 84 InvalidEventIndexTimestamp, 85 InvalidEventIndexManifest, 86 InvalidEventIndexCursor, 87 InvalidEventIndexCheckpoint, 88 DuplicateEventIndexShard, 89 CorruptProjectionRecord, 90 InvalidProjectionDocument, 91 InvalidProjectionSnapshot, 92 CorruptProjectionDocument, 93 InvalidPrivateArtifactId, 94 InvalidPrivateArtifactKind, 95 InvalidPrivateArtifactSchema, 96 InvalidPrivateArtifactSecretReference, 97 InvalidPrivateArtifactRetention, 98 InvalidPrivateArtifactRevision, 99 InvalidPrivateArtifactResealId, 100 InvalidPrivateArtifactResealRequest, 101 InvalidPrivateArtifactTimestamp, 102 InvalidPrivateArtifactMetadata, 103 PrivateArtifactNotFound, 104 PrivateArtifactConflict, 105 PrivateArtifactRevisionConflict, 106 PrivateArtifactResealConflict, 107 PrivateArtifactPersistenceIndeterminate, 108 PrivateArtifactRetentionActive, 109 PrivateArtifactNotExpired, 110 PrivateArtifactTombstoned, 111 InvalidExpiredArtifactQueryLimit, 112 CorruptPrivateArtifactMetadata, 113 InvalidBackupId, 114 InvalidBackupVersion, 115 InvalidBackupTimestamp, 116 InvalidBackupMemberPath, 117 InvalidBackupMemberLength, 118 InvalidBackupManifest, 119 DuplicateBackupMember, 120 BackupSecretPolicyViolation, 121 BackupManifestPlanMismatch, 122 InvalidBackupTransition, 123 InvalidRestoreTimestamp, 124 InvalidRestoreTransition, 125 RestoreMemberVerificationFailed, 126 InvalidReliabilityRevision, 127 ReliabilityRevisionConflict, 128 ReliabilityOperationTerminal, 129 CorruptReliabilityOperation, 130 InvalidIntegrityStatus, 131 InvalidStorageStatus, 132 InvalidAtomicCommitId, 133 InvalidAtomicCommitTimestamp, 134 AtomicCommitConflict, 135 AtomicWorkflowMismatch, 136 AtomicCommitFailed, 137 } 138 139 impl fmt::Display for Error { 140 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { 141 formatter.write_str(match self { 142 Self::InvalidAuthoredOperation => "storage authored operation is invalid", 143 Self::InvalidAuthoredArtifact => "storage authored artifact is invalid", 144 Self::InvalidAuthoredTransition => "storage authored transition is invalid", 145 Self::InvalidAuthoredDeliveryPlan => "storage authored delivery plan is invalid", 146 Self::InvalidAuthoredDraft => "storage authored draft is invalid", 147 Self::DraftRevisionConflict => "storage authored draft revision conflicts", 148 Self::DraftNotFound => "storage authored draft was not found", 149 Self::CorruptAuthoredDraft => "storage authored draft is corrupt", 150 Self::DeliveryPlanClaimConflict => "storage delivery plan claim conflicts", 151 Self::DeliveryAttemptOverflow => "storage delivery attempt counter overflowed", 152 Self::InvalidWorkClaim => "storage authored work claim is invalid", 153 Self::InvalidWorkFailure => "storage authored work failure is invalid", 154 Self::InvalidRetrySchedule => "storage authored retry schedule is invalid", 155 Self::InvalidSourceGeneration => "storage source generation is invalid", 156 Self::InvalidEventSequence => "storage event sequence is invalid", 157 Self::InvalidEventQueryLimit => "storage event query limit is invalid", 158 Self::EmptyEventQueryIds => "storage event id query is empty", 159 Self::TooManyEventQueryIds => "storage event id query exceeds its limit", 160 Self::DuplicateEventQueryId => "storage event id query contains a duplicate", 161 Self::AdmissionEventMismatch => "storage admission event identities do not match", 162 Self::AdmissionRegression => "storage admission cannot regress event state", 163 Self::EventConflict => "storage contains conflicting data for the event id", 164 Self::EventPageLimitExceeded => "storage event page exceeds its requested limit", 165 Self::CursorGenerationMismatch => "storage cursor belongs to another source generation", 166 Self::SourceGenerationChanged => "storage source generation changed", 167 Self::EventNotFound => "storage event was not found", 168 Self::CorruptStoredEvent => "storage event data is corrupt", 169 Self::BackendUnavailable => "storage backend is unavailable", 170 Self::SpaceInsufficient => "storage space is insufficient", 171 Self::InvalidOperationInstanceId => "storage operation instance id is invalid", 172 Self::InvalidIdempotencyKey => "storage idempotency key is invalid", 173 Self::InvalidOperationTimestamp => "storage operation timestamp is invalid", 174 Self::InvalidJournalRevision => "storage journal revision is invalid", 175 Self::InvalidRecoveryAttempt => "storage recovery attempt is invalid", 176 Self::InvalidRecoveryDeadline => "storage recovery deadline is invalid", 177 Self::InvalidJournalQueryLimit => "storage journal query limit is invalid", 178 Self::IdempotencyConflict => "storage idempotency key conflicts with prior input", 179 Self::OperationNotFound => "storage journal operation was not found", 180 Self::OperationIdentityMismatch => "storage journal operation identity does not match", 181 Self::JournalRevisionConflict => { 182 "storage journal revision conflicts with durable state" 183 } 184 Self::InvalidJournalTransition => "storage journal transition is invalid", 185 Self::JournalOperationCommitted => "storage journal operation is already committed", 186 Self::CorruptJournalRecord => "storage journal record is corrupt", 187 Self::InvalidOutboxItemId => "storage outbox item id is invalid", 188 Self::InvalidOutboxRevision => "storage outbox revision is invalid", 189 Self::InvalidOutboxTimestamp => "storage outbox timestamp is invalid", 190 Self::InvalidOutboxLease => "storage outbox lease is invalid", 191 Self::InvalidOutboxLeaseOwner => "storage outbox lease owner is invalid", 192 Self::InvalidOutboxClaimLimit => "storage outbox claim limit is invalid", 193 Self::InvalidDeliveryAttempt => "storage delivery attempt is invalid", 194 Self::InvalidDeliveryEvidence => "storage delivery evidence is invalid", 195 Self::OutboxItemNotFound => "storage outbox item was not found", 196 Self::OutboxItemNotReady => "storage outbox item is not ready", 197 Self::OutboxItemTerminal => "storage outbox item is terminal", 198 Self::OutboxPlanConflict => "storage outbox plan conflicts with durable state", 199 Self::OutboxLeaseConflict => "storage outbox lease conflicts with durable state", 200 Self::OutboxLeaseExpired => "storage outbox lease expired", 201 Self::OutboxRevisionConflict => "storage outbox revision conflicts with durable state", 202 Self::CorruptOutboxRecord => "storage outbox record is corrupt", 203 Self::InvalidProjectionId => "storage projection id is invalid", 204 Self::InvalidProjectionGeneration => "storage projection generation is invalid", 205 Self::InvalidProjectionRevision => "storage projection revision is invalid", 206 Self::InvalidProjectionTimestamp => "storage projection timestamp is invalid", 207 Self::InvalidProjectionInvalidation => "storage projection invalidation is invalid", 208 Self::ProjectionCheckpointMismatch => { 209 "storage projection checkpoint identity does not match" 210 } 211 Self::ProjectionCheckpointRegression => "storage projection checkpoint regressed", 212 Self::ProjectionRevisionConflict => { 213 "storage projection revision conflicts with durable state" 214 } 215 Self::InvalidRebuildTicketId => "storage projection rebuild ticket id is invalid", 216 Self::InvalidRebuildTransition => "storage projection rebuild transition is invalid", 217 Self::RebuildTicketTerminal => "storage projection rebuild ticket is terminal", 218 Self::InvalidEventIndexShardId => "storage event-index shard id is invalid", 219 Self::InvalidEventIndexRange => "storage event-index id range is invalid", 220 Self::InvalidEventIndexArtifactPath => "storage event-index artifact path is invalid", 221 Self::InvalidEventIndexShardCount => "storage event-index shard count is invalid", 222 Self::InvalidEventIndexTimestamp => "storage event-index timestamp is invalid", 223 Self::InvalidEventIndexManifest => "storage event-index manifest is invalid", 224 Self::InvalidEventIndexCursor => "storage event-index cursor is invalid", 225 Self::InvalidEventIndexCheckpoint => "storage event-index checkpoint is invalid", 226 Self::DuplicateEventIndexShard => "storage event-index shard is duplicated", 227 Self::CorruptProjectionRecord => "storage projection record is corrupt", 228 Self::InvalidProjectionDocument => "storage projection document is invalid", 229 Self::InvalidProjectionSnapshot => "storage projection snapshot is invalid", 230 Self::CorruptProjectionDocument => "storage projection document is corrupt", 231 Self::InvalidPrivateArtifactId => "storage private-artifact id is invalid", 232 Self::InvalidPrivateArtifactKind => "storage private-artifact kind is invalid", 233 Self::InvalidPrivateArtifactSchema => "storage private-artifact schema is invalid", 234 Self::InvalidPrivateArtifactSecretReference => { 235 "storage private-artifact secret reference is invalid" 236 } 237 Self::InvalidPrivateArtifactRetention => { 238 "storage private-artifact retention is invalid" 239 } 240 Self::InvalidPrivateArtifactRevision => "storage private-artifact revision is invalid", 241 Self::InvalidPrivateArtifactResealId => "storage private-artifact reseal id is invalid", 242 Self::InvalidPrivateArtifactResealRequest => { 243 "storage private-artifact reseal request is invalid" 244 } 245 Self::InvalidPrivateArtifactTimestamp => { 246 "storage private-artifact timestamp is invalid" 247 } 248 Self::InvalidPrivateArtifactMetadata => "storage private-artifact metadata is invalid", 249 Self::PrivateArtifactNotFound => "storage private artifact was not found", 250 Self::PrivateArtifactConflict => { 251 "storage private-artifact metadata conflicts with durable state" 252 } 253 Self::PrivateArtifactRevisionConflict => { 254 "storage private-artifact revision conflicts with durable state" 255 } 256 Self::PrivateArtifactResealConflict => { 257 "storage private-artifact reseal conflicts with durable state" 258 } 259 Self::PrivateArtifactPersistenceIndeterminate => { 260 "storage private-artifact persistence outcome is indeterminate" 261 } 262 Self::PrivateArtifactRetentionActive => "storage private-artifact retention is active", 263 Self::PrivateArtifactNotExpired => "storage private artifact has not expired", 264 Self::PrivateArtifactTombstoned => "storage private artifact is tombstoned", 265 Self::InvalidExpiredArtifactQueryLimit => { 266 "storage expired-artifact query limit is invalid" 267 } 268 Self::CorruptPrivateArtifactMetadata => "storage private-artifact metadata is corrupt", 269 Self::InvalidBackupId => "storage backup id is invalid", 270 Self::InvalidBackupVersion => "storage backup version is invalid", 271 Self::InvalidBackupTimestamp => "storage backup timestamp is invalid", 272 Self::InvalidBackupMemberPath => "storage backup member path is invalid", 273 Self::InvalidBackupMemberLength => "storage backup member length is invalid", 274 Self::InvalidBackupManifest => "storage backup manifest is invalid", 275 Self::DuplicateBackupMember => "storage backup member is duplicated", 276 Self::BackupSecretPolicyViolation => "storage backup secret policy was violated", 277 Self::BackupManifestPlanMismatch => "storage backup manifest does not match its plan", 278 Self::InvalidBackupTransition => "storage backup transition is invalid", 279 Self::InvalidRestoreTimestamp => "storage restore timestamp is invalid", 280 Self::InvalidRestoreTransition => "storage restore transition is invalid", 281 Self::RestoreMemberVerificationFailed => "storage restore member verification failed", 282 Self::InvalidReliabilityRevision => "storage reliability revision is invalid", 283 Self::ReliabilityRevisionConflict => { 284 "storage reliability revision conflicts with durable state" 285 } 286 Self::ReliabilityOperationTerminal => "storage reliability operation is terminal", 287 Self::CorruptReliabilityOperation => "storage reliability operation is corrupt", 288 Self::InvalidIntegrityStatus => "storage integrity status is invalid", 289 Self::InvalidStorageStatus => "storage status is invalid", 290 Self::InvalidAtomicCommitId => "storage atomic commit id is invalid", 291 Self::InvalidAtomicCommitTimestamp => "storage atomic commit timestamp is invalid", 292 Self::AtomicCommitConflict => "storage atomic commit conflicts with durable state", 293 Self::AtomicWorkflowMismatch => "storage atomic workflow components do not match", 294 Self::AtomicCommitFailed => "storage atomic workflow did not commit", 295 }) 296 } 297 } 298 299 impl std::error::Error for Error {} 300 301 #[cfg(test)] 302 mod tests { 303 use super::Error::*; 304 305 #[test] 306 fn every_storage_error_has_a_stable_nonempty_message() { 307 let errors = [ 308 InvalidAuthoredOperation, 309 InvalidAuthoredArtifact, 310 InvalidAuthoredTransition, 311 InvalidAuthoredDeliveryPlan, 312 DeliveryPlanClaimConflict, 313 DeliveryAttemptOverflow, 314 InvalidWorkClaim, 315 InvalidWorkFailure, 316 InvalidRetrySchedule, 317 InvalidSourceGeneration, 318 InvalidEventSequence, 319 InvalidEventQueryLimit, 320 EmptyEventQueryIds, 321 TooManyEventQueryIds, 322 DuplicateEventQueryId, 323 AdmissionEventMismatch, 324 AdmissionRegression, 325 EventConflict, 326 EventPageLimitExceeded, 327 CursorGenerationMismatch, 328 SourceGenerationChanged, 329 EventNotFound, 330 CorruptStoredEvent, 331 BackendUnavailable, 332 SpaceInsufficient, 333 InvalidOperationInstanceId, 334 InvalidIdempotencyKey, 335 InvalidOperationTimestamp, 336 InvalidJournalRevision, 337 InvalidRecoveryAttempt, 338 InvalidRecoveryDeadline, 339 InvalidJournalQueryLimit, 340 IdempotencyConflict, 341 OperationNotFound, 342 OperationIdentityMismatch, 343 JournalRevisionConflict, 344 InvalidJournalTransition, 345 JournalOperationCommitted, 346 CorruptJournalRecord, 347 InvalidOutboxItemId, 348 InvalidOutboxRevision, 349 InvalidOutboxTimestamp, 350 InvalidOutboxLease, 351 InvalidOutboxLeaseOwner, 352 InvalidOutboxClaimLimit, 353 InvalidDeliveryAttempt, 354 InvalidDeliveryEvidence, 355 OutboxItemNotFound, 356 OutboxItemNotReady, 357 OutboxItemTerminal, 358 OutboxPlanConflict, 359 OutboxLeaseConflict, 360 OutboxLeaseExpired, 361 OutboxRevisionConflict, 362 CorruptOutboxRecord, 363 InvalidProjectionId, 364 InvalidProjectionGeneration, 365 InvalidProjectionRevision, 366 InvalidProjectionTimestamp, 367 InvalidProjectionInvalidation, 368 ProjectionCheckpointMismatch, 369 ProjectionCheckpointRegression, 370 ProjectionRevisionConflict, 371 InvalidRebuildTicketId, 372 InvalidRebuildTransition, 373 RebuildTicketTerminal, 374 InvalidEventIndexShardId, 375 InvalidEventIndexRange, 376 InvalidEventIndexArtifactPath, 377 InvalidEventIndexShardCount, 378 InvalidEventIndexTimestamp, 379 InvalidEventIndexManifest, 380 InvalidEventIndexCursor, 381 InvalidEventIndexCheckpoint, 382 DuplicateEventIndexShard, 383 CorruptProjectionRecord, 384 InvalidProjectionDocument, 385 InvalidProjectionSnapshot, 386 CorruptProjectionDocument, 387 InvalidPrivateArtifactId, 388 InvalidPrivateArtifactKind, 389 InvalidPrivateArtifactSchema, 390 InvalidPrivateArtifactSecretReference, 391 InvalidPrivateArtifactRetention, 392 InvalidPrivateArtifactRevision, 393 InvalidPrivateArtifactResealId, 394 InvalidPrivateArtifactResealRequest, 395 InvalidPrivateArtifactTimestamp, 396 InvalidPrivateArtifactMetadata, 397 PrivateArtifactNotFound, 398 PrivateArtifactConflict, 399 PrivateArtifactRevisionConflict, 400 PrivateArtifactResealConflict, 401 PrivateArtifactPersistenceIndeterminate, 402 PrivateArtifactRetentionActive, 403 PrivateArtifactNotExpired, 404 PrivateArtifactTombstoned, 405 InvalidExpiredArtifactQueryLimit, 406 CorruptPrivateArtifactMetadata, 407 InvalidBackupId, 408 InvalidBackupVersion, 409 InvalidBackupTimestamp, 410 InvalidBackupMemberPath, 411 InvalidBackupMemberLength, 412 InvalidBackupManifest, 413 DuplicateBackupMember, 414 BackupSecretPolicyViolation, 415 BackupManifestPlanMismatch, 416 InvalidBackupTransition, 417 InvalidRestoreTimestamp, 418 InvalidRestoreTransition, 419 RestoreMemberVerificationFailed, 420 InvalidReliabilityRevision, 421 ReliabilityRevisionConflict, 422 ReliabilityOperationTerminal, 423 CorruptReliabilityOperation, 424 InvalidIntegrityStatus, 425 InvalidStorageStatus, 426 InvalidAtomicCommitId, 427 InvalidAtomicCommitTimestamp, 428 AtomicCommitConflict, 429 AtomicWorkflowMismatch, 430 AtomicCommitFailed, 431 ]; 432 for error in errors { 433 assert!(!error.to_string().is_empty()); 434 } 435 } 436 }