rawdb/
error.rs

1use std::{fs, io, result};
2
3use thiserror::Error;
4
5pub type Result<T, E = Error> = result::Result<T, E>;
6
7/// Error types for rawdb operations.
8#[derive(Debug, Error)]
9pub enum Error {
10    #[error(transparent)]
11    IO(#[from] io::Error),
12
13    #[error("Database is locked by another process")]
14    TryLock(#[from] fs::TryLockError),
15
16    // Region errors
17    #[error("Region not found")]
18    RegionNotFound,
19
20    #[error("Region metadata has unwritten data")]
21    RegionMetadataUnwritten,
22
23    #[error("Region already exists")]
24    RegionAlreadyExists,
25
26    #[error("Cannot remove region: still held by {} reference(s)", ref_count - 1)]
27    RegionStillReferenced { ref_count: usize },
28
29    // Write errors
30    #[error("Write position {position} is beyond region length {region_len}")]
31    WriteOutOfBounds { position: usize, region_len: usize },
32
33    // Truncate errors
34    #[error("Cannot truncate to {from} bytes (current length: {current_len})")]
35    TruncateInvalid { from: usize, current_len: usize },
36
37    // Metadata errors
38    #[error("Invalid region ID")]
39    InvalidRegionId,
40
41    #[error("Invalid metadata size: expected {expected} bytes, got {actual}")]
42    InvalidMetadataSize { expected: usize, actual: usize },
43
44    #[error("Empty region metadata")]
45    EmptyMetadata,
46
47    // Layout errors
48    #[error("Region index mismatch in layout")]
49    RegionIndexMismatch,
50
51    #[error("Hole too small: have {hole_size} bytes, need {requested}")]
52    HoleTooSmall { hole_size: usize, requested: usize },
53
54    // Internal invariant errors
55    #[error("Internal invariant violated: {0}")]
56    InvariantViolation(String),
57
58    #[error("Corrupted metadata: {0}")]
59    CorruptedMetadata(String),
60
61    #[error("Write retry limit exceeded after {retries} attempts")]
62    WriteRetryLimitExceeded { retries: usize },
63
64    #[error("Region size would overflow: current={current}, requested={requested}")]
65    RegionSizeOverflow { current: usize, requested: usize },
66
67    #[error("Overlapping copy ranges not supported (src={src}..{src_end}, dst={dst}..{dst_end})")]
68    OverlappingCopyRanges {
69        src: usize,
70        src_end: usize,
71        dst: usize,
72        dst_end: usize,
73    },
74
75    // Hole punching errors
76    #[error("Failed to punch hole at offset {start} (length {len}): {source}")]
77    HolePunchFailed {
78        start: usize,
79        len: usize,
80        source: io::Error,
81    },
82
83    #[error("Hole punching is not supported on this platform")]
84    HolePunchUnsupported,
85}