LCOV - code coverage report
Current view: top level - pageserver/src/virtual_file - open_options.rs (source / functions) Coverage Total Hit
Test: feead26e04cdef6e988ff1765b1cb7075eb48d3d.info Lines: 73.3 % 90 66
Test Date: 2025-02-28 12:11:00 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        12614 :     fn default() -> Self {
      17        12614 :         match super::io_engine::get() {
      18            0 :             IoEngine::NotSet => panic!("io engine not set"),
      19         6300 :             IoEngine::StdFs => Self::StdFs(std::fs::OpenOptions::new()),
      20              :             #[cfg(target_os = "linux")]
      21              :             IoEngine::TokioEpollUring => {
      22         6314 :                 Self::TokioEpollUring(tokio_epoll_uring::ops::open_at::OpenOptions::new())
      23              :             }
      24              :         }
      25        12614 :     }
      26              : }
      27              : 
      28              : impl OpenOptions {
      29        12614 :     pub fn new() -> OpenOptions {
      30        12614 :         Self::default()
      31        12614 :     }
      32              : 
      33         8396 :     pub fn read(&mut self, read: bool) -> &mut OpenOptions {
      34         8396 :         match self {
      35         4198 :             OpenOptions::StdFs(x) => {
      36         4198 :                 let _ = x.read(read);
      37         4198 :             }
      38              :             #[cfg(target_os = "linux")]
      39         4198 :             OpenOptions::TokioEpollUring(x) => {
      40         4198 :                 let _ = x.read(read);
      41         4198 :             }
      42              :         }
      43         8396 :         self
      44         8396 :     }
      45              : 
      46         6838 :     pub fn write(&mut self, write: bool) -> &mut OpenOptions {
      47         6838 :         match self {
      48         3412 :             OpenOptions::StdFs(x) => {
      49         3412 :                 let _ = x.write(write);
      50         3412 :             }
      51              :             #[cfg(target_os = "linux")]
      52         3426 :             OpenOptions::TokioEpollUring(x) => {
      53         3426 :                 let _ = x.write(write);
      54         3426 :             }
      55              :         }
      56         6838 :         self
      57         6838 :     }
      58              : 
      59        17860 :     pub fn create(&mut self, create: bool) -> &mut OpenOptions {
      60        17860 :         match self {
      61         8916 :             OpenOptions::StdFs(x) => {
      62         8916 :                 let _ = x.create(create);
      63         8916 :             }
      64              :             #[cfg(target_os = "linux")]
      65         8944 :             OpenOptions::TokioEpollUring(x) => {
      66         8944 :                 let _ = x.create(create);
      67         8944 :             }
      68              :         }
      69        17860 :         self
      70        17860 :     }
      71              : 
      72        13382 :     pub fn create_new(&mut self, create_new: bool) -> &mut OpenOptions {
      73        13382 :         match self {
      74         6684 :             OpenOptions::StdFs(x) => {
      75         6684 :                 let _ = x.create_new(create_new);
      76         6684 :             }
      77              :             #[cfg(target_os = "linux")]
      78         6698 :             OpenOptions::TokioEpollUring(x) => {
      79         6698 :                 let _ = x.create_new(create_new);
      80         6698 :             }
      81              :         }
      82        13382 :         self
      83        13382 :     }
      84              : 
      85        15248 :     pub fn truncate(&mut self, truncate: bool) -> &mut OpenOptions {
      86        15248 :         match self {
      87         7610 :             OpenOptions::StdFs(x) => {
      88         7610 :                 let _ = x.truncate(truncate);
      89         7610 :             }
      90              :             #[cfg(target_os = "linux")]
      91         7638 :             OpenOptions::TokioEpollUring(x) => {
      92         7638 :                 let _ = x.truncate(truncate);
      93         7638 :             }
      94              :         }
      95        15248 :         self
      96        15248 :     }
      97              : 
      98       389133 :     pub(in crate::virtual_file) async fn open(&self, path: &Path) -> std::io::Result<OwnedFd> {
      99       389133 :         match self {
     100       196082 :             OpenOptions::StdFs(x) => x.open(path).map(|file| file.into()),
     101              :             #[cfg(target_os = "linux")]
     102       193051 :             OpenOptions::TokioEpollUring(x) => {
     103       193051 :                 let system = super::io_engine::tokio_epoll_uring_ext::thread_local_system().await;
     104       193051 :                 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       193051 :                 })
     110              :             }
     111              :         }
     112       389133 :     }
     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