LCOV - code coverage report
Current view: top level - pageserver/src/virtual_file - open_options.rs (source / functions) Coverage Total Hit
Test: 5fe7fa8d483b39476409aee736d6d5e32728bfac.info Lines: 73.3 % 90 66
Test Date: 2025-03-12 16:10:49 Functions: 76.9 % 13 10

            Line data    Source code
       1              : //! Enum-dispatch to the `OpenOptions` type of the respective [`super::IoEngineKind`];
       2              : 
       3              : use std::os::fd::OwnedFd;
       4              : use std::path::Path;
       5              : 
       6              : use super::io_engine::IoEngine;
       7              : 
       8              : #[derive(Debug, Clone)]
       9              : pub enum OpenOptions {
      10              :     StdFs(std::fs::OpenOptions),
      11              :     #[cfg(target_os = "linux")]
      12              :     TokioEpollUring(tokio_epoll_uring::ops::open_at::OpenOptions),
      13              : }
      14              : 
      15              : impl Default for OpenOptions {
      16        12666 :     fn default() -> Self {
      17        12666 :         match super::io_engine::get() {
      18            0 :             IoEngine::NotSet => panic!("io engine not set"),
      19         6326 :             IoEngine::StdFs => Self::StdFs(std::fs::OpenOptions::new()),
      20              :             #[cfg(target_os = "linux")]
      21              :             IoEngine::TokioEpollUring => {
      22         6340 :                 Self::TokioEpollUring(tokio_epoll_uring::ops::open_at::OpenOptions::new())
      23              :             }
      24              :         }
      25        12666 :     }
      26              : }
      27              : 
      28              : impl OpenOptions {
      29        12666 :     pub fn new() -> OpenOptions {
      30        12666 :         Self::default()
      31        12666 :     }
      32              : 
      33         8424 :     pub fn read(&mut self, read: bool) -> &mut OpenOptions {
      34         8424 :         match self {
      35         4212 :             OpenOptions::StdFs(x) => {
      36         4212 :                 let _ = x.read(read);
      37         4212 :             }
      38              :             #[cfg(target_os = "linux")]
      39         4212 :             OpenOptions::TokioEpollUring(x) => {
      40         4212 :                 let _ = x.read(read);
      41         4212 :             }
      42              :         }
      43         8424 :         self
      44         8424 :     }
      45              : 
      46         6882 :     pub fn write(&mut self, write: bool) -> &mut OpenOptions {
      47         6882 :         match self {
      48         3434 :             OpenOptions::StdFs(x) => {
      49         3434 :                 let _ = x.write(write);
      50         3434 :             }
      51              :             #[cfg(target_os = "linux")]
      52         3448 :             OpenOptions::TokioEpollUring(x) => {
      53         3448 :                 let _ = x.write(write);
      54         3448 :             }
      55              :         }
      56         6882 :         self
      57         6882 :     }
      58              : 
      59        17932 :     pub fn create(&mut self, create: bool) -> &mut OpenOptions {
      60        17932 :         match self {
      61         8952 :             OpenOptions::StdFs(x) => {
      62         8952 :                 let _ = x.create(create);
      63         8952 :             }
      64              :             #[cfg(target_os = "linux")]
      65         8980 :             OpenOptions::TokioEpollUring(x) => {
      66         8980 :                 let _ = x.create(create);
      67         8980 :             }
      68              :         }
      69        17932 :         self
      70        17932 :     }
      71              : 
      72        13458 :     pub fn create_new(&mut self, create_new: bool) -> &mut OpenOptions {
      73        13458 :         match self {
      74         6722 :             OpenOptions::StdFs(x) => {
      75         6722 :                 let _ = x.create_new(create_new);
      76         6722 :             }
      77              :             #[cfg(target_os = "linux")]
      78         6736 :             OpenOptions::TokioEpollUring(x) => {
      79         6736 :                 let _ = x.create_new(create_new);
      80         6736 :             }
      81              :         }
      82        13458 :         self
      83        13458 :     }
      84              : 
      85        15300 :     pub fn truncate(&mut self, truncate: bool) -> &mut OpenOptions {
      86        15300 :         match self {
      87         7636 :             OpenOptions::StdFs(x) => {
      88         7636 :                 let _ = x.truncate(truncate);
      89         7636 :             }
      90              :             #[cfg(target_os = "linux")]
      91         7664 :             OpenOptions::TokioEpollUring(x) => {
      92         7664 :                 let _ = x.truncate(truncate);
      93         7664 :             }
      94              :         }
      95        15300 :         self
      96        15300 :     }
      97              : 
      98       391732 :     pub(in crate::virtual_file) async fn open(&self, path: &Path) -> std::io::Result<OwnedFd> {
      99       391732 :         match self {
     100       196734 :             OpenOptions::StdFs(x) => x.open(path).map(|file| file.into()),
     101              :             #[cfg(target_os = "linux")]
     102       194998 :             OpenOptions::TokioEpollUring(x) => {
     103       194998 :                 let system = super::io_engine::tokio_epoll_uring_ext::thread_local_system().await;
     104       194998 :                 system.open(path, x).await.map_err(|e| match e {
     105            0 :                     tokio_epoll_uring::Error::Op(e) => e,
     106            0 :                     tokio_epoll_uring::Error::System(system) => {
     107            0 :                         std::io::Error::new(std::io::ErrorKind::Other, system)
     108              :                     }
     109       194998 :                 })
     110              :             }
     111              :         }
     112       391732 :     }
     113              : }
     114              : 
     115              : impl std::os::unix::prelude::OpenOptionsExt for OpenOptions {
     116            0 :     fn mode(&mut self, mode: u32) -> &mut OpenOptions {
     117            0 :         match self {
     118            0 :             OpenOptions::StdFs(x) => {
     119            0 :                 let _ = x.mode(mode);
     120            0 :             }
     121              :             #[cfg(target_os = "linux")]
     122            0 :             OpenOptions::TokioEpollUring(x) => {
     123            0 :                 let _ = x.mode(mode);
     124            0 :             }
     125              :         }
     126            0 :         self
     127            0 :     }
     128              : 
     129            0 :     fn custom_flags(&mut self, flags: i32) -> &mut OpenOptions {
     130            0 :         match self {
     131            0 :             OpenOptions::StdFs(x) => {
     132            0 :                 let _ = x.custom_flags(flags);
     133            0 :             }
     134              :             #[cfg(target_os = "linux")]
     135            0 :             OpenOptions::TokioEpollUring(x) => {
     136            0 :                 let _ = x.custom_flags(flags);
     137            0 :             }
     138              :         }
     139            0 :         self
     140            0 :     }
     141              : }
        

Generated by: LCOV version 2.1-beta