Discover all WAL segments in a directory, sorted by first_lsn. Ignores non-segment files (DWB files, other metadata).
(wal_dir: &Path)
| 13 | /// |
| 14 | /// Ignores non-segment files (DWB files, other metadata). |
| 15 | pub fn discover_segments(wal_dir: &Path) -> Result<Vec<SegmentMeta>> { |
| 16 | if !wal_dir.exists() { |
| 17 | return Ok(Vec::new()); |
| 18 | } |
| 19 | |
| 20 | let entries = fs::read_dir(wal_dir).map_err(WalError::Io)?; |
| 21 | let mut segments = Vec::new(); |
| 22 | |
| 23 | for entry in entries { |
| 24 | let entry = entry.map_err(WalError::Io)?; |
| 25 | let file_name = entry.file_name(); |
| 26 | let name = file_name.to_string_lossy(); |
| 27 | |
| 28 | if let Some(first_lsn) = parse_segment_filename(&name) { |
| 29 | let metadata = entry.metadata().map_err(WalError::Io)?; |
| 30 | segments.push(SegmentMeta { |
| 31 | path: entry.path(), |
| 32 | first_lsn, |
| 33 | file_size: metadata.len(), |
| 34 | }); |
| 35 | } |
| 36 | } |
| 37 | |
| 38 | segments.sort(); |
| 39 | Ok(segments) |
| 40 | } |
| 41 | |
| 42 | #[cfg(test)] |
| 43 | mod tests { |