| 777 | } |
| 778 | |
| 779 | pub fn flush_versioned(&self, mapping_fn: impl Fn(u64) -> PathBuf) -> Result<(), BufIoError> { |
| 780 | for region in self.regions.iter() { |
| 781 | if region.should_flush() { |
| 782 | let path = mapping_fn(region.start / self.buffer_size as u64); |
| 783 | let mut file = OpenOptions::new() |
| 784 | .write(true) |
| 785 | .create(true) |
| 786 | .truncate(false) |
| 787 | .open(path)?; |
| 788 | let buffer = region.buffer.read().map_err(|_| BufIoError::Locking)?; |
| 789 | let end = region.end.load(Ordering::SeqCst); |
| 790 | file.write_all(&buffer[..end]).map_err(BufIoError::Io)?; |
| 791 | region.dirty.store(false, Ordering::SeqCst); |
| 792 | file.flush()?; |
| 793 | file.sync_all()?; |
| 794 | } |
| 795 | } |
| 796 | Ok(()) |
| 797 | } |
| 798 | |
| 799 | pub fn file_size(&self) -> u64 { |
| 800 | *self.file_size.read().unwrap() |