aboutsummaryrefslogblamecommitdiff
path: root/src/wal.rs
blob: 1cbe8c1ccc214229b7ec95469597369d44edfefb (plain) (tree)
























































                                                                            




                                                                                                 
                                                                      
                              
                                                                                  


                    

                                               
                                                                                             
                                                                                         
                                         
                                                                

                                                                                               




                                                                                                  




























                                                                                                 
                                                                                       


                                              
                                                                                           


                                                  
                                                






                                                             
                                                                            



                                                                   




                                                                                                       

                                                 

                                                                                  






                                                         
                                                                          
                                            
                                                                                              
         
              

     
                                                           


















                                                                













                                                                                              
                                                                                              





































































                                                                                             

                                      



                                                                                                   
                                                                                 


















                                                                                  
                                             

                                        
              




                                   
                              




                                                                                    

                                                                         

     
                                                          

                                                              
                                                            
                               
                                                                 




                                                    
                                                         
                            
                                                                       
                                                                                  






                                                                                         
                                                                              
                                            
                                                                     


                                                  
                                                                                     


                                            
                                                                                               


                                            
                                                                                               









                                                                                          
                                                                                        



                                               

                                             

                               
                                    


                                                
                           

     
use std::collections::BinaryHeap;

#[repr(u8)]
enum WALRingType {
    #[allow(dead_code)]
    Null = 0x0,
    Full,
    First,
    Middle,
    Last
}

#[repr(packed)]
struct WALRingBlob {
    crc32: u32,
    rsize: u32,
    rtype: WALRingType,
    // payload follows
}

pub type WALBytes = Box<[u8]>;
pub type WALFileId = u64;
pub type WALPos = u64;

#[derive(Eq, PartialEq, Copy, Clone, Debug)]
pub struct WALRingId {
    start: WALPos,
    end: WALPos
}

impl Ord for WALRingId {
    fn cmp(&self, other: &WALRingId) -> std::cmp::Ordering {
        other.start.cmp(&self.start).then_with(|| other.end.cmp(&self.end))
    }
}

impl PartialOrd for WALRingId {
    fn partial_cmp(&self, other: &WALRingId) -> Option<std::cmp::Ordering> {
        Some(self.cmp(other))
    }
}

/// the state for a WAL writer
struct WALState {
    /// the first file id of WAL
    first_fid: WALFileId,
    /// the next position for a record, addressed in the entire WAL space
    next: WALPos,
    /// number of bits for a file
    file_nbit: u64,
}

pub trait WALFile {
    /// Initialize the file space in [offset, offset + length) to zero.
    fn allocate(&self, offset: WALPos, length: usize) -> Result<(), ()>;
    /// Truncate a file to a specified length.
    fn truncate(&self, length: usize) -> Result<(), ()>;
    /// Write data with offset. We assume the actual writes on the storage medium are _strictly
    /// ordered_ the same way as this callback is invoked. We also assume all previous
    /// `allocate/truncate` invocation should be visible if ordered earlier (should be guaranteed
    /// by most OS).  Additionally, the final write caused by each invocation of this function
    /// should be _atomic_ (the entire single write should be all or nothing).
    fn write(&self, offset: WALPos, data: WALBytes) -> Result<(), ()>;
    /// Read data with offset.
    fn read(&self, offset: WALPos, length: usize) -> Result<