LCOV - code coverage report
Current view: top level - pageserver/src/virtual_file - open_options.rs (source / functions) Coverage Total Hit
Test: a2776bf42b420512b50fede714e94e827acbbd55.info Lines: 73.3 % 90 66
Test Date: 2025-03-13 16:38:48 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        12450 :     fn default() -> Self {
      17        12450 :         match super::io_engine::get() {
      18            0 :             IoEngine::NotSet => panic!("io engine not set"),
      19         6318 :             IoEngine::StdFs => Self::StdFs(std::fs::OpenOptions::new()),
      20              :             #[cfg(target_os = "linux")]
      21              :             IoEngine::TokioEpollUring => {
      22         6132 :                 Self::TokioEpollUring(tokio_epoll_uring::ops::open_at::OpenOptions::new())
      23              :             }
      24              :         }
      25        12450 :     }
      26              : }
      27              : 
      28              : impl OpenOptions {
      29        12450 :     pub fn new() -> OpenOptions {
      30        12450 :         Self::default()
      31        12450 :     }
      32              : 
      33         8463 :     pub fn read(&mut self, read: bool) -> &mut OpenOptions {
      34         8463 :         match self {
      35         4208 :             OpenOptions::StdFs(x) => {
      36         4208 :                 let _ = x.read(read);
      37         4208 :             }
      38              :             #[cfg(target_os = "linux")]
      39         4255 :             OpenOptions::TokioEpollUring(x) => {
      40         4255 :                 let _ = x.read(read);
      41         4255 :             }
      42              :         }
      43         8463 :         self
      44         8463 :     }
      45              : 
      46         6659 :     pub fn write(&mut self, write: bool) -> &mut OpenOptions {
      47         6659 :         match self {
      48         3430 :             OpenOptions::StdFs(x) => {
      49         3430 :                 let _ = x.write(write);
      50         3430 :             }
      51              :             #[cfg(target_os = "linux")]
      52         3229 :             OpenOptions::TokioEpollUring(x) => {
      53         3229 :                 let _ = x.write(write);
      54         3229 :             }
      55              :         }
      56         6659 :         self
      57         6659 :     }
      58              : 
      59        17491 :     pub fn create(&mut self, create: bool) -> &mut OpenOptions {
      60        17491 :         match self {
      61         8942 :             OpenOptions::StdFs(x) => {
      62         8942 :                 let _ = x.create(create);
      63         8942 :             }
      64              :             #[cfg(target_os = "linux")]
      65         8549 :             OpenOptions::TokioEpollUring(x) => {
      66         8549 :                 let _ = x.create(create);
      67         8549 :             }
      68              :         }
      69        17491 :         self
      70        17491 :     }
      71              : 
      72        13244 :     pub fn create_new(&mut self, create_new: bool) -> &mut OpenOptions {
      73        13244 :         match self {
      74         6712 :             OpenOptions::StdFs(x) => {
      75         6712 :                 let _ = x.create_new(create_new);
      76         6712 :             }
      77              :             #[cfg(target_os = "linux")]
      78         6532 :             OpenOptions::TokioEpollUring(x) => {
      79         6532 :                 let _ = x.create_new(create_new);
      80         6532 :             }
      81              :         }
      82        13244 :         self
      83        13244 :     }
      84              : 
      85        14827 :     pub fn truncate(&mut self, truncate: bool) -> &mut OpenOptions {
      86        14827 :         match self {
      87         7626 :             OpenOptions::StdFs(x) => {
      88         7626 :                 let _ = x.truncate(truncate);
      89         7626 :             }
      90              :             #[cfg(target_os = "linux")]
      91         7201 :             OpenOptions::TokioEpollUring(x) => {
      92         7201 :                 let _ = x.truncate(truncate);
      93         7201 :             }
      94              :         }
      95        14827 :         self
      96        14827 :     }
      97              : 
      98       390918 :     pub(in crate::virtual_file) async fn open(&self, path: &Path) -> std::io::Result<OwnedFd> {
      99       390918 :         match self {
     100       197101 :             OpenOptions::StdFs(x) => x.open(path).map(|file| file.into()),
     101              :             #[cfg(target_os = "linux")]
     102       193817 :             OpenOptions::TokioEpollUring(x) => {
     103       193817 :                 let system = super::io_engine::tokio_epoll_uring_ext::thread_local_system().await;
     104       193817 :                 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       193817 :                 })
     110              :             }
     111              :         }
     112       390918 :     }
     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